diff --git a/Cargo.lock b/Cargo.lock index eb7eb8a2b9..434f743e1d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8900,6 +8900,7 @@ dependencies = [ "assert_matches", "camino", "camino-tempfile", + "chrono", "clap", "dropshot", "expectorate", @@ -8931,6 +8932,7 @@ dependencies = [ "swrite", "tabled", "tokio", + "typed-rng", "uuid", ] diff --git a/dev-tools/reconfigurator-cli/Cargo.toml b/dev-tools/reconfigurator-cli/Cargo.toml index 51cec2cdd9..2aab2c2333 100644 --- a/dev-tools/reconfigurator-cli/Cargo.toml +++ b/dev-tools/reconfigurator-cli/Cargo.toml @@ -14,6 +14,7 @@ omicron-rpaths.workspace = true anyhow.workspace = true assert_matches.workspace = true camino.workspace = true +chrono.workspace = true clap.workspace = true dropshot.workspace = true humantime.workspace = true @@ -33,6 +34,7 @@ slog-error-chain.workspace = true slog.workspace = true swrite.workspace = true tabled.workspace = true +typed-rng.workspace = true uuid.workspace = true omicron-workspace-hack.workspace = true diff --git a/dev-tools/reconfigurator-cli/src/main.rs b/dev-tools/reconfigurator-cli/src/main.rs index 67ae6d802d..4cc7eafcde 100644 --- a/dev-tools/reconfigurator-cli/src/main.rs +++ b/dev-tools/reconfigurator-cli/src/main.rs @@ -6,6 +6,7 @@ use anyhow::{anyhow, bail, Context}; use camino::Utf8PathBuf; +use chrono::Utc; use clap::CommandFactory; use clap::FromArgMatches; use clap::ValueEnum; @@ -15,6 +16,7 @@ use internal_dns_types::diff::DnsDiff; use nexus_inventory::CollectionBuilder; use nexus_reconfigurator_planning::blueprint_builder::BlueprintBuilder; use nexus_reconfigurator_planning::blueprint_builder::EnsureMultiple; +use nexus_reconfigurator_planning::example::ExampleSystemBuilder; use nexus_reconfigurator_planning::planner::Planner; use nexus_reconfigurator_planning::system::{ SledBuilder, SledHwInventory, SystemDescription, @@ -34,6 +36,8 @@ use nexus_types::internal_api::params::DnsConfigParams; use nexus_types::inventory::Collection; use omicron_common::api::external::Generation; use omicron_common::api::external::Name; +use omicron_common::policy::NEXUS_REDUNDANCY; +use omicron_uuid_kinds::CollectionKind; use omicron_uuid_kinds::CollectionUuid; use omicron_uuid_kinds::GenericUuid; use omicron_uuid_kinds::OmicronZoneUuid; @@ -45,6 +49,7 @@ use std::collections::BTreeMap; use std::io::BufRead; use swrite::{swriteln, SWrite}; use tabled::Tabled; +use typed_rng::TypedUuidRng; use uuid::Uuid; /// REPL state @@ -76,6 +81,9 @@ struct ReconfiguratorSim { /// External DNS zone name configured external_dns_zone_name: String, + /// RNG for collection IDs + collection_id_rng: TypedUuidRng, + /// Policy overrides num_nexus: Option, @@ -83,6 +91,57 @@ struct ReconfiguratorSim { } impl ReconfiguratorSim { + fn new(log: slog::Logger) -> Self { + Self { + system: SystemDescription::new(), + collections: IndexMap::new(), + blueprints: IndexMap::new(), + internal_dns: BTreeMap::new(), + external_dns: BTreeMap::new(), + silo_names: vec!["example-silo".parse().unwrap()], + external_dns_zone_name: String::from("oxide.example"), + collection_id_rng: TypedUuidRng::from_entropy(), + num_nexus: None, + log, + } + } + + /// Returns true if the user has made local changes to the simulated + /// system. + /// + /// This is used when the user asks to load an example system. Doing that + /// basically requires a clean slate. + fn user_made_system_changes(&self) -> bool { + // Use this pattern to ensure that if a new field is added to + // ReconfiguratorSim, it will fail to compile until it's added here. + let Self { + system, + collections, + blueprints, + internal_dns, + external_dns, + // For purposes of this method, we let these policy parameters be + // set to any arbitrary value. This lets example systems be + // generated using these values. + silo_names: _, + external_dns_zone_name: _, + collection_id_rng: _, + num_nexus: _, + log: _, + } = self; + + system.has_sleds() + || !collections.is_empty() + || !blueprints.is_empty() + || !internal_dns.is_empty() + || !external_dns.is_empty() + } + + // Reset the state of the REPL. + fn wipe(&mut self) { + *self = Self::new(self.log.clone()); + } + fn blueprint_lookup(&self, id: Uuid) -> Result<&Blueprint, anyhow::Error> { self.blueprints .get(&id) @@ -181,22 +240,12 @@ fn main() -> anyhow::Result<()> { let cmd = CmdReconfiguratorSim::parse(); let log = dropshot::ConfigLogging::StderrTerminal { - level: dropshot::ConfigLoggingLevel::Debug, + level: dropshot::ConfigLoggingLevel::Info, } .to_logger("reconfigurator-sim") .context("creating logger")?; - let mut sim = ReconfiguratorSim { - system: SystemDescription::new(), - collections: IndexMap::new(), - blueprints: IndexMap::new(), - internal_dns: BTreeMap::new(), - external_dns: BTreeMap::new(), - log, - silo_names: vec!["example-silo".parse().unwrap()], - external_dns_zone_name: String::from("oxide.example"), - num_nexus: None, - }; + let mut sim = ReconfiguratorSim::new(log); if let Some(input_file) = cmd.input_file { let file = std::fs::File::open(&input_file) @@ -310,8 +359,10 @@ fn process_entry(sim: &mut ReconfiguratorSim, entry: String) -> LoopResult { Commands::Show => cmd_show(sim), Commands::Set(args) => cmd_set(sim, args), Commands::Load(args) => cmd_load(sim, args), + Commands::LoadExample(args) => cmd_load_example(sim, args), Commands::FileContents(args) => cmd_file_contents(args), Commands::Save(args) => cmd_save(sim, args), + Commands::Wipe => cmd_wipe(sim), }; match cmd_result { @@ -380,8 +431,12 @@ enum Commands { Save(SaveArgs), /// load state from a file Load(LoadArgs), + /// generate and load an example system + LoadExample(LoadExampleArgs), /// show information about what's in a saved file FileContents(FileContentsArgs), + /// reset the state of the REPL + Wipe, } #[derive(Debug, Args)] @@ -511,6 +566,33 @@ struct LoadArgs { collection_id: Option, } +#[derive(Debug, Args)] +struct LoadExampleArgs { + /// Seed for the RNG that's used to generate the example system. + /// + /// Setting this makes it possible for callers to get deterministic + /// results. In automated tests, the seed is typically the name of the + /// test. + #[clap(long, default_value = "reconfigurator_cli_example")] + seed: String, + + /// The number of sleds in the example system. + #[clap(short = 's', long, default_value_t = ExampleSystemBuilder::DEFAULT_N_SLEDS)] + nsleds: usize, + + /// The number of disks per sled in the example system. + #[clap(short = 'd', long, default_value_t = SledBuilder::DEFAULT_NPOOLS)] + ndisks_per_sled: u8, + + /// Do not create zones in the example system. + #[clap(short = 'Z', long)] + no_zones: bool, + + /// Do not create entries for disks in the blueprint. + #[clap(long)] + no_disks_in_blueprint: bool, +} + #[derive(Debug, Args)] struct FileContentsArgs { /// input file @@ -675,7 +757,12 @@ fn cmd_inventory_generate( ) .context("recording Omicron zones")?; } - let inventory = builder.build(); + + let mut inventory = builder.build(); + // Assign collection IDs from the RNG. This enables consistent results when + // callers have explicitly seeded the RNG (e.g., in tests). + inventory.id = sim.collection_id_rng.next(); + let rv = format!( "generated inventory collection {} from configured sleds", inventory.id @@ -848,7 +935,7 @@ fn cmd_blueprint_diff( // Diff'ing DNS is a little trickier. First, compute what DNS should be for // each blueprint. To do that we need to construct a list of sleds suitable // for the executor. - let sleds_by_id = make_sleds_by_id(&sim)?; + let sleds_by_id = make_sleds_by_id(&sim.system)?; let internal_dns_config1 = blueprint_internal_dns_config( &blueprint1, &sleds_by_id, @@ -881,10 +968,9 @@ fn cmd_blueprint_diff( } fn make_sleds_by_id( - sim: &ReconfiguratorSim, + system: &SystemDescription, ) -> Result, anyhow::Error> { - let collection = sim - .system + let collection = system .to_collection_builder() .context( "unexpectedly failed to create collection for current set of sleds", @@ -924,7 +1010,7 @@ fn cmd_blueprint_diff_dns( let blueprint_dns_zone = match dns_group { CliDnsGroup::Internal => { - let sleds_by_id = make_sleds_by_id(sim)?; + let sleds_by_id = make_sleds_by_id(&sim.system)?; blueprint_internal_dns_config( blueprint, &sleds_by_id, @@ -1003,6 +1089,11 @@ fn cmd_save( ))) } +fn cmd_wipe(sim: &mut ReconfiguratorSim) -> anyhow::Result> { + sim.wipe(); + Ok(Some("wiped reconfigurator-sim state".to_string())) +} + fn cmd_show(sim: &mut ReconfiguratorSim) -> anyhow::Result> { let mut s = String::new(); do_print_properties(&mut s, sim); @@ -1275,6 +1366,71 @@ fn cmd_load( Ok(Some(s)) } +fn cmd_load_example( + sim: &mut ReconfiguratorSim, + args: LoadExampleArgs, +) -> anyhow::Result> { + if sim.user_made_system_changes() { + bail!( + "changes made to simulated system: run `wipe system` before \ + loading an example system" + ); + } + + // Generate the example system. + let (example, blueprint) = ExampleSystemBuilder::new(&sim.log, &args.seed) + .nsleds(args.nsleds) + .ndisks_per_sled(args.ndisks_per_sled) + .nexus_count(sim.num_nexus.map_or(NEXUS_REDUNDANCY, |n| n.into())) + .create_zones(!args.no_zones) + .create_disks_in_blueprint(!args.no_disks_in_blueprint) + .build(); + + // Generate the internal and external DNS configs based on the blueprint. + let sleds_by_id = make_sleds_by_id(&example.system)?; + let internal_dns = blueprint_internal_dns_config( + &blueprint, + &sleds_by_id, + &Default::default(), + )?; + let external_dns = blueprint_external_dns_config( + &blueprint, + &sim.silo_names, + sim.external_dns_zone_name.clone(), + ); + + // No more fallible operations from here on out: set the system state. + let collection_id = example.collection.id; + let blueprint_id = blueprint.id; + sim.system = example.system; + sim.collections.insert(collection_id, example.collection); + sim.internal_dns.insert( + blueprint.internal_dns_version, + DnsConfigParams { + generation: blueprint.internal_dns_version.into(), + time_created: Utc::now(), + zones: vec![internal_dns], + }, + ); + sim.external_dns.insert( + blueprint.external_dns_version, + DnsConfigParams { + generation: blueprint.external_dns_version.into(), + time_created: Utc::now(), + zones: vec![external_dns], + }, + ); + sim.blueprints.insert(blueprint.id, blueprint); + sim.collection_id_rng = + TypedUuidRng::from_seed(&args.seed, "reconfigurator-cli"); + + Ok(Some(format!( + "loaded example system with:\n\ + - collection: {collection_id}\n\ + - blueprint: {blueprint_id}", + ))) +} + fn cmd_file_contents(args: FileContentsArgs) -> anyhow::Result> { let loaded = read_file(&args.filename)?; diff --git a/dev-tools/reconfigurator-cli/tests/input/cmds-example.txt b/dev-tools/reconfigurator-cli/tests/input/cmds-example.txt new file mode 100644 index 0000000000..b3143ac016 --- /dev/null +++ b/dev-tools/reconfigurator-cli/tests/input/cmds-example.txt @@ -0,0 +1,26 @@ +load-example --seed test-basic +load-example --seed test-basic + +show + +sled-list +inventory-list +blueprint-list + +sled-show 2eb69596-f081-4e2d-9425-9994926e0832 +blueprint-show ade5749d-bdf3-4fab-a8ae-00bea01b3a5a + +blueprint-diff-inventory 9e187896-7809-46d0-9210-d75be1b3c4d4 ade5749d-bdf3-4fab-a8ae-00bea01b3a5a + +inventory-generate +blueprint-diff-inventory b32394d8-7d79-486f-8657-fd5219508181 ade5749d-bdf3-4fab-a8ae-00bea01b3a5a + +wipe +load-example --seed test-basic --nsleds 1 --ndisks-per-sled 4 --no-zones + +sled-list +inventory-list +blueprint-list + +sled-show 89d02b1b-478c-401a-8e28-7a26f74fa41b +blueprint-show ade5749d-bdf3-4fab-a8ae-00bea01b3a5a diff --git a/dev-tools/reconfigurator-cli/tests/output/cmd-example-stderr b/dev-tools/reconfigurator-cli/tests/output/cmd-example-stderr new file mode 100644 index 0000000000..e69de29bb2 diff --git a/dev-tools/reconfigurator-cli/tests/output/cmd-example-stdout b/dev-tools/reconfigurator-cli/tests/output/cmd-example-stdout new file mode 100644 index 0000000000..a228c13d3e --- /dev/null +++ b/dev-tools/reconfigurator-cli/tests/output/cmd-example-stdout @@ -0,0 +1,529 @@ +> load-example --seed test-basic +loaded example system with: +- collection: 9e187896-7809-46d0-9210-d75be1b3c4d4 +- blueprint: ade5749d-bdf3-4fab-a8ae-00bea01b3a5a + +> load-example --seed test-basic +error: changes made to simulated system: run `wipe system` before loading an example system + +> + +> show +configured external DNS zone name: oxide.example +configured silo names: example-silo +internal DNS generations: 1 +external DNS generations: 1 +target number of Nexus instances: default + + +> + +> sled-list +ID NZPOOLS SUBNET +2eb69596-f081-4e2d-9425-9994926e0832 10 fd00:1122:3344:102::/64 +32d8d836-4d8a-4e54-8fa9-f31d79c42646 10 fd00:1122:3344:103::/64 +89d02b1b-478c-401a-8e28-7a26f74fa41b 10 fd00:1122:3344:101::/64 + +> inventory-list +ID NERRORS TIME_DONE +9e187896-7809-46d0-9210-d75be1b3c4d4 0 + +> blueprint-list +ID PARENT TIME_CREATED +ade5749d-bdf3-4fab-a8ae-00bea01b3a5a 02697f74-b14a-4418-90f0-c28b2a3a6aa9 + +> + +> sled-show 2eb69596-f081-4e2d-9425-9994926e0832 +sled 2eb69596-f081-4e2d-9425-9994926e0832 +subnet fd00:1122:3344:102::/64 +zpools (10): + 088ed702-551e-453b-80d7-57700372a844 (zpool) + ↳ SledDisk { disk_identity: DiskIdentity { vendor: "fake-vendor", model: "fake-model", serial: "serial-088ed702-551e-453b-80d7-57700372a844" }, disk_id: b2850ccb-4ac7-4034-aeab-b1cd582d407b (physical_disk), policy: InService, state: Active } + 09e51697-abad-47c0-a193-eaf74bc5d3cd (zpool) + ↳ SledDisk { disk_identity: DiskIdentity { vendor: "fake-vendor", model: "fake-model", serial: "serial-09e51697-abad-47c0-a193-eaf74bc5d3cd" }, disk_id: c6d1fe0d-5226-4318-a55a-e86e20612277 (physical_disk), policy: InService, state: Active } + 3a512d49-edbe-47f3-8d0b-6051bfdc4044 (zpool) + ↳ SledDisk { disk_identity: DiskIdentity { vendor: "fake-vendor", model: "fake-model", serial: "serial-3a512d49-edbe-47f3-8d0b-6051bfdc4044" }, disk_id: 24510d37-20b1-4bdc-9ca7-c37fff39abb2 (physical_disk), policy: InService, state: Active } + 40517680-aa77-413c-bcf4-b9041dcf6612 (zpool) + ↳ SledDisk { disk_identity: DiskIdentity { vendor: "fake-vendor", model: "fake-model", serial: "serial-40517680-aa77-413c-bcf4-b9041dcf6612" }, disk_id: 30ed317f-1717-4df6-8c1c-69f9d438705e (physical_disk), policy: InService, state: Active } + 78d3cb96-9295-4644-bf78-2e32191c71f9 (zpool) + ↳ SledDisk { disk_identity: DiskIdentity { vendor: "fake-vendor", model: "fake-model", serial: "serial-78d3cb96-9295-4644-bf78-2e32191c71f9" }, disk_id: 5ac39660-8149-48a2-a6df-aebb0f30352a (physical_disk), policy: InService, state: Active } + 853595e7-77da-404e-bc35-aba77478d55c (zpool) + ↳ SledDisk { disk_identity: DiskIdentity { vendor: "fake-vendor", model: "fake-model", serial: "serial-853595e7-77da-404e-bc35-aba77478d55c" }, disk_id: 43083372-c7d0-4df3-ac4e-96c45cde28d9 (physical_disk), policy: InService, state: Active } + 8926e0e7-65d9-4e2e-ac6d-f1298af81ef1 (zpool) + ↳ SledDisk { disk_identity: DiskIdentity { vendor: "fake-vendor", model: "fake-model", serial: "serial-8926e0e7-65d9-4e2e-ac6d-f1298af81ef1" }, disk_id: 13e65865-2a6e-41f7-aa18-6ef8dff59b4e (physical_disk), policy: InService, state: Active } + 9c0b9151-17f3-4857-94cc-b5bfcd402326 (zpool) + ↳ SledDisk { disk_identity: DiskIdentity { vendor: "fake-vendor", model: "fake-model", serial: "serial-9c0b9151-17f3-4857-94cc-b5bfcd402326" }, disk_id: 40383e60-18f6-4423-94e7-7b91ce939b43 (physical_disk), policy: InService, state: Active } + d61354fa-48d2-47c6-90bf-546e3ed1708b (zpool) + ↳ SledDisk { disk_identity: DiskIdentity { vendor: "fake-vendor", model: "fake-model", serial: "serial-d61354fa-48d2-47c6-90bf-546e3ed1708b" }, disk_id: e02ae523-7b66-4188-93c8-c5808c01c795 (physical_disk), policy: InService, state: Active } + d792c8cb-7490-40cb-bb1c-d4917242edf4 (zpool) + ↳ SledDisk { disk_identity: DiskIdentity { vendor: "fake-vendor", model: "fake-model", serial: "serial-d792c8cb-7490-40cb-bb1c-d4917242edf4" }, disk_id: c19e5610-a3a2-4cc6-af4d-517a49ef610b (physical_disk), policy: InService, state: Active } + + +> blueprint-show ade5749d-bdf3-4fab-a8ae-00bea01b3a5a +blueprint ade5749d-bdf3-4fab-a8ae-00bea01b3a5a +parent: 02697f74-b14a-4418-90f0-c28b2a3a6aa9 + + sled: 2eb69596-f081-4e2d-9425-9994926e0832 (active) + + physical disks at generation 1: + ---------------------------------------------------------------------- + vendor model serial + ---------------------------------------------------------------------- + fake-vendor fake-model serial-088ed702-551e-453b-80d7-57700372a844 + fake-vendor fake-model serial-09e51697-abad-47c0-a193-eaf74bc5d3cd + fake-vendor fake-model serial-3a512d49-edbe-47f3-8d0b-6051bfdc4044 + fake-vendor fake-model serial-40517680-aa77-413c-bcf4-b9041dcf6612 + fake-vendor fake-model serial-78d3cb96-9295-4644-bf78-2e32191c71f9 + fake-vendor fake-model serial-853595e7-77da-404e-bc35-aba77478d55c + fake-vendor fake-model serial-8926e0e7-65d9-4e2e-ac6d-f1298af81ef1 + fake-vendor fake-model serial-9c0b9151-17f3-4857-94cc-b5bfcd402326 + fake-vendor fake-model serial-d61354fa-48d2-47c6-90bf-546e3ed1708b + fake-vendor fake-model serial-d792c8cb-7490-40cb-bb1c-d4917242edf4 + + + omicron zones at generation 2: + ------------------------------------------------------------------------------------------ + zone type zone id disposition underlay IP + ------------------------------------------------------------------------------------------ + clickhouse fe79023f-c5d5-4be5-ad2c-da4e9e9237e4 in service fd00:1122:3344:102::23 + crucible 054f64a5-182c-4c28-8994-d2e082550201 in service fd00:1122:3344:102::26 + crucible 3b5bffea-e5ed-44df-8468-fd4fa69757d8 in service fd00:1122:3344:102::27 + crucible 53dd7fa4-899e-49ed-9fc2-48222db3e20d in service fd00:1122:3344:102::2a + crucible 7db307d4-a6ed-4c47-bddf-6759161bf64a in service fd00:1122:3344:102::2c + crucible 95ad9a1d-4063-4874-974c-2fc92830be27 in service fd00:1122:3344:102::29 + crucible bc095417-e2f0-4e95-b390-9cc3fc6e3c6d in service fd00:1122:3344:102::28 + crucible d90401f1-fbc2-42cb-bf17-309ee0f922fe in service fd00:1122:3344:102::2b + crucible e8f994c0-0a1b-40e6-8db1-40a8ca89e503 in service fd00:1122:3344:102::2d + crucible eaec16c0-0d44-4847-b2d6-31a5151bae52 in service fd00:1122:3344:102::24 + crucible f97aa057-6485-45d0-9cb4-4af5b0831d48 in service fd00:1122:3344:102::25 + internal_dns 8b8f7c02-7a18-4268-b045-2e286b464c5d in service fd00:1122:3344:1::1 + internal_ntp c67dd9a4-0d6c-4e9f-b28d-20003f211f7d in service fd00:1122:3344:102::21 + nexus 94b45ce9-d3d8-413a-a76b-865da1f67930 in service fd00:1122:3344:102::22 + + + + sled: 32d8d836-4d8a-4e54-8fa9-f31d79c42646 (active) + + physical disks at generation 1: + ---------------------------------------------------------------------- + vendor model serial + ---------------------------------------------------------------------- + fake-vendor fake-model serial-128b0f04-229b-48dc-9c5c-555cb5723ed8 + fake-vendor fake-model serial-43ae0f4e-b0cf-4d74-8636-df0567ba01e6 + fake-vendor fake-model serial-4e9806d0-41cd-48c2-86ef-7f815c3ce3b1 + fake-vendor fake-model serial-70bb6d98-111f-4015-9d97-9ef1b2d6dcac + fake-vendor fake-model serial-7ce5029f-703c-4c08-8164-9af9cf1acf23 + fake-vendor fake-model serial-b113c11f-44e6-4fb4-a56e-1d91bd652faf + fake-vendor fake-model serial-bf149c80-2498-481c-9989-6344da914081 + fake-vendor fake-model serial-c69b6237-09f9-45aa-962c-5dbdd1d894be + fake-vendor fake-model serial-ccd5a87b-00ae-42ad-85da-b37d70436cb1 + fake-vendor fake-model serial-d7410a1c-e01d-49a4-be9c-f861f086760a + + + omicron zones at generation 2: + ------------------------------------------------------------------------------------------ + zone type zone id disposition underlay IP + ------------------------------------------------------------------------------------------ + crucible 728db429-8621-4e1e-9915-282aadfa27d1 in service fd00:1122:3344:103::24 + crucible a999e5fa-3edc-4dac-919a-d7b554cdae58 in service fd00:1122:3344:103::27 + crucible b416f299-c23c-46c8-9820-be2b66ffea0a in service fd00:1122:3344:103::28 + crucible b5d5491d-b3aa-4727-8b55-f66e0581ea4f in service fd00:1122:3344:103::2c + crucible cc1dc86d-bd6f-4929-aa4a-9619012e9393 in service fd00:1122:3344:103::25 + crucible cd3bb540-e605-465f-8c62-177ac482d850 in service fd00:1122:3344:103::2a + crucible e7dd3e98-7fe7-4827-be7f-395ff9a5f542 in service fd00:1122:3344:103::23 + crucible e8971ab3-fb7d-4ad8-aae3-7f2fe87c51f3 in service fd00:1122:3344:103::26 + crucible f52aa245-7e1b-46c0-8a31-e09725f02caf in service fd00:1122:3344:103::2b + crucible fae49024-6cec-444d-a6c4-83658ab015a4 in service fd00:1122:3344:103::29 + internal_dns c8aa84a5-a802-46c9-adcd-d61e9c8393c9 in service fd00:1122:3344:2::1 + internal_ntp e9bf481e-323e-466e-842f-8107078c7137 in service fd00:1122:3344:103::21 + nexus 4f2eb088-7d28-4c4e-a27c-746400ec65ba in service fd00:1122:3344:103::22 + + + + sled: 89d02b1b-478c-401a-8e28-7a26f74fa41b (active) + + physical disks at generation 1: + ---------------------------------------------------------------------- + vendor model serial + ---------------------------------------------------------------------- + fake-vendor fake-model serial-44fa7024-c2bc-4d2c-b478-c4997e4aece8 + fake-vendor fake-model serial-5265edc6-debf-4687-a758-a9746893ebd3 + fake-vendor fake-model serial-532fbd69-b472-4445-86af-4c4c85afb313 + fake-vendor fake-model serial-54fd6fa6-ce3c-4abe-8c9d-7e107e159e84 + fake-vendor fake-model serial-8562317c-4736-4cfc-9292-7dcab96a6fee + fake-vendor fake-model serial-9a1327e4-d11b-4d98-8454-8c41862e9832 + fake-vendor fake-model serial-bf9d6692-64bc-459a-87dd-e7a83080a210 + fake-vendor fake-model serial-ce1c13f3-bef2-4306-b0f2-4e39bd4a18b6 + fake-vendor fake-model serial-f931ec80-a3e3-4adb-a8ba-fa5adbd2294c + fake-vendor fake-model serial-fe1d5b9f-8db7-4e2d-bf17-c4b80e1f897c + + + omicron zones at generation 2: + ------------------------------------------------------------------------------------------ + zone type zone id disposition underlay IP + ------------------------------------------------------------------------------------------ + crucible 315a3670-d019-425c-b7a6-c9429428b671 in service fd00:1122:3344:101::25 + crucible 413d3e02-e19f-400a-9718-a662347538f0 in service fd00:1122:3344:101::26 + crucible 6cb330f9-4609-4d6c-98ad-b5cc34245813 in service fd00:1122:3344:101::2b + crucible 6d725df0-0189-4429-b270-3eeb891d39c8 in service fd00:1122:3344:101::2a + crucible 8b47e1e8-0396-4e44-a4a5-ea891405c9f2 in service fd00:1122:3344:101::24 + crucible b43ce109-90d6-46f9-9df0-8c68bfe6d4a0 in service fd00:1122:3344:101::23 + crucible b5443ebd-1f5b-448c-8edc-b4ca25c25db1 in service fd00:1122:3344:101::27 + crucible bb55534c-1042-4af4-ad2f-9590803695ac in service fd00:1122:3344:101::29 + crucible e135441d-637e-4de9-8023-5ea0096347f3 in service fd00:1122:3344:101::28 + crucible fee71ee6-da42-4a7f-a00e-f56b6a3327ce in service fd00:1122:3344:101::2c + internal_dns cbe91cdc-cbb6-4760-aece-6ce08b67e85a in service fd00:1122:3344:3::1 + internal_ntp 09937ebb-bb6a-495b-bc97-b58076b70a78 in service fd00:1122:3344:101::21 + nexus f3628f0a-2301-4fc8-bcbf-961199771731 in service fd00:1122:3344:101::22 + + + COCKROACHDB SETTINGS: + state fingerprint::::::::::::::::: (none) + cluster.preserve_downgrade_option: (do not modify) + + METADATA: + created by::::::::::: test suite + created at::::::::::: + comment:::::::::::::: (none) + internal DNS version: 1 + external DNS version: 1 + + + +> + +> blueprint-diff-inventory 9e187896-7809-46d0-9210-d75be1b3c4d4 ade5749d-bdf3-4fab-a8ae-00bea01b3a5a +from: collection 9e187896-7809-46d0-9210-d75be1b3c4d4 +to: blueprint ade5749d-bdf3-4fab-a8ae-00bea01b3a5a + UNCHANGED SLEDS: + + sled 2eb69596-f081-4e2d-9425-9994926e0832 (active): + + physical disks at generation 1: + ---------------------------------------------------------------------- + vendor model serial + ---------------------------------------------------------------------- + fake-vendor fake-model serial-088ed702-551e-453b-80d7-57700372a844 + fake-vendor fake-model serial-09e51697-abad-47c0-a193-eaf74bc5d3cd + fake-vendor fake-model serial-3a512d49-edbe-47f3-8d0b-6051bfdc4044 + fake-vendor fake-model serial-40517680-aa77-413c-bcf4-b9041dcf6612 + fake-vendor fake-model serial-78d3cb96-9295-4644-bf78-2e32191c71f9 + fake-vendor fake-model serial-853595e7-77da-404e-bc35-aba77478d55c + fake-vendor fake-model serial-8926e0e7-65d9-4e2e-ac6d-f1298af81ef1 + fake-vendor fake-model serial-9c0b9151-17f3-4857-94cc-b5bfcd402326 + fake-vendor fake-model serial-d61354fa-48d2-47c6-90bf-546e3ed1708b + fake-vendor fake-model serial-d792c8cb-7490-40cb-bb1c-d4917242edf4 + + + omicron zones at generation 2: + ------------------------------------------------------------------------------------------ + zone type zone id disposition underlay IP + ------------------------------------------------------------------------------------------ + clickhouse fe79023f-c5d5-4be5-ad2c-da4e9e9237e4 in service fd00:1122:3344:102::23 + crucible 054f64a5-182c-4c28-8994-d2e082550201 in service fd00:1122:3344:102::26 + crucible 3b5bffea-e5ed-44df-8468-fd4fa69757d8 in service fd00:1122:3344:102::27 + crucible 53dd7fa4-899e-49ed-9fc2-48222db3e20d in service fd00:1122:3344:102::2a + crucible 7db307d4-a6ed-4c47-bddf-6759161bf64a in service fd00:1122:3344:102::2c + crucible 95ad9a1d-4063-4874-974c-2fc92830be27 in service fd00:1122:3344:102::29 + crucible bc095417-e2f0-4e95-b390-9cc3fc6e3c6d in service fd00:1122:3344:102::28 + crucible d90401f1-fbc2-42cb-bf17-309ee0f922fe in service fd00:1122:3344:102::2b + crucible e8f994c0-0a1b-40e6-8db1-40a8ca89e503 in service fd00:1122:3344:102::2d + crucible eaec16c0-0d44-4847-b2d6-31a5151bae52 in service fd00:1122:3344:102::24 + crucible f97aa057-6485-45d0-9cb4-4af5b0831d48 in service fd00:1122:3344:102::25 + internal_dns 8b8f7c02-7a18-4268-b045-2e286b464c5d in service fd00:1122:3344:1::1 + internal_ntp c67dd9a4-0d6c-4e9f-b28d-20003f211f7d in service fd00:1122:3344:102::21 + nexus 94b45ce9-d3d8-413a-a76b-865da1f67930 in service fd00:1122:3344:102::22 + + + sled 32d8d836-4d8a-4e54-8fa9-f31d79c42646 (active): + + physical disks at generation 1: + ---------------------------------------------------------------------- + vendor model serial + ---------------------------------------------------------------------- + fake-vendor fake-model serial-128b0f04-229b-48dc-9c5c-555cb5723ed8 + fake-vendor fake-model serial-43ae0f4e-b0cf-4d74-8636-df0567ba01e6 + fake-vendor fake-model serial-4e9806d0-41cd-48c2-86ef-7f815c3ce3b1 + fake-vendor fake-model serial-70bb6d98-111f-4015-9d97-9ef1b2d6dcac + fake-vendor fake-model serial-7ce5029f-703c-4c08-8164-9af9cf1acf23 + fake-vendor fake-model serial-b113c11f-44e6-4fb4-a56e-1d91bd652faf + fake-vendor fake-model serial-bf149c80-2498-481c-9989-6344da914081 + fake-vendor fake-model serial-c69b6237-09f9-45aa-962c-5dbdd1d894be + fake-vendor fake-model serial-ccd5a87b-00ae-42ad-85da-b37d70436cb1 + fake-vendor fake-model serial-d7410a1c-e01d-49a4-be9c-f861f086760a + + + omicron zones at generation 2: + ------------------------------------------------------------------------------------------ + zone type zone id disposition underlay IP + ------------------------------------------------------------------------------------------ + crucible 728db429-8621-4e1e-9915-282aadfa27d1 in service fd00:1122:3344:103::24 + crucible a999e5fa-3edc-4dac-919a-d7b554cdae58 in service fd00:1122:3344:103::27 + crucible b416f299-c23c-46c8-9820-be2b66ffea0a in service fd00:1122:3344:103::28 + crucible b5d5491d-b3aa-4727-8b55-f66e0581ea4f in service fd00:1122:3344:103::2c + crucible cc1dc86d-bd6f-4929-aa4a-9619012e9393 in service fd00:1122:3344:103::25 + crucible cd3bb540-e605-465f-8c62-177ac482d850 in service fd00:1122:3344:103::2a + crucible e7dd3e98-7fe7-4827-be7f-395ff9a5f542 in service fd00:1122:3344:103::23 + crucible e8971ab3-fb7d-4ad8-aae3-7f2fe87c51f3 in service fd00:1122:3344:103::26 + crucible f52aa245-7e1b-46c0-8a31-e09725f02caf in service fd00:1122:3344:103::2b + crucible fae49024-6cec-444d-a6c4-83658ab015a4 in service fd00:1122:3344:103::29 + internal_dns c8aa84a5-a802-46c9-adcd-d61e9c8393c9 in service fd00:1122:3344:2::1 + internal_ntp e9bf481e-323e-466e-842f-8107078c7137 in service fd00:1122:3344:103::21 + nexus 4f2eb088-7d28-4c4e-a27c-746400ec65ba in service fd00:1122:3344:103::22 + + + sled 89d02b1b-478c-401a-8e28-7a26f74fa41b (active): + + physical disks at generation 1: + ---------------------------------------------------------------------- + vendor model serial + ---------------------------------------------------------------------- + fake-vendor fake-model serial-44fa7024-c2bc-4d2c-b478-c4997e4aece8 + fake-vendor fake-model serial-5265edc6-debf-4687-a758-a9746893ebd3 + fake-vendor fake-model serial-532fbd69-b472-4445-86af-4c4c85afb313 + fake-vendor fake-model serial-54fd6fa6-ce3c-4abe-8c9d-7e107e159e84 + fake-vendor fake-model serial-8562317c-4736-4cfc-9292-7dcab96a6fee + fake-vendor fake-model serial-9a1327e4-d11b-4d98-8454-8c41862e9832 + fake-vendor fake-model serial-bf9d6692-64bc-459a-87dd-e7a83080a210 + fake-vendor fake-model serial-ce1c13f3-bef2-4306-b0f2-4e39bd4a18b6 + fake-vendor fake-model serial-f931ec80-a3e3-4adb-a8ba-fa5adbd2294c + fake-vendor fake-model serial-fe1d5b9f-8db7-4e2d-bf17-c4b80e1f897c + + + omicron zones at generation 2: + ------------------------------------------------------------------------------------------ + zone type zone id disposition underlay IP + ------------------------------------------------------------------------------------------ + crucible 315a3670-d019-425c-b7a6-c9429428b671 in service fd00:1122:3344:101::25 + crucible 413d3e02-e19f-400a-9718-a662347538f0 in service fd00:1122:3344:101::26 + crucible 6cb330f9-4609-4d6c-98ad-b5cc34245813 in service fd00:1122:3344:101::2b + crucible 6d725df0-0189-4429-b270-3eeb891d39c8 in service fd00:1122:3344:101::2a + crucible 8b47e1e8-0396-4e44-a4a5-ea891405c9f2 in service fd00:1122:3344:101::24 + crucible b43ce109-90d6-46f9-9df0-8c68bfe6d4a0 in service fd00:1122:3344:101::23 + crucible b5443ebd-1f5b-448c-8edc-b4ca25c25db1 in service fd00:1122:3344:101::27 + crucible bb55534c-1042-4af4-ad2f-9590803695ac in service fd00:1122:3344:101::29 + crucible e135441d-637e-4de9-8023-5ea0096347f3 in service fd00:1122:3344:101::28 + crucible fee71ee6-da42-4a7f-a00e-f56b6a3327ce in service fd00:1122:3344:101::2c + internal_dns cbe91cdc-cbb6-4760-aece-6ce08b67e85a in service fd00:1122:3344:3::1 + internal_ntp 09937ebb-bb6a-495b-bc97-b58076b70a78 in service fd00:1122:3344:101::21 + nexus f3628f0a-2301-4fc8-bcbf-961199771731 in service fd00:1122:3344:101::22 + + + COCKROACHDB SETTINGS: ++ state fingerprint::::::::::::::::: (not present in collection) -> (none) ++ cluster.preserve_downgrade_option: (not present in collection) -> (do not modify) + + METADATA: ++ internal DNS version: (not present in collection) -> 1 ++ external DNS version: (not present in collection) -> 1 + + + +> + +> inventory-generate +generated inventory collection b32394d8-7d79-486f-8657-fd5219508181 from configured sleds + +> blueprint-diff-inventory b32394d8-7d79-486f-8657-fd5219508181 ade5749d-bdf3-4fab-a8ae-00bea01b3a5a +from: collection b32394d8-7d79-486f-8657-fd5219508181 +to: blueprint ade5749d-bdf3-4fab-a8ae-00bea01b3a5a + MODIFIED SLEDS: + + sled 2eb69596-f081-4e2d-9425-9994926e0832 (active): + + physical disks at generation 1: + ---------------------------------------------------------------------- + vendor model serial + ---------------------------------------------------------------------- + fake-vendor fake-model serial-088ed702-551e-453b-80d7-57700372a844 + fake-vendor fake-model serial-09e51697-abad-47c0-a193-eaf74bc5d3cd + fake-vendor fake-model serial-3a512d49-edbe-47f3-8d0b-6051bfdc4044 + fake-vendor fake-model serial-40517680-aa77-413c-bcf4-b9041dcf6612 + fake-vendor fake-model serial-78d3cb96-9295-4644-bf78-2e32191c71f9 + fake-vendor fake-model serial-853595e7-77da-404e-bc35-aba77478d55c + fake-vendor fake-model serial-8926e0e7-65d9-4e2e-ac6d-f1298af81ef1 + fake-vendor fake-model serial-9c0b9151-17f3-4857-94cc-b5bfcd402326 + fake-vendor fake-model serial-d61354fa-48d2-47c6-90bf-546e3ed1708b + fake-vendor fake-model serial-d792c8cb-7490-40cb-bb1c-d4917242edf4 + + + omicron zones generation 1 -> 2: + ------------------------------------------------------------------------------------------ + zone type zone id disposition underlay IP + ------------------------------------------------------------------------------------------ ++ clickhouse fe79023f-c5d5-4be5-ad2c-da4e9e9237e4 in service fd00:1122:3344:102::23 ++ crucible 054f64a5-182c-4c28-8994-d2e082550201 in service fd00:1122:3344:102::26 ++ crucible 3b5bffea-e5ed-44df-8468-fd4fa69757d8 in service fd00:1122:3344:102::27 ++ crucible 53dd7fa4-899e-49ed-9fc2-48222db3e20d in service fd00:1122:3344:102::2a ++ crucible 7db307d4-a6ed-4c47-bddf-6759161bf64a in service fd00:1122:3344:102::2c ++ crucible 95ad9a1d-4063-4874-974c-2fc92830be27 in service fd00:1122:3344:102::29 ++ crucible bc095417-e2f0-4e95-b390-9cc3fc6e3c6d in service fd00:1122:3344:102::28 ++ crucible d90401f1-fbc2-42cb-bf17-309ee0f922fe in service fd00:1122:3344:102::2b ++ crucible e8f994c0-0a1b-40e6-8db1-40a8ca89e503 in service fd00:1122:3344:102::2d ++ crucible eaec16c0-0d44-4847-b2d6-31a5151bae52 in service fd00:1122:3344:102::24 ++ crucible f97aa057-6485-45d0-9cb4-4af5b0831d48 in service fd00:1122:3344:102::25 ++ internal_dns 8b8f7c02-7a18-4268-b045-2e286b464c5d in service fd00:1122:3344:1::1 ++ internal_ntp c67dd9a4-0d6c-4e9f-b28d-20003f211f7d in service fd00:1122:3344:102::21 ++ nexus 94b45ce9-d3d8-413a-a76b-865da1f67930 in service fd00:1122:3344:102::22 + + + sled 32d8d836-4d8a-4e54-8fa9-f31d79c42646 (active): + + physical disks at generation 1: + ---------------------------------------------------------------------- + vendor model serial + ---------------------------------------------------------------------- + fake-vendor fake-model serial-128b0f04-229b-48dc-9c5c-555cb5723ed8 + fake-vendor fake-model serial-43ae0f4e-b0cf-4d74-8636-df0567ba01e6 + fake-vendor fake-model serial-4e9806d0-41cd-48c2-86ef-7f815c3ce3b1 + fake-vendor fake-model serial-70bb6d98-111f-4015-9d97-9ef1b2d6dcac + fake-vendor fake-model serial-7ce5029f-703c-4c08-8164-9af9cf1acf23 + fake-vendor fake-model serial-b113c11f-44e6-4fb4-a56e-1d91bd652faf + fake-vendor fake-model serial-bf149c80-2498-481c-9989-6344da914081 + fake-vendor fake-model serial-c69b6237-09f9-45aa-962c-5dbdd1d894be + fake-vendor fake-model serial-ccd5a87b-00ae-42ad-85da-b37d70436cb1 + fake-vendor fake-model serial-d7410a1c-e01d-49a4-be9c-f861f086760a + + + omicron zones generation 1 -> 2: + ------------------------------------------------------------------------------------------ + zone type zone id disposition underlay IP + ------------------------------------------------------------------------------------------ ++ crucible 728db429-8621-4e1e-9915-282aadfa27d1 in service fd00:1122:3344:103::24 ++ crucible a999e5fa-3edc-4dac-919a-d7b554cdae58 in service fd00:1122:3344:103::27 ++ crucible b416f299-c23c-46c8-9820-be2b66ffea0a in service fd00:1122:3344:103::28 ++ crucible b5d5491d-b3aa-4727-8b55-f66e0581ea4f in service fd00:1122:3344:103::2c ++ crucible cc1dc86d-bd6f-4929-aa4a-9619012e9393 in service fd00:1122:3344:103::25 ++ crucible cd3bb540-e605-465f-8c62-177ac482d850 in service fd00:1122:3344:103::2a ++ crucible e7dd3e98-7fe7-4827-be7f-395ff9a5f542 in service fd00:1122:3344:103::23 ++ crucible e8971ab3-fb7d-4ad8-aae3-7f2fe87c51f3 in service fd00:1122:3344:103::26 ++ crucible f52aa245-7e1b-46c0-8a31-e09725f02caf in service fd00:1122:3344:103::2b ++ crucible fae49024-6cec-444d-a6c4-83658ab015a4 in service fd00:1122:3344:103::29 ++ internal_dns c8aa84a5-a802-46c9-adcd-d61e9c8393c9 in service fd00:1122:3344:2::1 ++ internal_ntp e9bf481e-323e-466e-842f-8107078c7137 in service fd00:1122:3344:103::21 ++ nexus 4f2eb088-7d28-4c4e-a27c-746400ec65ba in service fd00:1122:3344:103::22 + + + sled 89d02b1b-478c-401a-8e28-7a26f74fa41b (active): + + physical disks at generation 1: + ---------------------------------------------------------------------- + vendor model serial + ---------------------------------------------------------------------- + fake-vendor fake-model serial-44fa7024-c2bc-4d2c-b478-c4997e4aece8 + fake-vendor fake-model serial-5265edc6-debf-4687-a758-a9746893ebd3 + fake-vendor fake-model serial-532fbd69-b472-4445-86af-4c4c85afb313 + fake-vendor fake-model serial-54fd6fa6-ce3c-4abe-8c9d-7e107e159e84 + fake-vendor fake-model serial-8562317c-4736-4cfc-9292-7dcab96a6fee + fake-vendor fake-model serial-9a1327e4-d11b-4d98-8454-8c41862e9832 + fake-vendor fake-model serial-bf9d6692-64bc-459a-87dd-e7a83080a210 + fake-vendor fake-model serial-ce1c13f3-bef2-4306-b0f2-4e39bd4a18b6 + fake-vendor fake-model serial-f931ec80-a3e3-4adb-a8ba-fa5adbd2294c + fake-vendor fake-model serial-fe1d5b9f-8db7-4e2d-bf17-c4b80e1f897c + + + omicron zones generation 1 -> 2: + ------------------------------------------------------------------------------------------ + zone type zone id disposition underlay IP + ------------------------------------------------------------------------------------------ ++ crucible 315a3670-d019-425c-b7a6-c9429428b671 in service fd00:1122:3344:101::25 ++ crucible 413d3e02-e19f-400a-9718-a662347538f0 in service fd00:1122:3344:101::26 ++ crucible 6cb330f9-4609-4d6c-98ad-b5cc34245813 in service fd00:1122:3344:101::2b ++ crucible 6d725df0-0189-4429-b270-3eeb891d39c8 in service fd00:1122:3344:101::2a ++ crucible 8b47e1e8-0396-4e44-a4a5-ea891405c9f2 in service fd00:1122:3344:101::24 ++ crucible b43ce109-90d6-46f9-9df0-8c68bfe6d4a0 in service fd00:1122:3344:101::23 ++ crucible b5443ebd-1f5b-448c-8edc-b4ca25c25db1 in service fd00:1122:3344:101::27 ++ crucible bb55534c-1042-4af4-ad2f-9590803695ac in service fd00:1122:3344:101::29 ++ crucible e135441d-637e-4de9-8023-5ea0096347f3 in service fd00:1122:3344:101::28 ++ crucible fee71ee6-da42-4a7f-a00e-f56b6a3327ce in service fd00:1122:3344:101::2c ++ internal_dns cbe91cdc-cbb6-4760-aece-6ce08b67e85a in service fd00:1122:3344:3::1 ++ internal_ntp 09937ebb-bb6a-495b-bc97-b58076b70a78 in service fd00:1122:3344:101::21 ++ nexus f3628f0a-2301-4fc8-bcbf-961199771731 in service fd00:1122:3344:101::22 + + + COCKROACHDB SETTINGS: ++ state fingerprint::::::::::::::::: (not present in collection) -> (none) ++ cluster.preserve_downgrade_option: (not present in collection) -> (do not modify) + + METADATA: ++ internal DNS version: (not present in collection) -> 1 ++ external DNS version: (not present in collection) -> 1 + + + +> + +> wipe +wiped reconfigurator-sim state + +> load-example --seed test-basic --nsleds 1 --ndisks-per-sled 4 --no-zones +loaded example system with: +- collection: 9e187896-7809-46d0-9210-d75be1b3c4d4 +- blueprint: ade5749d-bdf3-4fab-a8ae-00bea01b3a5a + +> + +> sled-list +ID NZPOOLS SUBNET +89d02b1b-478c-401a-8e28-7a26f74fa41b 4 fd00:1122:3344:101::/64 + +> inventory-list +ID NERRORS TIME_DONE +9e187896-7809-46d0-9210-d75be1b3c4d4 0 + +> blueprint-list +ID PARENT TIME_CREATED +ade5749d-bdf3-4fab-a8ae-00bea01b3a5a 02697f74-b14a-4418-90f0-c28b2a3a6aa9 + +> + +> sled-show 89d02b1b-478c-401a-8e28-7a26f74fa41b +sled 89d02b1b-478c-401a-8e28-7a26f74fa41b +subnet fd00:1122:3344:101::/64 +zpools (4): + 44fa7024-c2bc-4d2c-b478-c4997e4aece8 (zpool) + ↳ SledDisk { disk_identity: DiskIdentity { vendor: "fake-vendor", model: "fake-model", serial: "serial-44fa7024-c2bc-4d2c-b478-c4997e4aece8" }, disk_id: 2a15b33c-dd0e-45b7-aba9-d05f40f030ff (physical_disk), policy: InService, state: Active } + 8562317c-4736-4cfc-9292-7dcab96a6fee (zpool) + ↳ SledDisk { disk_identity: DiskIdentity { vendor: "fake-vendor", model: "fake-model", serial: "serial-8562317c-4736-4cfc-9292-7dcab96a6fee" }, disk_id: cad6faa6-9409-4496-9aeb-392b3c50bed4 (physical_disk), policy: InService, state: Active } + ce1c13f3-bef2-4306-b0f2-4e39bd4a18b6 (zpool) + ↳ SledDisk { disk_identity: DiskIdentity { vendor: "fake-vendor", model: "fake-model", serial: "serial-ce1c13f3-bef2-4306-b0f2-4e39bd4a18b6" }, disk_id: 7d89a66e-0dcd-47ab-824d-62186812b8bd (physical_disk), policy: InService, state: Active } + f931ec80-a3e3-4adb-a8ba-fa5adbd2294c (zpool) + ↳ SledDisk { disk_identity: DiskIdentity { vendor: "fake-vendor", model: "fake-model", serial: "serial-f931ec80-a3e3-4adb-a8ba-fa5adbd2294c" }, disk_id: 41755be9-2c77-4deb-87a4-cb53f09263fa (physical_disk), policy: InService, state: Active } + + +> blueprint-show ade5749d-bdf3-4fab-a8ae-00bea01b3a5a +blueprint ade5749d-bdf3-4fab-a8ae-00bea01b3a5a +parent: 02697f74-b14a-4418-90f0-c28b2a3a6aa9 + + sled: 89d02b1b-478c-401a-8e28-7a26f74fa41b (active) + + physical disks at generation 1: + ---------------------------------------------------------------------- + vendor model serial + ---------------------------------------------------------------------- + fake-vendor fake-model serial-44fa7024-c2bc-4d2c-b478-c4997e4aece8 + fake-vendor fake-model serial-8562317c-4736-4cfc-9292-7dcab96a6fee + fake-vendor fake-model serial-ce1c13f3-bef2-4306-b0f2-4e39bd4a18b6 + fake-vendor fake-model serial-f931ec80-a3e3-4adb-a8ba-fa5adbd2294c + + + omicron zones at generation 1: + ----------------------------------------------- + zone type zone id disposition underlay IP + ----------------------------------------------- + + + COCKROACHDB SETTINGS: + state fingerprint::::::::::::::::: (none) + cluster.preserve_downgrade_option: (do not modify) + + METADATA: + created by::::::::::: test suite + created at::::::::::: + comment:::::::::::::: (none) + internal DNS version: 1 + external DNS version: 1 + + + diff --git a/dev-tools/reconfigurator-cli/tests/test_basic.rs b/dev-tools/reconfigurator-cli/tests/test_basic.rs index c0f52e72de..d451996e0b 100644 --- a/dev-tools/reconfigurator-cli/tests/test_basic.rs +++ b/dev-tools/reconfigurator-cli/tests/test_basic.rs @@ -48,6 +48,21 @@ fn test_basic() { assert_contents("tests/output/cmd-stderr", &stderr_text); } +// Run tests against a loaded example system. +#[test] +fn test_example() { + let exec = Exec::cmd(path_to_cli()).arg("tests/input/cmds-example.txt"); + let (exit_status, stdout_text, stderr_text) = run_command(exec); + assert_exit_code(exit_status, EXIT_SUCCESS, &stderr_text); + + // The example system uses a fixed seed, which means that UUIDs are + // deterministic. Some of the test commands also use those UUIDs, and it's + // convenient for everyone if they aren't redacted. + let stdout_text = Redactor::default().uuids(false).do_redact(&stdout_text); + assert_contents("tests/output/cmd-example-stdout", &stdout_text); + assert_contents("tests/output/cmd-example-stderr", &stderr_text); +} + type ControlPlaneTestContext = nexus_test_utils::ControlPlaneTestContext; diff --git a/nexus/reconfigurator/planning/src/example.rs b/nexus/reconfigurator/planning/src/example.rs index 0559d3f5cb..df6c4d0e52 100644 --- a/nexus/reconfigurator/planning/src/example.rs +++ b/nexus/reconfigurator/planning/src/example.rs @@ -192,7 +192,7 @@ impl ExampleSystemBuilder { pub fn build(&self) -> (ExampleSystem, Blueprint) { let nexus_count = self.get_nexus_zones(); - slog::info!( + slog::debug!( &self.log, "Creating example system"; "nsleds" => self.nsleds, diff --git a/nexus/reconfigurator/planning/src/system.rs b/nexus/reconfigurator/planning/src/system.rs index f3ee40a00e..5a9607b54d 100644 --- a/nexus/reconfigurator/planning/src/system.rs +++ b/nexus/reconfigurator/planning/src/system.rs @@ -42,7 +42,6 @@ use omicron_common::disk::DiskIdentity; use omicron_common::disk::DiskVariant; use omicron_common::policy::INTERNAL_DNS_REDUNDANCY; use omicron_common::policy::NEXUS_REDUNDANCY; -use omicron_uuid_kinds::PhysicalDiskUuid; use omicron_uuid_kinds::SledUuid; use omicron_uuid_kinds::ZpoolUuid; use std::collections::BTreeMap; @@ -320,6 +319,11 @@ impl SystemDescription { Ok(self) } + /// Return true if the system has any sleds in it. + pub fn has_sleds(&self) -> bool { + !self.sleds.is_empty() + } + pub fn to_collection_builder(&self) -> anyhow::Result { let collector_label = self .collector @@ -519,6 +523,10 @@ impl Sled { "SystemSimultatedSled", (sled_id, "ZpoolUuid"), ); + let mut physical_disk_rng = TypedUuidRng::from_seed( + "SystemSimulatedSled", + (sled_id, "PhysicalDiskUuid"), + ); let zpools: BTreeMap<_, _> = (0..nzpools) .map(|_| { let zpool = ZpoolUuid::from(zpool_rng.next()); @@ -528,7 +536,7 @@ impl Sled { serial: format!("serial-{zpool}"), model: String::from("fake-model"), }, - disk_id: PhysicalDiskUuid::new_v4(), + disk_id: physical_disk_rng.next(), policy: PhysicalDiskPolicy::InService, state: PhysicalDiskState::Active, };