From 9b5296e80867377de9146732529081e8ace6d98d Mon Sep 17 00:00:00 2001 From: Eliza Weisman Date: Tue, 4 Feb 2025 12:17:13 -0800 Subject: [PATCH 01/43] [nix] Update Nix flake.lock (#7474) This picks up the update to Rust 1.84.0. --- flake.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index c2655cbe439..03d674604cf 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1730200266, - "narHash": "sha256-l253w0XMT8nWHGXuXqyiIC/bMvh1VRszGXgdpQlfhvU=", + "lastModified": 1738546358, + "narHash": "sha256-nLivjIygCiqLp5QcL7l56Tca/elVqM9FG1hGd9ZSsrg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "807e9154dcb16384b1b765ebe9cd2bba2ac287fd", + "rev": "c6e957d81b96751a3d5967a0fd73694f303cc914", "type": "github" }, "original": { @@ -29,11 +29,11 @@ ] }, "locked": { - "lastModified": 1730428392, - "narHash": "sha256-2aRfq1P0usr+TlW9LUCoefqqpPum873ac0TgZzXYHKI=", + "lastModified": 1738635966, + "narHash": "sha256-5MbJhh6nz7tx8FYVOJ0+ixMaEn0ibGzV/hScPMmqVTE=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "17eda17f5596a84e92ba94160139eb70f3c3e734", + "rev": "1ff8663cd75a11e61f8046c62f4dbb05d1907b44", "type": "github" }, "original": { From 413dc9aad78b452c96c8a171ea8756270215be92 Mon Sep 17 00:00:00 2001 From: John Gallagher Date: Tue, 4 Feb 2025 16:15:01 -0500 Subject: [PATCH 02/43] [sled-agent] Allow `PUT /omicron-zones` to accept filesystem_pool patches (#7449) This is the first half of #7229. The second half is to teach Reconfigurator to actually fill in the missing filesystem_pool values; that will be upcoming shortly, and I'll put testing notes in it. --- illumos-utils/src/running_zone.rs | 2 + sled-agent/src/services.rs | 489 +++++++++++++++++++++++++++++- sled-agent/src/sled_agent.rs | 4 + 3 files changed, 481 insertions(+), 14 deletions(-) diff --git a/illumos-utils/src/running_zone.rs b/illumos-utils/src/running_zone.rs index 12e651477cf..600d7ffffee 100644 --- a/illumos-utils/src/running_zone.rs +++ b/illumos-utils/src/running_zone.rs @@ -338,6 +338,7 @@ mod zenter { } /// Represents a running zone. +#[derive(Debug)] pub struct RunningZone { // The `zoneid_t` for the zone, while it's running, or `None` if not. id: Option, @@ -911,6 +912,7 @@ pub enum InstallZoneError { IncompleteBuilder, } +#[derive(Debug)] pub struct InstalledZone { log: Logger, diff --git a/sled-agent/src/services.rs b/sled-agent/src/services.rs index 4eba7e13c2e..312ab33b1c8 100644 --- a/sled-agent/src/services.rs +++ b/sled-agent/src/services.rs @@ -94,6 +94,7 @@ use omicron_common::backoff::{ use omicron_common::disk::{DatasetKind, DatasetName}; use omicron_common::ledger::{self, Ledger, Ledgerable}; use omicron_ddm_admin_client::{Client as DdmAdminClient, DdmError}; +use omicron_uuid_kinds::OmicronZoneUuid; use once_cell::sync::OnceCell; use rand::prelude::SliceRandom; use sled_agent_types::{ @@ -290,6 +291,19 @@ pub enum Error { #[error("Error migrating old-format services ledger: {0:#}")] ServicesMigration(anyhow::Error), + + #[error( + "Invalid filesystem_pool in new zone config: \ + for zone {zone_id}, expected pool {expected_pool} but got {got_pool}" + )] + InvalidFilesystemPoolZoneConfig { + zone_id: OmicronZoneUuid, + expected_pool: ZpoolName, + got_pool: ZpoolName, + }, + + #[error("Unexpected zone config: zone {zone_id} is running on ramdisk ?!")] + ZoneIsRunningOnRamdisk { zone_id: OmicronZoneUuid }, } impl Error { @@ -304,7 +318,9 @@ impl Error { impl From for omicron_common::api::external::Error { fn from(err: Error) -> Self { match err { - Error::RequestedConfigConflicts(_) => { + Error::RequestedConfigConflicts(_) + | Error::InvalidFilesystemPoolZoneConfig { .. } + | Error::ZoneIsRunningOnRamdisk { .. } => { omicron_common::api::external::Error::invalid_request( &err.to_string(), ) @@ -624,6 +640,7 @@ struct StartZonesResult { } // A running zone and the configuration which started it. +#[derive(Debug)] struct OmicronZone { runtime: RunningZone, config: OmicronZoneConfigLocal, @@ -3491,8 +3508,13 @@ impl ServiceManager { // will only change in the direction of `new_request`: zones will only be // removed if they ARE NOT part of `new_request`, and zones will only be // added if they ARE part of `new_request`. - // - Zones are not updated in-place: two zone configurations that differ - // in any way are treated as entirely distinct. + // - Zones are generally not updated in-place (i.e., two zone configurations + // that differ in any way are treated as entirely distinct), with an + // exception for backfilling the `filesystem_pool`, as long as the new + // request's filesystem pool matches the actual pool for that zones. This + // in-place update is allowed because changing only that property to match + // the runtime system does not require reconfiguring the zone or shutting it + // down and restarting it. // - This method does not record any information such that these services // are re-instantiated on boot. async fn ensure_all_omicron_zones( @@ -3505,17 +3527,15 @@ impl ServiceManager { ) -> Result<(), Error> { // Do some data-normalization to ensure we can compare the "requested // set" vs the "existing set" as HashSets. - let old_zone_configs: HashSet = existing_zones - .values() - .map(|omicron_zone| omicron_zone.config.zone.clone()) - .collect(); - let requested_zones_set: HashSet = - new_request.zones.into_iter().collect(); + let ReconciledNewZonesRequest { + zones_to_be_removed, + zones_to_be_added, + } = reconcile_running_zones_with_new_request( + existing_zones, + new_request, + &self.inner.log, + )?; - let zones_to_be_removed = - old_zone_configs.difference(&requested_zones_set); - let zones_to_be_added = - requested_zones_set.difference(&old_zone_configs); // Destroy zones that should not be running for zone in zones_to_be_removed { self.zone_bundle_and_try_remove(existing_zones, &zone).await; @@ -3537,7 +3557,7 @@ impl ServiceManager { let StartZonesResult { new_zones, errors } = self .start_omicron_zones( mount_config, - zones_to_be_added, + zones_to_be_added.iter(), time_is_synchronized, &all_u2_pools, fake_install_dir, @@ -4697,6 +4717,168 @@ impl ServiceManager { } } +#[derive(Debug)] +struct ReconciledNewZonesRequest { + zones_to_be_removed: HashSet, + zones_to_be_added: HashSet, +} + +fn reconcile_running_zones_with_new_request( + existing_zones: &mut MutexGuard<'_, ZoneMap>, + new_request: OmicronZonesConfig, + log: &Logger, +) -> Result { + reconcile_running_zones_with_new_request_impl( + existing_zones + .values_mut() + .map(|z| (&mut z.config.zone, z.runtime.root_zpool())), + new_request, + log, + ) +} + +// Separate helper function for `reconcile_running_zones_with_new_request` that +// allows unit tests to exercise the implementation without having to construct +// a `&mut MutexGuard<'_, ZoneMap>` for `existing_zones`. +fn reconcile_running_zones_with_new_request_impl<'a>( + existing_zones_with_runtime_zpool: impl Iterator< + Item = (&'a mut OmicronZoneConfig, &'a ZpoolOrRamdisk), + >, + new_request: OmicronZonesConfig, + log: &Logger, +) -> Result { + let mut existing_zones_by_id: BTreeMap<_, _> = + existing_zones_with_runtime_zpool + .map(|(zone, zpool)| (zone.id, (zone, zpool))) + .collect(); + let mut zones_to_be_added = HashSet::new(); + let mut zones_to_be_removed = HashSet::new(); + let mut zones_to_update = Vec::new(); + + for zone in new_request.zones.into_iter() { + let Some((existing_zone, runtime_zpool)) = + existing_zones_by_id.remove(&zone.id) + else { + // This zone isn't in the existing set; add it. + zones_to_be_added.insert(zone); + continue; + }; + + // We're already running this zone. If the config hasn't changed, we + // have nothing to do. + if zone == *existing_zone { + continue; + } + + // Special case for fixing #7229. We have an incoming request for a zone + // that we're already running except the config has changed; normally, + // we'd shut the zone down and restart it. However, if we get a new + // request that is: + // + // 1. setting `filesystem_pool`, and + // 2. the config for this zone is otherwise identical, and + // 3. the new `filesystem_pool` matches the pool on which the zone is + // installed + // + // then we don't want to shut the zone down and restart it, because the + // config hasn't actually changed in any meaningful way; this is just + // reconfigurator correcting #7229. + if let Some(new_filesystem_pool) = &zone.filesystem_pool { + let differs_only_by_filesystem_pool = { + // Clone `existing_zone` and mutate its `filesystem_pool` to + // match the new request; if they now match, that's the only + // field that's different. + let mut existing = existing_zone.clone(); + existing.filesystem_pool = Some(new_filesystem_pool.clone()); + existing == zone + }; + + let runtime_zpool = match runtime_zpool { + ZpoolOrRamdisk::Zpool(zpool_name) => zpool_name, + ZpoolOrRamdisk::Ramdisk => { + // The only zone we run on the ramdisk is the switch + // zone, for which it isn't possible to get a zone + // request, so it should be fine to put an + // `unreachable!()` here. Out of caution for future + // changes, we'll instead return an error that the + // requested zone is on the ramdisk. + error!( + log, + "fix-7229: unexpectedly received request with a \ + zone config for a zone running on ramdisk"; + "new_config" => ?zone, + "existing_config" => ?existing_zone, + ); + return Err(Error::ZoneIsRunningOnRamdisk { + zone_id: zone.id, + }); + } + }; + + if differs_only_by_filesystem_pool { + if new_filesystem_pool == runtime_zpool { + // Our #7229 special case: the new config is only filling in + // the pool, and it does so correctly. Move on to the next + // zone in the request without adding this zone to either of + // our `zone_to_be_*` sets. + info!( + log, + "fix-7229: accepted new zone config that changes only \ + filesystem_pool"; + "new_config" => ?zone, + ); + + // We should update this `existing_zone`, but delay doing so + // until we've processed all zones (so if there are any + // failures later, we don't return having partially-updated + // the existing zones). + zones_to_update.push((existing_zone, zone)); + continue; + } else { + error!( + log, + "fix-7229: rejected new zone config that changes only \ + filesystem_pool (incorrect pool)"; + "new_config" => ?zone, + "expected_pool" => %runtime_zpool, + ); + return Err(Error::InvalidFilesystemPoolZoneConfig { + zone_id: zone.id, + expected_pool: runtime_zpool.clone(), + got_pool: new_filesystem_pool.clone(), + }); + } + } + } + + // End of #7229 special case: this zone is already running, but the new + // request has changed it in some way. We need to shut it down and + // restart it. + zones_to_be_removed.insert(existing_zone.clone()); + zones_to_be_added.insert(zone); + } + + // Any remaining entries in `existing_zones_by_id` should be shut down. + zones_to_be_removed + .extend(existing_zones_by_id.into_values().map(|(z, _)| z.clone())); + + // All zones have been handled successfully; commit any changes to existing + // zones we found in our "fix 7229" special case above. + let num_zones_updated = zones_to_update.len(); + for (existing_zone, new_zone) in zones_to_update { + *existing_zone = new_zone; + } + + info!( + log, + "ensure_all_omicron_zones: request reconciliation done"; + "num_zones_to_be_removed" => zones_to_be_removed.len(), + "num_zones_to_be_added" => zones_to_be_added.len(), + "num_zones_updated" => num_zones_updated, + ); + Ok(ReconciledNewZonesRequest { zones_to_be_removed, zones_to_be_added }) +} + #[cfg(all(test, target_os = "illumos"))] mod illumos_tests { use crate::metrics; @@ -5640,6 +5822,8 @@ mod illumos_tests { #[cfg(test)] mod test { + use omicron_uuid_kinds::ZpoolUuid; + use super::*; #[test] @@ -5672,4 +5856,281 @@ mod test { &serde_json::to_string_pretty(&schema).unwrap(), ); } + + #[test] + fn test_fix_7229_zone_config_reconciliation() { + fn make_omicron_zone_config( + filesystem_pool: Option<&ZpoolName>, + ) -> OmicronZoneConfig { + OmicronZoneConfig { + id: OmicronZoneUuid::new_v4(), + filesystem_pool: filesystem_pool.cloned(), + zone_type: OmicronZoneType::Oximeter { + address: "[::1]:0".parse().unwrap(), + }, + } + } + + let logctx = + omicron_test_utils::dev::test_setup_log("test_ensure_service"); + let log = &logctx.log; + + let some_zpools = (0..10) + .map(|_| ZpoolName::new_external(ZpoolUuid::new_v4())) + .collect::>(); + + // Test 1: We have some zones; the new config makes no changes. + { + let mut existing = vec![ + ( + make_omicron_zone_config(None), + ZpoolOrRamdisk::Zpool(some_zpools[0].clone()), + ), + ( + make_omicron_zone_config(Some(&some_zpools[1])), + ZpoolOrRamdisk::Zpool(some_zpools[1].clone()), + ), + ( + make_omicron_zone_config(Some(&some_zpools[2])), + ZpoolOrRamdisk::Zpool(some_zpools[2].clone()), + ), + ]; + let new_request = OmicronZonesConfig { + generation: Generation::new().next(), + zones: existing.iter().map(|(zone, _)| zone.clone()).collect(), + }; + let reconciled = reconcile_running_zones_with_new_request_impl( + existing.iter_mut().map(|(z, p)| (z, &*p)), + new_request.clone(), + log, + ) + .expect("reconciled successfully"); + assert_eq!(reconciled.zones_to_be_removed, HashSet::new()); + assert_eq!(reconciled.zones_to_be_added, HashSet::new()); + assert_eq!( + existing.iter().map(|(z, _)| z.clone()).collect::>(), + new_request.zones, + ); + } + + // Test 2: We have some zones; the new config changes `filesystem_pool` + // to match our runtime pools (i.e., the #7229 fix). + { + let mut existing = vec![ + ( + make_omicron_zone_config(None), + ZpoolOrRamdisk::Zpool(some_zpools[0].clone()), + ), + ( + make_omicron_zone_config(None), + ZpoolOrRamdisk::Zpool(some_zpools[1].clone()), + ), + ( + make_omicron_zone_config(None), + ZpoolOrRamdisk::Zpool(some_zpools[2].clone()), + ), + ]; + let new_request = OmicronZonesConfig { + generation: Generation::new().next(), + zones: existing + .iter() + .enumerate() + .map(|(i, (zone, _))| { + let mut zone = zone.clone(); + zone.filesystem_pool = Some(some_zpools[i].clone()); + zone + }) + .collect(), + }; + let reconciled = reconcile_running_zones_with_new_request_impl( + existing.iter_mut().map(|(z, p)| (z, &*p)), + new_request.clone(), + log, + ) + .expect("reconciled successfully"); + assert_eq!(reconciled.zones_to_be_removed, HashSet::new()); + assert_eq!(reconciled.zones_to_be_added, HashSet::new()); + assert_eq!( + existing.iter().map(|(z, _)| z.clone()).collect::>(), + new_request.zones, + ); + } + + // Test 3: We have some zones; the new config changes `filesystem_pool` + // to match our runtime pools (i.e., the #7229 fix) but also changes + // something else in the config for the final zone; we should attempt to + // remove and re-add that final zone. + { + let mut existing = vec![ + ( + make_omicron_zone_config(None), + ZpoolOrRamdisk::Zpool(some_zpools[0].clone()), + ), + ( + make_omicron_zone_config(None), + ZpoolOrRamdisk::Zpool(some_zpools[1].clone()), + ), + ( + make_omicron_zone_config(None), + ZpoolOrRamdisk::Zpool(some_zpools[2].clone()), + ), + ]; + let new_request = OmicronZonesConfig { + generation: Generation::new().next(), + zones: existing + .iter() + .enumerate() + .map(|(i, (zone, _))| { + let mut zone = zone.clone(); + zone.filesystem_pool = Some(some_zpools[i].clone()); + if i == 2 { + zone.zone_type = OmicronZoneType::Oximeter { + address: "[::1]:10000".parse().unwrap(), + }; + } + zone + }) + .collect(), + }; + let reconciled = reconcile_running_zones_with_new_request_impl( + existing.iter_mut().map(|(z, p)| (z, &*p)), + new_request.clone(), + log, + ) + .expect("reconciled successfully"); + assert_eq!( + reconciled.zones_to_be_removed, + HashSet::from([existing[2].0.clone()]), + ); + assert_eq!( + reconciled.zones_to_be_added, + HashSet::from([new_request.zones[2].clone()]), + ); + // The first two existing zones should have been updated to match + // the new request. + assert_eq!( + Vec::from_iter(existing[..2].iter().map(|(z, _)| z.clone())), + &new_request.zones[..2], + ); + } + + // Test 4: We have some zones; the new config changes `filesystem_pool` + // to match our runtime pools (i.e., the #7229 fix), except the new pool + // on the final zone is incorrect. We should get an error back. + { + let mut existing = vec![ + ( + make_omicron_zone_config(None), + ZpoolOrRamdisk::Zpool(some_zpools[0].clone()), + ), + ( + make_omicron_zone_config(None), + ZpoolOrRamdisk::Zpool(some_zpools[1].clone()), + ), + ( + make_omicron_zone_config(None), + ZpoolOrRamdisk::Zpool(some_zpools[2].clone()), + ), + ]; + let existing_orig = + existing.iter().map(|(z, _)| z.clone()).collect::>(); + let new_request = OmicronZonesConfig { + generation: Generation::new().next(), + zones: existing + .iter() + .enumerate() + .map(|(i, (zone, _))| { + let mut zone = zone.clone(); + if i < 2 { + zone.filesystem_pool = Some(some_zpools[i].clone()); + } else { + zone.filesystem_pool = Some(some_zpools[4].clone()); + } + zone + }) + .collect(), + }; + let err = reconcile_running_zones_with_new_request_impl( + existing.iter_mut().map(|(z, p)| (z, &*p)), + new_request.clone(), + log, + ) + .expect_err("should not have reconciled successfully"); + + match err { + Error::InvalidFilesystemPoolZoneConfig { + zone_id, + expected_pool, + got_pool, + } => { + assert_eq!(zone_id, existing[2].0.id); + assert_eq!(expected_pool, some_zpools[2]); + assert_eq!(got_pool, some_zpools[4]); + } + _ => panic!("unexpected error: {err}"), + } + // reconciliation failed, so the contents of our existing configs + // should not have changed (even though a couple of the changes + // were okay, we should either take all or none to maintain + // consistency with the generation-tagged OmicronZonesConfig) + assert_eq!( + existing.iter().map(|(z, _)| z.clone()).collect::>(), + existing_orig, + ); + } + + // Test 5: We have some zones. The new config applies #7229 fix to the + // first zone, doesn't include the remaining zones, and adds some new + // zones. We should see "the remaining zones" removed, the "new zones" + // added, and the 7229-fixed zone not in either set. + { + let mut existing = vec![ + ( + make_omicron_zone_config(None), + ZpoolOrRamdisk::Zpool(some_zpools[0].clone()), + ), + ( + make_omicron_zone_config(None), + ZpoolOrRamdisk::Zpool(some_zpools[1].clone()), + ), + ( + make_omicron_zone_config(None), + ZpoolOrRamdisk::Zpool(some_zpools[2].clone()), + ), + ]; + let new_request = OmicronZonesConfig { + generation: Generation::new().next(), + zones: vec![ + { + let mut z = existing[0].0.clone(); + z.filesystem_pool = Some(some_zpools[0].clone()); + z + }, + make_omicron_zone_config(None), + make_omicron_zone_config(None), + ], + }; + let reconciled = reconcile_running_zones_with_new_request_impl( + existing.iter_mut().map(|(z, p)| (z, &*p)), + new_request.clone(), + log, + ) + .expect("reconciled successfully"); + + assert_eq!( + reconciled.zones_to_be_removed, + HashSet::from_iter( + existing[1..].iter().map(|(z, _)| z.clone()) + ), + ); + assert_eq!( + reconciled.zones_to_be_added, + HashSet::from_iter(new_request.zones[1..].iter().cloned()), + ); + // Only the first existing zone is being kept; ensure it matches the + // new request. + assert_eq!(existing[0].0, new_request.zones[0]); + } + logctx.cleanup_successful(); + } } diff --git a/sled-agent/src/sled_agent.rs b/sled-agent/src/sled_agent.rs index 4bc0d7b13a3..5c00a590844 100644 --- a/sled-agent/src/sled_agent.rs +++ b/sled-agent/src/sled_agent.rs @@ -279,6 +279,10 @@ impl From for dropshot::HttpError { } _ => HttpError::for_internal_error(err.to_string()), }, + Error::Services(err) => { + let err = omicron_common::api::external::Error::from(err); + err.into() + } e => HttpError::for_internal_error(e.to_string()), } } From ca585746a82eb3630ea8e0495d8be4648dc2ad6e Mon Sep 17 00:00:00 2001 From: John Gallagher Date: Tue, 4 Feb 2025 16:33:34 -0500 Subject: [PATCH 03/43] blueprint-builder: Don't drop decommissioned sleds out of `sled_state` (#7470) This is one part working towards #7078 and #7309 (and a few related issues). We'd like to be able to send sled-agent a complete config containing its zones+datasets+disks, which means first we need to merge the separate maps in the blueprint together (and attach an overriding generation number on this combo sled config). Before we can do _that_, we need to ensure that each of the four maps keyed by a sled ID in the blueprint (`sled_state`, `blueprint_zones`, `blueprint_disks`, `blueprint_datasets`) have matching sets of keys. Viewing `blueprint_zones` as the primary map, `BlueprintBuilder::build()` has three "let's match the existing behavior" spots that can _drop_ entries from the other three maps. This PR removes one of those three, and ensures that any sled ID present in `blueprint_zones` is also present in `sled_state`. (Previously, we'd drop sleds from `sled_state` after decommissioning.) Most of the PR bulk is adding new checks to blippy to look for inconsistencies between the four maps. --------- Co-authored-by: Andrew J. Stone --- nexus/reconfigurator/blippy/src/blippy.rs | 46 ++++ nexus/reconfigurator/blippy/src/checks.rs | 227 ++++++++++++++++++ .../planning/src/blueprint_builder/builder.rs | 96 ++++---- .../output/planner_nonprovisionable_2_2a.txt | 2 +- 4 files changed, 328 insertions(+), 43 deletions(-) diff --git a/nexus/reconfigurator/blippy/src/blippy.rs b/nexus/reconfigurator/blippy/src/blippy.rs index 07921fddfeb..0edb55eeaad 100644 --- a/nexus/reconfigurator/blippy/src/blippy.rs +++ b/nexus/reconfigurator/blippy/src/blippy.rs @@ -88,6 +88,23 @@ impl Kind { } } +/// Various ways the multiple maps in a blueprint can be inconsistent. +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub enum MultimapInconsistency { + /// A sled is present in `blueprint_zones` but not `sled_state`. + PresentInZonesNotState, + /// A sled is present in `blueprint_zones` but not `blueprint_disks`. + PresentInZonesNotDisks, + /// A sled is present in `blueprint_zones` but not `blueprint_datasets`. + PresentInZonesNotDatasets, + /// A sled is present in `sled_state` but not `blueprint_zones`. + PresentInStateNotZones, + /// A sled is present in `blueprint_disks` but not `blueprint_zones`. + PresentInDisksNotZones, + /// A sled is present in `blueprint_datasets` but not `blueprint_zones`. + PresentInDatasetsNotZones, +} + #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] pub enum SledKind { /// Two running zones have the same underlay IP address. @@ -187,6 +204,8 @@ pub enum SledKind { dataset: BlueprintDatasetConfig, address: SocketAddrV6, }, + /// The multiple maps of the blueprint have inconsistent contents. + MultimapInconsistency(MultimapInconsistency), } impl fmt::Display for SledKind { @@ -397,6 +416,33 @@ impl fmt::Display for SledKind { dataset.kind, dataset.id, address, ) } + SledKind::MultimapInconsistency(map_kind) => { + let (present, missing) = match map_kind { + MultimapInconsistency::PresentInZonesNotState => { + ("blueprint_zones", "sled_state") + } + MultimapInconsistency::PresentInZonesNotDisks => { + ("blueprint_zones", "blueprint_disks") + } + MultimapInconsistency::PresentInZonesNotDatasets => { + ("blueprint_zones", "blueprint_datasets") + } + MultimapInconsistency::PresentInStateNotZones => { + ("sled_state", "blueprint_zones") + } + MultimapInconsistency::PresentInDisksNotZones => { + ("blueprint_disks", "blueprint_zones") + } + MultimapInconsistency::PresentInDatasetsNotZones => { + ("blueprint_datasets", "blueprint_zones") + } + }; + write!( + f, + "blueprint map inconsistency: \ + sled is present in {present} but missing from {missing}" + ) + } } } } diff --git a/nexus/reconfigurator/blippy/src/checks.rs b/nexus/reconfigurator/blippy/src/checks.rs index 84b98078814..e4c910b4aa7 100644 --- a/nexus/reconfigurator/blippy/src/checks.rs +++ b/nexus/reconfigurator/blippy/src/checks.rs @@ -3,6 +3,7 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. use crate::blippy::Blippy; +use crate::blippy::MultimapInconsistency; use crate::blippy::Severity; use crate::blippy::SledKind; use nexus_sled_agent_shared::inventory::ZoneKind; @@ -13,6 +14,7 @@ use nexus_types::deployment::BlueprintZoneConfig; use nexus_types::deployment::BlueprintZoneFilter; use nexus_types::deployment::BlueprintZoneType; use nexus_types::deployment::OmicronZoneExternalIp; +use nexus_types::external_api::views::SledState; use omicron_common::address::DnsSubnet; use omicron_common::address::Ipv6Subnet; use omicron_common::address::SLED_PREFIX; @@ -25,12 +27,108 @@ use std::collections::BTreeSet; use std::net::Ipv6Addr; pub(crate) fn perform_all_blueprint_only_checks(blippy: &mut Blippy<'_>) { + check_multiple_map_keys(blippy); check_underlay_ips(blippy); check_external_networking(blippy); check_dataset_zpool_uniqueness(blippy); check_datasets(blippy); } +fn check_multiple_map_keys(blippy: &mut Blippy<'_>) { + // Until we merge the maps together + // (https://github.com/oxidecomputer/omicron/issues/7078), we'll treat + // `blueprint_zones` as the "primary" map. Any sled present in + // `blueprint_zones` should also have an entry in: + // + // * `sled_state` + // * `blueprint_disks` (only partially implemented - only active sleds are + // present, which needs to be fixed before we can merge the maps) + // * `blueprint_datasets` (only partially implemented - only active sleds + // are present, which needs to be fixed before we can merge the maps) + let blueprint = blippy.blueprint(); + + for &sled_id in blueprint.blueprint_zones.keys() { + match blueprint.sled_state.get(&sled_id) { + Some(SledState::Active) => { + // sled is active; no note needed for `sled_state`, but we need + // to check `blueprint_datasets` and `blueprint_disks` too. + if !blueprint.blueprint_disks.contains_key(&sled_id) { + blippy.push_sled_note( + sled_id, + Severity::BackwardsCompatibility, + SledKind::MultimapInconsistency( + MultimapInconsistency::PresentInZonesNotDisks, + ), + ); + } + if !blueprint.blueprint_datasets.contains_key(&sled_id) { + blippy.push_sled_note( + sled_id, + Severity::BackwardsCompatibility, + SledKind::MultimapInconsistency( + MultimapInconsistency::PresentInZonesNotDatasets, + ), + ); + } + } + Some(SledState::Decommissioned) => { + // For now, we don't check `blueprint_disks` or + // `blueprint_datasets` because we know those entries are + // missing. But we should fix that! + } + None => { + blippy.push_sled_note( + sled_id, + Severity::BackwardsCompatibility, + SledKind::MultimapInconsistency( + MultimapInconsistency::PresentInZonesNotState, + ), + ); + + // Same as `Decommissioned`: For now, we don't check + // `blueprint_disks` or `blueprint_datasets` because we know + // those entries are missing. But we should fix that! + } + } + } + + // Also check the other direction: do any of the "non-primary" maps have + // sleds that aren't in `blueprint_zones`? + for &sled_id in blueprint.sled_state.keys() { + if !blueprint.blueprint_zones.contains_key(&sled_id) { + blippy.push_sled_note( + sled_id, + Severity::BackwardsCompatibility, + SledKind::MultimapInconsistency( + MultimapInconsistency::PresentInStateNotZones, + ), + ); + } + } + for &sled_id in blueprint.blueprint_disks.keys() { + if !blueprint.blueprint_zones.contains_key(&sled_id) { + blippy.push_sled_note( + sled_id, + Severity::BackwardsCompatibility, + SledKind::MultimapInconsistency( + MultimapInconsistency::PresentInDisksNotZones, + ), + ); + } + } + for &sled_id in blueprint.blueprint_datasets.keys() { + if !blueprint.blueprint_zones.contains_key(&sled_id) { + blippy.push_sled_note( + sled_id, + Severity::BackwardsCompatibility, + SledKind::MultimapInconsistency( + MultimapInconsistency::PresentInDatasetsNotZones, + ), + ); + } + } +} + fn check_underlay_ips(blippy: &mut Blippy<'_>) { let mut underlay_ips: BTreeMap = BTreeMap::new(); @@ -1754,4 +1852,133 @@ mod tests { logctx.cleanup_successful(); } + + #[test] + fn test_sled_in_zones_map_but_not_others() { + static TEST_NAME: &str = "test_sled_in_zones_map_but_not_others"; + let logctx = test_setup_log(TEST_NAME); + let (_, _, mut blueprint) = example(&logctx.log, TEST_NAME); + + let mut sled_ids = blueprint.blueprint_zones.keys(); + let some_sled_0 = *sled_ids.next().expect("at least 1 sled"); + let some_sled_1 = *sled_ids.next().expect("at least 2 sleds"); + + // remove sled 0 from `sled_state` + blueprint + .sled_state + .remove(&some_sled_0) + .expect("removed sled 0 from sled_state"); + + // remove sled 1 from blueprint_disks and blueprint_datasets; we + // shouldn't need to use a second sled ID here, but for now we only + // expect disks/datasets entries for active sleds, so blippy only + // checks disks/datasets if the sled is in `sled_state` + blueprint + .blueprint_disks + .remove(&some_sled_1) + .expect("removed sled 1 from blueprint_disks"); + blueprint + .blueprint_datasets + .remove(&some_sled_1) + .expect("removed sled 1 from blueprint_datasets"); + + let expected_notes = [ + Note { + severity: Severity::BackwardsCompatibility, + kind: Kind::Sled { + sled_id: some_sled_0, + kind: SledKind::MultimapInconsistency( + MultimapInconsistency::PresentInZonesNotState, + ), + }, + }, + Note { + severity: Severity::BackwardsCompatibility, + kind: Kind::Sled { + sled_id: some_sled_1, + kind: SledKind::MultimapInconsistency( + MultimapInconsistency::PresentInZonesNotDisks, + ), + }, + }, + Note { + severity: Severity::BackwardsCompatibility, + kind: Kind::Sled { + sled_id: some_sled_1, + kind: SledKind::MultimapInconsistency( + MultimapInconsistency::PresentInZonesNotDatasets, + ), + }, + }, + ]; + let report = + Blippy::new(&blueprint).into_report(BlippyReportSortKey::Kind); + eprintln!("{}", report.display()); + + for note in expected_notes { + assert!( + report.notes().contains(¬e), + "did not find expected note {note:?}" + ); + } + + logctx.cleanup_successful(); + } + + #[test] + fn test_sled_not_in_zones_map() { + static TEST_NAME: &str = "test_sled_not_in_zones_map"; + let logctx = test_setup_log(TEST_NAME); + let (_, _, mut blueprint) = example(&logctx.log, TEST_NAME); + + let mut sled_ids = blueprint.blueprint_zones.keys(); + let some_sled = *sled_ids.next().expect("at least 1 sled"); + + blueprint + .blueprint_zones + .remove(&some_sled) + .expect("removed sled from blueprint_zones"); + + let expected_notes = [ + Note { + severity: Severity::BackwardsCompatibility, + kind: Kind::Sled { + sled_id: some_sled, + kind: SledKind::MultimapInconsistency( + MultimapInconsistency::PresentInStateNotZones, + ), + }, + }, + Note { + severity: Severity::BackwardsCompatibility, + kind: Kind::Sled { + sled_id: some_sled, + kind: SledKind::MultimapInconsistency( + MultimapInconsistency::PresentInDisksNotZones, + ), + }, + }, + Note { + severity: Severity::BackwardsCompatibility, + kind: Kind::Sled { + sled_id: some_sled, + kind: SledKind::MultimapInconsistency( + MultimapInconsistency::PresentInDatasetsNotZones, + ), + }, + }, + ]; + let report = + Blippy::new(&blueprint).into_report(BlippyReportSortKey::Kind); + eprintln!("{}", report.display()); + + for note in expected_notes { + assert!( + report.notes().contains(¬e), + "did not find expected note {note:?}" + ); + } + + logctx.cleanup_successful(); + } } diff --git a/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs b/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs index aad29e924e5..70dc9efcecc 100644 --- a/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs +++ b/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs @@ -474,24 +474,33 @@ impl<'a> BlueprintBuilder<'a> { let state = match parent_blueprint.sled_state.get(sled_id).copied() { Some(state) => state, - None => { - // If we have zones but no state for a sled, we assume - // it was removed by an earlier version of the planner - // (which pruned decommissioned sleds from - // `sled_state`). Check that all of its zones are - // expunged, which is a prerequisite for - // decommissioning. If any zones aren't, then we don't - // know what to do: the state is missing but we can't - // assume "decommissioned", so fail. - if zones.are_all_zones_expunged() { - SledState::Decommissioned - } else { + // If we have zones but no state for a sled, we assume + // it was removed by an earlier version of the planner + // (which pruned decommissioned sleds from + // `sled_state`). Check that the sled is decommissioned in + // the planning input, which is a prerequisite for + // decommissioning. If it isn't, then we don't know what to + // do: the state is missing but we can't assume + // "decommissioned", so fail. + None => match input + .sled_lookup(SledFilter::All, *sled_id) + .map(|sled| sled.state) + { + Ok(SledState::Decommissioned) => SledState::Decommissioned, + Ok(SledState::Active) => { bail!( - "sled {sled_id} is missing in parent blueprint \ - sled_state map, but has non-expunged zones" + "sled {sled_id} is present in parent_blueprint \ + zones map, but still active in planning input" ); } - } + Err(err) => { + bail!( + "sled {sled_id} is present in parent_blueprint \ + zones map, but lookup from planning input failed: \ + {err}" + ); + } + }, }; // If we don't have disks/datasets entries, we'll start with an @@ -655,18 +664,6 @@ impl<'a> BlueprintBuilder<'a> { ); } } - // Preserving backwards compatibility, for now: prune sled_state of any - // fully decommissioned sleds, which we determine by the state being - // `Decommissioned` _and_ the sled is no longer in our PlanningInput's - // list of commissioned sleds. - let commissioned_sled_ids = self - .input - .all_sled_ids(SledFilter::Commissioned) - .collect::>(); - sled_state.retain(|sled_id, state| { - *state != SledState::Decommissioned - || commissioned_sled_ids.contains(sled_id) - }); // Preserving backwards compatibility, for now: disks should only // have entries for in-service sleds, and expunged disks should be // removed entirely. @@ -2202,9 +2199,8 @@ pub mod test { } #[test] - fn test_prune_decommissioned_sleds() { - static TEST_NAME: &str = - "blueprint_builder_test_prune_decommissioned_sleds"; + fn test_decommissioned_sleds() { + static TEST_NAME: &str = "blueprint_builder_test_decommissioned_sleds"; let logctx = test_setup_log(TEST_NAME); let (collection, input, mut blueprint1) = example(&logctx.log, TEST_NAME); @@ -2250,7 +2246,7 @@ pub mod test { &blueprint1, &input, &collection, - "test_prune_decommissioned_sleds", + "test_decommissioned_sleds", ) .expect("created builder") .build(); @@ -2279,32 +2275,48 @@ pub mod test { z.disposition = BlueprintZoneDisposition::Expunged; } - // Generate a new blueprint. This desired sled state should no longer be - // present: it has reached the terminal decommissioned state, so there's - // no more work to be done. - let blueprint3 = BlueprintBuilder::new_based_on( + // Generate a new blueprint. This desired sled state should still be + // decommissioned, because we haven't implemented all the cleanup + // necessary to prune sleds from the blueprint. + let mut blueprint3 = BlueprintBuilder::new_based_on( &logctx.log, &blueprint2, &input, &collection, - "test_prune_decommissioned_sleds", + "test_decommissioned_sleds", ) .expect("created builder") .build(); verify_blueprint(&blueprint3); - - // Ensure we've dropped the decommissioned sled. (We may still have - // _zones_ for it that need cleanup work, but all state transitions for - // it are complete.) assert_eq!( blueprint3.sled_state.get(&decommision_sled_id).copied(), - None, + Some(SledState::Decommissioned), + ); + + // By hand, drop the decommissioned sled out of `sled_state`. This + // matches old builder behavior. Rerunning the builder should put it + // back, since it's still present in `blueprint_zones`. + blueprint3.sled_state.remove(&decommision_sled_id); + let blueprint4 = BlueprintBuilder::new_based_on( + &logctx.log, + &blueprint3, + &input, + &collection, + "test_decommissioned_sleds", + ) + .expect("created builder") + .build(); + eprintln!("{}", blueprint4.diff_since_blueprint(&blueprint3).display()); + verify_blueprint(&blueprint4); + assert_eq!( + blueprint4.sled_state.get(&decommision_sled_id).copied(), + Some(SledState::Decommissioned), ); // Test a no-op planning iteration. assert_planning_makes_no_changes( &logctx.log, - &blueprint3, + &blueprint4, &input, TEST_NAME, ); diff --git a/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_2_2a.txt b/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_2_2a.txt index f070fc076cd..a6d7163af26 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_2_2a.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_2_2a.txt @@ -185,7 +185,7 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 REMOVED SLEDS: - sled 68d24ac5-f341-49ea-a92a-0381b52ab387 (state was unknown): + sled 68d24ac5-f341-49ea-a92a-0381b52ab387 (was decommissioned): omicron zones from generation 2: --------------------------------------------------------------------------------------------- From e036c8010af4a4c3574f3b6e190eda4e17f16e29 Mon Sep 17 00:00:00 2001 From: John Gallagher Date: Tue, 4 Feb 2025 19:16:05 -0500 Subject: [PATCH 04/43] [reconfigurator] blueprint builder: backfill filesystem_pool (#7450) This builds on #7449 and, in combination with it, fixes #7229. When planning a new blueprint, one of the first things we now do is loop over all in-service zones on all active sleds and check that their `filesystem_pool` is consistent with the latest inventory collection from that sled. The expectation here is that we'll be filling in `filesystem_pool: None` values from older systems (i.e., #7229). There's also an edge case where we might need to correct our own incorrect backfills, if a sled-agent has restarted since the inventory collection was taken and has chosen a different zpool for some zone. If we can't find what the correct filesystem pool should be (e.g., if the sled isn't present in inventory at all, or none of its zpool/dataset combinations match the zone), we leave the `filesystem_pool` value untouched. I'll put testing notes from a4x2 in a comment below. --- .../planning/src/blueprint_builder/builder.rs | 242 +++++++++++++++++- .../src/blueprint_editor/sled_editor.rs | 155 +++++++++++ .../src/blueprint_editor/sled_editor/zones.rs | 27 ++ 3 files changed, 423 insertions(+), 1 deletion(-) diff --git a/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs b/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs index 70dc9efcecc..ecdb02830c8 100644 --- a/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs +++ b/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs @@ -522,7 +522,8 @@ impl<'a> BlueprintBuilder<'a> { generation: Generation::new(), datasets: IdMap::new(), }); - let editor = match state { + + let mut editor = match state { SledState::Active => { let subnet = input .sled_lookup(SledFilter::Commissioned, *sled_id) @@ -553,6 +554,28 @@ impl<'a> BlueprintBuilder<'a> { format!("failed to construct SledEditor for sled {sled_id}") })?; + // Apply fixes for #7229 to all active sleds: If any zones have a + // missing or incorrect `filesystem_pool` property, correct it based + // on the inventory pools and datasets. + match state { + SledState::Active => { + let sled_inventory = inventory.sled_agents.get(sled_id); + editor + .backfill_zone_filesystem_pools( + sled_inventory.map_or(&[], |inv| &inv.zpools), + sled_inventory.map_or(&[], |inv| &inv.datasets), + &log, + ) + .with_context(|| { + format!( + "failed to backfill zone filesystem_pool \ + values for sled {sled_id}" + ) + })?; + } + SledState::Decommissioned => (), + } + sled_editors.insert(*sled_id, editor); } @@ -1993,6 +2016,8 @@ pub mod test { use nexus_types::deployment::OmicronZoneNetworkResources; use nexus_types::external_api::views::SledPolicy; use omicron_common::address::IpRange; + use omicron_common::disk::DatasetKind; + use omicron_common::disk::DatasetName; use omicron_test_utils::dev::test_setup_log; use std::collections::BTreeSet; use std::mem; @@ -2851,4 +2876,219 @@ pub mod test { logctx.cleanup_successful(); } + + #[test] + fn test_backfill_filesystem_pool() { + static TEST_NAME: &str = + "blueprint_builder_test_backfill_filesystem_pool"; + let logctx = test_setup_log(TEST_NAME); + + // Start a system that has 3 Nexus instances, each on a different sled. + let (example, mut parent) = + ExampleSystemBuilder::new(&logctx.log, TEST_NAME) + .nsleds(3) + .nexus_count(3) + .build(); + let mut collection = example.collection; + let input = example.input; + + // For each of the 3 Nexus instances: + // + // 0 - remains unchanged + // 1,2 - set filesystem_pool to None (should get filled in correctly) + // + // The zone config generation on sleds 1 and 2 should get bumped. 0 + // should remain unchanged. + let mut sled_ids = Vec::with_capacity(3); + let mut expected_filesystem_pools = Vec::with_capacity(3); + let mut expected_zones_config_gen = Vec::with_capacity(3); + + for (sled_id, zones_config) in parent.blueprint_zones.iter_mut() { + let mut nexus = zones_config + .zones + .iter_mut() + .find(|z| z.zone_type.is_nexus()) + .expect("should find a nexus on each sled"); + let orig_nexus_filesystem_pool = + nexus.filesystem_pool.clone().expect( + "nexus instances in new blueprints \ + should have a filesystem_pool", + ); + + match sled_ids.len() { + 0 => { + expected_zones_config_gen.push(zones_config.generation); + } + 1 | 2 => { + expected_zones_config_gen + .push(zones_config.generation.next()); + nexus.filesystem_pool = None; + } + _ => unreachable!("unexpected number of sleds in test"), + } + sled_ids.push(*sled_id); + expected_filesystem_pools.push(orig_nexus_filesystem_pool.clone()); + } + + // Create a builder and produce a new blueprint. + let blueprint1 = { + let mut builder = BlueprintBuilder::new_based_on( + &logctx.log, + &parent, + &input, + &collection, + "test", + ) + .expect("constructed builder"); + + for sled_id in input.all_sled_ids(SledFilter::InService) { + builder + .sled_ensure_zone_datasets(sled_id) + .expect("ensured zone datasets"); + } + + builder.build() + }; + + // Check that our backfilling was correct. + for (i, &sled_id) in sled_ids.iter().enumerate() { + let zones_config = + blueprint1.blueprint_zones.get(&sled_id).expect("found sled"); + assert_eq!( + zones_config.generation, expected_zones_config_gen[i], + "unexpected generation on sled {i}" + ); + + let nexus = zones_config + .zones + .iter() + .find(|z| z.zone_type.is_nexus()) + .expect("found nexus on sled"); + assert_eq!( + nexus.filesystem_pool.as_ref(), + Some(&expected_filesystem_pools[i]), + "unexpected filesystem_pool on sled {i}" + ); + } + + // Check that the new blueprint is blippy-clean. + verify_blueprint(&blueprint1); + + // It's possible a sled-agent could restart in between when the + // inventory collection we used for backfilling was created and when we + // try to send it the new zone configs, and in doing so it could have + // changed the zpool it chose for any zone type that doesn't have a + // durable dataset (e.g., Nexus). To emulate this, mutate our collection + // and change the zpool for sled 2's Nexus to a different zpool; our + // backfilling should correct this again, even though the parent + // blueprint has a non-`None` filesystem pool for this Nexus. + let sled_2_new_nexus_zpool = { + // Get sled 2 and its Nexus from the collection... + let entry = collection + .sled_agents + .get_mut(&sled_ids[2]) + .expect("sled 2 exists"); + let nexus = entry + .omicron_zones + .zones + .iter() + .find(|z| z.zone_type.is_nexus()) + .expect("found Nexus"); + let nexus_filesystem_pool = nexus + .filesystem_pool + .as_ref() + .expect("Nexus has a filesystem_pool"); + + // ... pick some other pool to use ... + let some_other_pool = entry + .zpools + .iter() + .find_map(|zpool| { + if zpool.id != nexus_filesystem_pool.id() { + Some(ZpoolName::new_external(zpool.id)) + } else { + None + } + }) + .expect("found some other zpool"); + + // ... and then update the collection's Nexus dataset to report that + // new pool as part of its dataset name. + let mut found_nexus_dataset = false; + for dataset in entry.datasets.iter_mut() { + if dataset.name.contains("nexus") { + assert!( + !found_nexus_dataset, + "sled should only have 1 Nexus dataset" + ); + found_nexus_dataset = true; + dataset.name = DatasetName::new( + some_other_pool.clone(), + DatasetKind::TransientZone { + name: illumos_utils::zone::zone_name( + nexus.zone_type.kind().zone_prefix(), + Some(nexus.id), + ), + }, + ) + .full_name(); + } + } + assert!( + found_nexus_dataset, + "did not find and update Nexus dataset" + ); + + some_other_pool + }; + + let blueprint2 = { + let mut builder = BlueprintBuilder::new_based_on( + &logctx.log, + &blueprint1, + &input, + &collection, + "test", + ) + .expect("constructed builder"); + + for sled_id in input.all_sled_ids(SledFilter::InService) { + builder + .sled_ensure_zone_datasets(sled_id) + .expect("ensured zone datasets"); + } + + builder.build() + }; + + // Check that our backfilling was correct: sled 2's generation should + // have been bumped again, and should have the filesystem pool reported + // by our modified collection. + expected_zones_config_gen[2] = expected_zones_config_gen[2].next(); + expected_filesystem_pools[2] = sled_2_new_nexus_zpool; + for (i, &sled_id) in sled_ids.iter().enumerate() { + let zones_config = + blueprint2.blueprint_zones.get(&sled_id).expect("found sled"); + assert_eq!( + zones_config.generation, expected_zones_config_gen[i], + "unexpected generation on sled {i}" + ); + + let nexus = zones_config + .zones + .iter() + .find(|z| z.zone_type.is_nexus()) + .expect("found nexus on sled"); + assert_eq!( + nexus.filesystem_pool.as_ref(), + Some(&expected_filesystem_pools[i]), + "unexpected filesystem_pool on sled {i}" + ); + } + + // Check that the new blueprint is blippy-clean. + verify_blueprint(&blueprint2); + + logctx.cleanup_successful(); + } } diff --git a/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor.rs b/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor.rs index 8ba56613692..1a734f7efbe 100644 --- a/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor.rs +++ b/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor.rs @@ -20,13 +20,22 @@ use nexus_types::deployment::BlueprintZoneType; use nexus_types::deployment::BlueprintZonesConfig; use nexus_types::deployment::DiskFilter; use nexus_types::external_api::views::SledState; +use nexus_types::inventory::Dataset; +use nexus_types::inventory::Zpool; use omicron_common::address::Ipv6Subnet; use omicron_common::address::SLED_PREFIX; use omicron_common::disk::DatasetKind; +use omicron_common::disk::DatasetName; use omicron_uuid_kinds::DatasetUuid; use omicron_uuid_kinds::OmicronZoneUuid; use omicron_uuid_kinds::PhysicalDiskUuid; use omicron_uuid_kinds::ZpoolUuid; +use slog::info; +use slog::warn; +use slog::Logger; +use slog_error_chain::InlineErrorChain; +use std::borrow::Cow; +use std::collections::BTreeMap; use std::iter; use std::mem; use std::net::Ipv6Addr; @@ -296,6 +305,23 @@ impl SledEditor { ) -> Result<(), SledEditError> { self.as_active_mut()?.ensure_datasets_for_running_zones(rng) } + + // Apply fixes for #7229: If any zones have a missing or incorrect + // `filesystem_pool` property, correct it based on the inventory pools and + // datasets. + pub fn backfill_zone_filesystem_pools( + &mut self, + inventory_zpools: &[Zpool], + inventory_datasets: &[Dataset], + log: &Logger, + ) -> Result<(), SledEditError> { + self.as_active_mut()?.backfill_zone_filesystem_pools( + inventory_zpools, + inventory_datasets, + log, + ); + Ok(()) + } } #[derive(Debug)] @@ -514,6 +540,135 @@ impl ActiveSledEditor { } Ok(()) } + + pub fn backfill_zone_filesystem_pools( + &mut self, + inventory_zpools: &[Zpool], + inventory_datasets: &[Dataset], + log: &Logger, + ) { + let mut zones_to_edit: BTreeMap = + BTreeMap::new(); + + for zone in self.zones.zones(BlueprintZoneFilter::ShouldBeRunning) { + let expected_filesystem_pool = if let Some(pool) = + zone.zone_type.durable_zpool() + { + // Easy case: if this zone type has a durable dataset, its + // filesystem_pool must be on the same zpool. + Cow::Borrowed(pool) + } else { + // Hard case: this zone type has no durable dataset, so if + // its `filesystem_pool` is `None` in sled-agent's ledger, + // sled-agent chooses a random zpool each time it launches + // the zone. Look at the provided inventory collection and + // attempt to find that zpool. This could be fail in two + // ways: + // + // 1. We might not have an inventory collection for this + // sled (in which case, we just skip this zone; we'll + // have to backfill it during some future planning run + // where we do have one) + // 2. sled-agent might have restarted the zone since the + // inventory collection was taken and chosen a + // _different_ zpool. We have no way of detecting this + // now, but must be willing to overwrite a non-`None` + // `filesystem_pool` value to correct ourselves if we've + // hit this case (without knowing it!) in a past planner + // run. + // + // We have a list of dataset names from inventory; we could + // try to parse those back into `DatasetName`s, but it's + // more straightforward to construct what this zone's + // `DatasetName` _would_ be (for any given zpool on the + // sled) and see if it's present in the inventory list. This + // is certainly less efficient than parsing the dataset name + // string, but we only have 10 zpools per sled, so shouldn't + // be too bad in practice. + let mut found_zpool = None; + let kind = DatasetKind::TransientZone { + name: illumos_utils::zone::zone_name( + zone.zone_type.kind().zone_prefix(), + Some(zone.id), + ), + }; + + for inv_zpool in inventory_zpools { + let zpool = ZpoolName::new_external(inv_zpool.id); + let dataset_name = DatasetName::new(zpool, kind.clone()); + let dataset_name_string = dataset_name.full_name(); + if inventory_datasets + .iter() + .any(|d| d.name == dataset_name_string) + { + found_zpool = Some(dataset_name.pool().clone()); + break; + } + } + + match found_zpool { + Some(zpool) => Cow::Owned(zpool), + None => { + warn!( + log, + "could not determine expected \ + `filesystem_pool` for zone"; + "zone_id" => %zone.id, + "zone_kind" => ?zone.zone_type.kind(), + "current_filesystem_pool" => ?zone.filesystem_pool, + ); + continue; + } + } + }; + + // If the pool is already correct, we have nothing to do. + if zone.filesystem_pool.as_ref() == Some(&*expected_filesystem_pool) + { + continue; + } + + info!( + log, + "updating filesystem_pool for zone"; + "zone_id" => %zone.id, + "zone_kind" => ?zone.zone_type.kind(), + "current_filesystem_pool" => ?zone.filesystem_pool, + "new_filesystem_zpool" => %expected_filesystem_pool, + ); + + // If we're _correcting_ a filesystem_pool rather than just + // filling it in, we also need to expunge the dataset from the + // incorrect value. + if let Some(old_filesystem) = zone.filesystem_dataset() { + let (pool, kind) = old_filesystem.into_parts(); + match self.datasets.expunge(&pool.id(), &kind) { + Ok(()) => (), + // We're trying to get rid of a potentially-orphaned + // dataset; it not existing is okay but unexpected! Log + // a warning but don't fail. + Err( + err @ DatasetsEditError::ExpungeNonexistentDataset { + .. + }, + ) => { + warn!( + log, + "unexpected failure trying to expunge dataset"; + InlineErrorChain::new(&err), + ); + } + } + } + + zones_to_edit + .insert(zone.id, expected_filesystem_pool.into_owned()); + } + + for (zone_id, new_filesystem_zpool) in zones_to_edit { + self.zones.backfill_filesystem_pool(zone_id, new_filesystem_zpool); + } + } } #[derive(Debug)] diff --git a/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/zones.rs b/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/zones.rs index db818047444..f48007d0457 100644 --- a/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/zones.rs +++ b/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/zones.rs @@ -3,6 +3,7 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. use crate::blueprint_builder::EditCounts; +use illumos_utils::zpool::ZpoolName; use nexus_sled_agent_shared::inventory::ZoneKind; use nexus_types::deployment::id_map::Entry; use nexus_types::deployment::id_map::IdMap; @@ -95,6 +96,32 @@ impl ZonesEditor { } } + /// Temporary method to backfill `filesystem_pool` properties for existing + /// zones. + /// + /// # Panics + /// + /// Panics if called with a nonexistent zone_id. This is not meant to be a + /// general-purpose method and should be removed entirely once all deployed + /// systems have this property backfilled successfully. + pub(super) fn backfill_filesystem_pool( + &mut self, + zone_id: OmicronZoneUuid, + filesystem_pool: ZpoolName, + ) { + let Some(mut zone) = self.zones.get_mut(&zone_id) else { + panic!( + "backfill_filesystem_pool called with \ + nonexistent zone id {zone_id}" + ); + }; + + if zone.filesystem_pool.as_ref() != Some(&filesystem_pool) { + zone.filesystem_pool = Some(filesystem_pool); + self.counts.updated += 1; + } + } + /// Expunge a zone, returning `true` if the zone was expunged and `false` if /// the zone was already expunged, along with the updated zone config. pub fn expunge( From 577665336f9aeead8a5a3d7237da8b60765dde6a Mon Sep 17 00:00:00 2001 From: iliana etaoin Date: Tue, 4 Feb 2025 21:44:04 -0800 Subject: [PATCH 05/43] `Generation` improvements (#7478) Closes #6865. This was primarily motivated by wanting a `FromStr` implementation for `Generation`, but I went ahead and fixed #6865 as well. I also wanted to have concrete error types instead of `anyhow::Error` for the conversion errors. --- common/src/api/external/mod.rs | 146 +++++++++++++++++++++++++-------- 1 file changed, 110 insertions(+), 36 deletions(-) diff --git a/common/src/api/external/mod.rs b/common/src/api/external/mod.rs index fd5cbe38042..117980bb2ed 100644 --- a/common/src/api/external/mod.rs +++ b/common/src/api/external/mod.rs @@ -13,7 +13,6 @@ pub use crate::api::internal::shared::AllowedSourceIps; pub use crate::api::internal::shared::SwitchLocation; use crate::update::ArtifactHash; use crate::update::ArtifactId; -use anyhow::anyhow; use anyhow::Context; use api_identity::ObjectIdentity; use chrono::DateTime; @@ -748,14 +747,10 @@ impl From for i64 { // disallow negative values. (We could potentially use two's complement to // store values greater than that as negative values, but surely 2**63 is // enough.) -// -// TODO: This allows deserialization into a value that's out of range. That's -// not correct. See . #[derive( Copy, Clone, Debug, - Deserialize, Eq, Hash, JsonSchema, @@ -766,25 +761,11 @@ impl From for i64 { )] pub struct Generation(u64); -// We have to manually implement `Diffable` because this is newtype with private -// data, and we want to see the diff on the newtype not the inner data. -impl<'a> Diffable<'a> for Generation { - type Diff = (&'a Generation, &'a Generation); - - fn diff(&'a self, other: &'a Self) -> edit::Edit<'a, Self> { - if self == other { - edit::Edit::Copy(self) - } else { - edit::Edit::Change { - before: self, - after: other, - diff: (self, other), - } - } - } -} - impl Generation { + // `as` is a little distasteful because it allows lossy conversion, but we + // know converting `i64::MAX` to `u64` will always succeed losslessly. + const MAX: Generation = Generation(i64::MAX as u64); + pub const fn new() -> Generation { Generation(1) } @@ -802,15 +783,47 @@ impl Generation { // exceeds the value allowed by an i64. But it seems unlikely enough to // happen in practice that we can probably feel safe with this. let next_gen = self.0 + 1; - // `as` is a little distasteful because it allows lossy conversion, but - // (a) we know converting `i64::MAX` to `u64` will always succeed - // losslessly, and (b) it allows to make this function `const`, unlike - // if we were to use `u64::try_from(i64::MAX).unwrap()`. - assert!(next_gen <= i64::MAX as u64); + assert!( + next_gen <= Generation::MAX.0, + "attempt to overflow generation number" + ); Generation(next_gen) } } +impl<'de> Deserialize<'de> for Generation { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let value = u64::deserialize(deserializer)?; + Generation::try_from(value).map_err(|GenerationOverflowError(_)| { + serde::de::Error::invalid_value( + serde::de::Unexpected::Unsigned(value), + &"an integer between 0 and 9223372036854775807", + ) + }) + } +} + +// We have to manually implement `Diffable` because this is newtype with private +// data, and we want to see the diff on the newtype not the inner data. +impl<'a> Diffable<'a> for Generation { + type Diff = (&'a Generation, &'a Generation); + + fn diff(&'a self, other: &'a Self) -> edit::Edit<'a, Self> { + if self == other { + edit::Edit::Copy(self) + } else { + edit::Edit::Change { + before: self, + after: other, + diff: (self, other), + } + } + } +} + impl Display for Generation { fn fmt(&self, f: &mut Formatter<'_>) -> FormatResult { f.write_str(&self.0.to_string()) @@ -820,8 +833,6 @@ impl Display for Generation { impl From<&Generation> for i64 { fn from(g: &Generation) -> Self { // We have already validated that the value is within range. - // TODO-robustness We need to ensure that we don't deserialize a value - // out of range here. i64::try_from(g.0).unwrap() } } @@ -839,26 +850,43 @@ impl From for Generation { } impl TryFrom for Generation { - type Error = anyhow::Error; + type Error = GenerationNegativeError; fn try_from(value: i64) -> Result { Ok(Generation( - u64::try_from(value) - .map_err(|_| anyhow!("negative generation number"))?, + u64::try_from(value).map_err(|_| GenerationNegativeError(()))?, )) } } impl TryFrom for Generation { - type Error = anyhow::Error; + type Error = GenerationOverflowError; fn try_from(value: u64) -> Result { - i64::try_from(value) - .map_err(|_| anyhow!("generation number too large"))?; + i64::try_from(value).map_err(|_| GenerationOverflowError(()))?; Ok(Generation(value)) } } +impl FromStr for Generation { + type Err = std::num::ParseIntError; + + fn from_str(s: &str) -> Result { + // Try to parse `s` as both an i64 and u64, returning the error from + // either. + let _ = i64::from_str(s)?; + Ok(Generation(u64::from_str(s)?)) + } +} + +#[derive(Debug, thiserror::Error)] +#[error("negative generation number")] +pub struct GenerationNegativeError(()); + +#[derive(Debug, thiserror::Error)] +#[error("generation number too large")] +pub struct GenerationOverflowError(()); + /// An RFC-1035-compliant hostname. #[derive( Clone, Debug, Deserialize, Display, Eq, PartialEq, SerializeDisplay, @@ -3192,6 +3220,7 @@ mod test { use serde::Deserialize; use serde::Serialize; + use super::Generation; use super::RouteDestination; use super::RouteTarget; use super::SemverVersion; @@ -3514,6 +3543,51 @@ mod test { ); } + #[test] + fn test_generation_display_parse() { + assert_eq!(Generation::new().to_string(), "1"); + assert_eq!(Generation::from_str("1").unwrap(), Generation::new()); + } + + #[test] + fn test_generation_serde() { + assert_eq!(serde_json::to_string(&Generation::new()).unwrap(), "1"); + assert_eq!( + serde_json::from_str::("1").unwrap(), + Generation::new() + ); + } + + #[test] + fn test_generation_from_int() { + for good_value in [0, Generation::MAX.0] { + Generation::try_from(good_value).unwrap(); + serde_json::from_str::(&good_value.to_string()) + .unwrap(); + } + for good_value in [0, i64::MAX] { + Generation::try_from(good_value).unwrap(); + serde_json::from_str::(&good_value.to_string()) + .unwrap(); + } + for bad_value in [Generation::MAX.0 + 1, u64::MAX] { + Generation::try_from(bad_value).unwrap_err(); + serde_json::from_str::(&bad_value.to_string()) + .unwrap_err(); + } + for bad_value in [-1, i64::MIN] { + Generation::try_from(bad_value).unwrap_err(); + serde_json::from_str::(&bad_value.to_string()) + .unwrap_err(); + } + } + + #[test] + #[should_panic(expected = "attempt to overflow generation number")] + fn test_generation_overflow() { + Generation::MAX.next(); + } + #[test] fn test_ip_port_range_from_str() { assert_eq!( From 31a766f971b9c5fdfec73bc86e657f24569de25f Mon Sep 17 00:00:00 2001 From: "oxide-renovate[bot]" <146848827+oxide-renovate[bot]@users.noreply.github.com> Date: Wed, 5 Feb 2025 01:59:47 -0800 Subject: [PATCH 06/43] Update Rust crate async-trait to 0.1.86 (#7472) --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 602ae6a21fa..7a66a1c1147 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -487,9 +487,9 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.85" +version = "0.1.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 7fa49f6298f..95e2f7a0045 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -318,7 +318,7 @@ approx = "0.5.1" assert_matches = "1.5.0" assert_cmd = "2.0.16" async-bb8-diesel = "0.2" -async-trait = "0.1.85" +async-trait = "0.1.86" atomicwrites = "0.4.4" authz-macros = { path = "nexus/authz-macros" } aws-lc-rs = "1.10.0" From 2064aeb645229e6aa2c782ea94229dff0030c349 Mon Sep 17 00:00:00 2001 From: iliana etaoin Date: Wed, 5 Feb 2025 08:47:52 -0800 Subject: [PATCH 07/43] Update to Rust 1.84.1 (#7453) https://blog.rust-lang.org/2025/01/30/Rust-1.84.1.html --- rust-toolchain.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust-toolchain.toml b/rust-toolchain.toml index db40dacb74f..faa480366f9 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -2,5 +2,5 @@ # We choose a specific toolchain (rather than "stable") for repeatability. The # intent is to keep this up-to-date with recently-released stable Rust. -channel = "1.84.0" +channel = "1.84.1" profile = "default" From ae63a611670b4bc4c8486dbf82f26e89e8ed7866 Mon Sep 17 00:00:00 2001 From: "Andrew J. Stone" Date: Wed, 5 Feb 2025 16:40:44 -0500 Subject: [PATCH 08/43] Perform semantic blueprint diffs via `daft` (#7466) This PR introduces the generation of automated blueprint diffs via [daft](https://github.com/oxidecomputer/daft). It is still necessary to massage the automated diff output into existing types so that we can present them graphically. This is performed via a wrapper, `BlueprintDiffSummary`, which is also used in tests. This change is 100% backwards compatible and generates identical diff output to the hand rolled diffs. Functionality was recently added to `daft` to [allow lazy diffing](https://github.com/oxidecomputer/daft/pull/16), via stopping recursion and returning a `Leaf` even if a field of a struct is itself a diffable struct. Doing this allows us to not recures into smaller structures like `ZpoolName` that we want to treat opaquely, and also allows us to maintain some handwritten diffs for output that is not changing any time soon, such as `BlueprintMetadata` and `ClickhouseClusterConfig`. This PR supercedes https://github.com/oxidecomputer/omicron/pull/7402 and removes all previously merged diffus related visitors. It also removes some left over types dealing with diffing collections and blueprints which is not currently supported. Follow up PRs will expand our diff output using the new functionality to add things like dataset disposition, etc... --- Cargo.lock | 56 +- Cargo.toml | 2 +- clickhouse-admin/types/Cargo.toml | 2 +- clickhouse-admin/types/src/lib.rs | 6 +- common/Cargo.toml | 2 +- common/src/api/external/mod.rs | 43 +- common/src/api/internal/shared.rs | 10 +- common/src/disk.rs | 8 +- common/src/zpool_name.rs | 17 +- live-tests/tests/test_nexus_add_remove.rs | 12 +- nexus-sled-agent-shared/Cargo.toml | 2 +- nexus-sled-agent-shared/src/inventory.rs | 4 +- nexus/reconfigurator/planning/Cargo.toml | 2 +- .../planning/src/blueprint_builder/builder.rs | 4 +- nexus/reconfigurator/planning/src/planner.rs | 463 ++--- nexus/types/Cargo.toml | 2 +- nexus/types/src/deployment.rs | 112 +- nexus/types/src/deployment/blueprint_diff.rs | 1615 +++++++++-------- .../types/src/deployment/blueprint_display.rs | 25 +- nexus/types/src/deployment/clickhouse.rs | 4 +- nexus/types/src/deployment/diff_visitors.rs | 61 - .../visit_blueprint_datasets_config.rs | 588 ------ .../visit_blueprint_physical_disks_config.rs | 420 ----- .../visit_blueprint_zones_config.rs | 482 ----- nexus/types/src/deployment/id_map.rs | 27 +- .../types/src/deployment/network_resources.rs | 8 +- nexus/types/src/deployment/planning_input.rs | 6 +- nexus/types/src/deployment/zone_type.rs | 30 +- nexus/types/src/external_api/views.rs | 4 +- uuid-kinds/Cargo.toml | 2 +- uuid-kinds/src/lib.rs | 4 +- 31 files changed, 1274 insertions(+), 2749 deletions(-) delete mode 100644 nexus/types/src/deployment/diff_visitors.rs delete mode 100644 nexus/types/src/deployment/diff_visitors/visit_blueprint_datasets_config.rs delete mode 100644 nexus/types/src/deployment/diff_visitors/visit_blueprint_physical_disks_config.rs delete mode 100644 nexus/types/src/deployment/diff_visitors/visit_blueprint_zones_config.rs diff --git a/Cargo.lock b/Cargo.lock index 7a66a1c1147..3b8aa2e0678 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1436,8 +1436,8 @@ dependencies = [ "camino", "camino-tempfile", "chrono", + "daft", "derive_more", - "diffus", "expectorate", "itertools 0.13.0", "omicron-common", @@ -2054,6 +2054,28 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "daft" +version = "0.1.0" +source = "git+https://github.com/oxidecomputer/daft?branch=main#9e7b55349f61bded974cba9c1727a70a62586a37" +dependencies = [ + "daft-derive", + "newtype-uuid", + "oxnet", + "paste", + "uuid", +] + +[[package]] +name = "daft-derive" +version = "0.1.0" +source = "git+https://github.com/oxidecomputer/daft?branch=main#9e7b55349f61bded974cba9c1727a70a62586a37" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "darling" version = "0.20.10" @@ -2411,28 +2433,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" -[[package]] -name = "diffus" -version = "0.10.0" -source = "git+https://github.com/oxidecomputer/diffus?branch=oxide%2Fmain#e3cfd506a8be97e9740e94bc72e39b3b9c6bf3c2" -dependencies = [ - "diffus-derive", - "itertools 0.10.5", - "newtype-uuid", - "oxnet", - "uuid", -] - -[[package]] -name = "diffus-derive" -version = "0.10.0" -source = "git+https://github.com/oxidecomputer/diffus?branch=oxide%2Fmain#e3cfd506a8be97e9740e94bc72e39b3b9c6bf3c2" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "digest" version = "0.10.7" @@ -6125,8 +6125,8 @@ dependencies = [ "anyhow", "chrono", "clickhouse-admin-types", + "daft", "debug-ignore", - "diffus", "expectorate", "gateway-client", "illumos-utils", @@ -6253,7 +6253,7 @@ dependencies = [ name = "nexus-sled-agent-shared" version = "0.1.0" dependencies = [ - "diffus", + "daft", "illumos-utils", "omicron-common", "omicron-passwords", @@ -6354,9 +6354,9 @@ dependencies = [ "clap", "clickhouse-admin-types", "cookie", + "daft", "derive-where", "derive_more", - "diffus", "dropshot 0.15.1", "futures", "gateway-client", @@ -6793,7 +6793,7 @@ dependencies = [ "camino", "camino-tempfile", "chrono", - "diffus", + "daft", "dropshot 0.15.1", "expectorate", "futures", @@ -7470,7 +7470,7 @@ dependencies = [ name = "omicron-uuid-kinds" version = "0.1.0" dependencies = [ - "diffus", + "daft", "newtype-uuid", "paste", "proptest", diff --git a/Cargo.toml b/Cargo.toml index 95e2f7a0045..3b1bfa61d14 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -369,6 +369,7 @@ crucible-common = { git = "https://github.com/oxidecomputer/crucible", rev = "86 # NOTE: See above! csv = "1.3.1" curve25519-dalek = "4" +daft = { git = "https://github.com/oxidecomputer/daft", branch = "main", features = ["newtype-uuid1", "oxnet01", "uuid1"] } datatest-stable = "0.2.9" display-error-chain = "0.2.2" omicron-ddm-admin-client = { path = "clients/ddm-admin-client" } @@ -379,7 +380,6 @@ derive-where = "1.2.7" # Having the i-implement-... feature here makes diesel go away from the workspace-hack diesel = { version = "2.2.6", features = ["i-implement-a-third-party-backend-and-opt-into-breaking-changes", "postgres", "r2d2", "chrono", "serde_json", "network-address", "uuid"] } diesel-dtrace = "0.4.2" -diffus = { git = "https://github.com/oxidecomputer/diffus", branch = "oxide/main", features = ["uuid-impl", "derive", "newtype-uuid-impl", "oxnet-impl"] } dns-server = { path = "dns-server" } dns-server-api = { path = "dns-server-api" } dns-service-client = { path = "clients/dns-service-client" } diff --git a/clickhouse-admin/types/Cargo.toml b/clickhouse-admin/types/Cargo.toml index c8ee984abeb..c4e770bed91 100644 --- a/clickhouse-admin/types/Cargo.toml +++ b/clickhouse-admin/types/Cargo.toml @@ -14,7 +14,7 @@ camino.workspace = true camino-tempfile.workspace = true chrono.workspace = true derive_more.workspace = true -diffus.workspace = true +daft.workspace = true itertools.workspace = true omicron-common.workspace = true omicron-workspace-hack.workspace = true diff --git a/clickhouse-admin/types/src/lib.rs b/clickhouse-admin/types/src/lib.rs index 5797d396969..5193126db58 100644 --- a/clickhouse-admin/types/src/lib.rs +++ b/clickhouse-admin/types/src/lib.rs @@ -6,8 +6,8 @@ use anyhow::{bail, Context, Error, Result}; use atomicwrites::AtomicFile; use camino::Utf8PathBuf; use chrono::{DateTime, Utc}; +use daft::Diffable; use derive_more::{Add, AddAssign, Display, From}; -use diffus::Diffus; use itertools::Itertools; use omicron_common::api::external::Generation; use schemars::{ @@ -63,7 +63,7 @@ pub fn path_schema(gen: &mut SchemaGenerator) -> Schema { JsonSchema, Serialize, Deserialize, - Diffus, + Diffable, )] pub struct KeeperId(pub u64); @@ -83,7 +83,7 @@ pub struct KeeperId(pub u64); JsonSchema, Serialize, Deserialize, - Diffus, + Diffable, )] pub struct ServerId(pub u64); diff --git a/common/Cargo.toml b/common/Cargo.toml index f2797ed2b4d..4eebfe9a8ab 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -20,7 +20,7 @@ async-trait.workspace = true backoff.workspace = true camino.workspace = true chrono.workspace = true -diffus.workspace = true +daft.workspace = true dropshot.workspace = true futures.workspace = true hex.workspace = true diff --git a/common/src/api/external/mod.rs b/common/src/api/external/mod.rs index 117980bb2ed..8adb45beb50 100644 --- a/common/src/api/external/mod.rs +++ b/common/src/api/external/mod.rs @@ -17,7 +17,7 @@ use anyhow::Context; use api_identity::ObjectIdentity; use chrono::DateTime; use chrono::Utc; -use diffus::{edit, Diffable, Diffus}; +use daft::{leaf, Diffable}; use dropshot::HttpError; pub use dropshot::PaginationOrder; pub use error::*; @@ -223,7 +223,7 @@ impl<'a> TryFrom<&DataPageParams<'a, NameOrId>> for DataPageParams<'a, Uuid> { )] #[display("{0}")] #[serde(try_from = "String")] -#[derive(Diffus)] +#[derive(Diffable)] pub struct Name(String); /// `Name::try_from(String)` is the primary method for constructing an Name @@ -627,7 +627,7 @@ impl JsonSchema for RoleName { Eq, PartialOrd, Ord, - Diffus, + Diffable, )] pub struct ByteCount(u64); @@ -761,6 +761,8 @@ impl From for i64 { )] pub struct Generation(u64); +leaf!(Generation); + impl Generation { // `as` is a little distasteful because it allows lossy conversion, but we // know converting `i64::MAX` to `u64` will always succeed losslessly. @@ -806,24 +808,6 @@ impl<'de> Deserialize<'de> for Generation { } } -// We have to manually implement `Diffable` because this is newtype with private -// data, and we want to see the diff on the newtype not the inner data. -impl<'a> Diffable<'a> for Generation { - type Diff = (&'a Generation, &'a Generation); - - fn diff(&'a self, other: &'a Self) -> edit::Edit<'a, Self> { - if self == other { - edit::Edit::Copy(self) - } else { - edit::Edit::Change { - before: self, - after: other, - diff: (self, other), - } - } - } -} - impl Display for Generation { fn fmt(&self, f: &mut Formatter<'_>) -> FormatResult { f.write_str(&self.0.to_string()) @@ -2000,20 +1984,7 @@ impl JsonSchema for L4PortRange { )] pub struct MacAddr(pub macaddr::MacAddr6); -impl<'a> Diffable<'a> for MacAddr { - type Diff = (&'a Self, &'a Self); - fn diff(&'a self, other: &'a Self) -> edit::Edit<'a, Self> { - if self == other { - edit::Edit::Copy(self) - } else { - edit::Edit::Change { - before: self, - after: other, - diff: (self, other), - } - } - } -} +leaf!(MacAddr); impl MacAddr { // Guest MAC addresses begin with the Oxide OUI A8:40:25. Further, guest @@ -2178,7 +2149,7 @@ impl JsonSchema for MacAddr { Deserialize, Serialize, JsonSchema, - Diffus, + Diffable, )] pub struct Vni(u32); diff --git a/common/src/api/internal/shared.rs b/common/src/api/internal/shared.rs index 588117c71cf..6961b180cab 100644 --- a/common/src/api/internal/shared.rs +++ b/common/src/api/internal/shared.rs @@ -8,7 +8,7 @@ use crate::{ address::NUM_SOURCE_NAT_PORTS, api::external::{self, BfdMode, ImportExportPolicy, Name, Vni}, }; -use diffus::Diffus; +use daft::Diffable; use oxnet::{IpNet, Ipv4Net, Ipv6Net}; use schemars::JsonSchema; use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; @@ -36,7 +36,7 @@ use super::nexus::HostIdentifier; Serialize, JsonSchema, Hash, - Diffus, + Diffable, )] #[serde(tag = "type", rename_all = "snake_case")] pub enum NetworkInterfaceKind { @@ -60,7 +60,7 @@ pub enum NetworkInterfaceKind { PartialOrd, Ord, Hash, - Diffus, + Diffable, )] pub struct NetworkInterface { pub id: Uuid, @@ -91,7 +91,7 @@ pub struct NetworkInterface { PartialOrd, Ord, Hash, - Diffus, + Diffable, )] pub struct SourceNatConfig { /// The external address provided to the instance or service. @@ -896,7 +896,7 @@ pub struct ExternalIpGatewayMap { /// Describes the purpose of the dataset. #[derive( - Debug, Clone, PartialEq, Eq, Ord, PartialOrd, Hash, EnumCount, Diffus, + Debug, Clone, PartialEq, Eq, Ord, PartialOrd, Hash, EnumCount, Diffable, )] #[cfg_attr(feature = "testing", derive(test_strategy::Arbitrary))] pub enum DatasetKind { diff --git a/common/src/disk.rs b/common/src/disk.rs index c2e341f4d69..b5c3ef6b1c1 100644 --- a/common/src/disk.rs +++ b/common/src/disk.rs @@ -6,7 +6,7 @@ use anyhow::bail; use camino::{Utf8Path, Utf8PathBuf}; -use diffus::Diffus; +use daft::Diffable; use omicron_uuid_kinds::DatasetUuid; use omicron_uuid_kinds::PhysicalDiskUuid; use omicron_uuid_kinds::ZpoolUuid; @@ -175,7 +175,7 @@ impl DatasetName { Hash, PartialOrd, Ord, - Diffus, + Diffable, )] pub struct GzipLevel(u8); @@ -218,7 +218,7 @@ impl FromStr for GzipLevel { Hash, PartialOrd, Ord, - Diffus, + Diffable, )] #[serde(tag = "type", rename_all = "snake_case")] pub enum CompressionAlgorithm { @@ -413,7 +413,7 @@ impl DatasetsManagementResult { Serialize, Deserialize, JsonSchema, - Diffus, + Diffable, )] pub struct DiskIdentity { pub vendor: String, diff --git a/common/src/zpool_name.rs b/common/src/zpool_name.rs index 9852b46120b..39835935f00 100644 --- a/common/src/zpool_name.rs +++ b/common/src/zpool_name.rs @@ -5,7 +5,7 @@ //! Zpool labels and kinds shared between Nexus and Sled Agents use camino::{Utf8Path, Utf8PathBuf}; -use diffus::Diffus; +use daft::{leaf, Diffable}; use omicron_uuid_kinds::ZpoolUuid; use schemars::JsonSchema; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -16,7 +16,16 @@ pub const ZPOOL_INTERNAL_PREFIX: &str = "oxi_"; /// Describes the different classes of Zpools. #[derive( - Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, JsonSchema, Diffus, + Copy, + Clone, + Debug, + Hash, + PartialEq, + Eq, + PartialOrd, + Ord, + JsonSchema, + Diffable, )] #[serde(rename_all = "snake_case")] pub enum ZpoolKind { @@ -30,12 +39,14 @@ pub enum ZpoolKind { /// /// This expects that the format will be: `ox{i,p}_` - we parse the prefix /// when reading the structure, and validate that the UUID can be utilized. -#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Diffus)] +#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] pub struct ZpoolName { id: ZpoolUuid, kind: ZpoolKind, } +leaf!(ZpoolName); + const ZPOOL_NAME_REGEX: &str = r"^ox[ip]_[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"; /// Custom JsonSchema implementation to encode the constraints on Name. diff --git a/live-tests/tests/test_nexus_add_remove.rs b/live-tests/tests/test_nexus_add_remove.rs index 4e071d0e14e..f3c35182a93 100644 --- a/live-tests/tests/test_nexus_add_remove.rs +++ b/live-tests/tests/test_nexus_add_remove.rs @@ -72,15 +72,9 @@ async fn test_nexus_add_remove(lc: &LiveTestContext) { // Figure out which zone is new and make a new client for it. let diff = blueprint2.diff_since_blueprint(&blueprint1); - let new_zone = diff - .zones - .added - .values() - .next() - .expect("at least one sled with added zones") - .zones - .first() - .expect("at least one added zone on that sled"); + let zones = diff.added_zones(&sled_id).expect("sled has added zones"); + let new_zone = + zones.zones.first().expect("at least one added zone on that sled"); assert_eq!(new_zone.kind(), ZoneKind::Nexus); let new_zone_addr = new_zone.underlay_ip(); let new_zone_sockaddr = diff --git a/nexus-sled-agent-shared/Cargo.toml b/nexus-sled-agent-shared/Cargo.toml index ea83cb67aee..aa0b06b9ec5 100644 --- a/nexus-sled-agent-shared/Cargo.toml +++ b/nexus-sled-agent-shared/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" workspace = true [dependencies] -diffus.workspace = true +daft.workspace = true illumos-utils.workspace = true omicron-common.workspace = true omicron-passwords.workspace = true diff --git a/nexus-sled-agent-shared/src/inventory.rs b/nexus-sled-agent-shared/src/inventory.rs index b2b1001f9ba..20d4fcc55df 100644 --- a/nexus-sled-agent-shared/src/inventory.rs +++ b/nexus-sled-agent-shared/src/inventory.rs @@ -6,7 +6,7 @@ use std::net::{IpAddr, Ipv6Addr, SocketAddr, SocketAddrV6}; -use diffus::Diffus; +use daft::Diffable; use omicron_common::{ api::{ external::{ByteCount, Generation}, @@ -184,7 +184,7 @@ impl OmicronZoneConfig { PartialOrd, Ord, Hash, - Diffus, + Diffable, )] pub struct OmicronZoneDataset { pub pool_name: ZpoolName, diff --git a/nexus/reconfigurator/planning/Cargo.toml b/nexus/reconfigurator/planning/Cargo.toml index c7d978b387d..7e06cbe8a2f 100644 --- a/nexus/reconfigurator/planning/Cargo.toml +++ b/nexus/reconfigurator/planning/Cargo.toml @@ -11,7 +11,7 @@ anyhow.workspace = true clickhouse-admin-types.workspace = true chrono.workspace = true debug-ignore.workspace = true -diffus.workspace = true +daft.workspace = true gateway-client.workspace = true illumos-utils.workspace = true indexmap.workspace = true diff --git a/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs b/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs index ecdb02830c8..f910a60f58f 100644 --- a/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs +++ b/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs @@ -2149,10 +2149,10 @@ pub mod test { // One sled was added. assert_eq!(diff.sleds_added.len(), 1); let sled_id = diff.sleds_added.first().unwrap(); - let new_sled_zones = diff.zones.added.get(sled_id).unwrap(); + let new_sled_zones = diff.added_zones(sled_id).unwrap(); assert_eq!(*sled_id, new_sled_id); // The generation number should be newer than the initial default. - assert!(new_sled_zones.generation_after.unwrap() > Generation::new()); + assert!(new_sled_zones.generation_after > Some(Generation::new())); // All zones' underlay addresses ought to be on the sled's subnet. for z in &new_sled_zones.zones { diff --git a/nexus/reconfigurator/planning/src/planner.rs b/nexus/reconfigurator/planning/src/planner.rs index a6965e4d6dd..f687a25801b 100644 --- a/nexus/reconfigurator/planning/src/planner.rs +++ b/nexus/reconfigurator/planning/src/planner.rs @@ -802,7 +802,7 @@ mod test { use nexus_sled_agent_shared::inventory::ZoneKind; use nexus_types::deployment::blueprint_zone_type; use nexus_types::deployment::BlueprintDatasetDisposition; - use nexus_types::deployment::BlueprintDiff; + use nexus_types::deployment::BlueprintDiffSummary; use nexus_types::deployment::BlueprintZoneDisposition; use nexus_types::deployment::BlueprintZoneFilter; use nexus_types::deployment::BlueprintZoneType; @@ -869,21 +869,21 @@ mod test { .plan() .expect("failed to plan"); - let diff = blueprint2.diff_since_blueprint(&blueprint1); - println!("1 -> 2 (expected no changes):\n{}", diff.display()); - assert_eq!(diff.sleds_added.len(), 0); - assert_eq!(diff.sleds_removed.len(), 0); - assert_eq!(diff.sleds_modified.len(), 0); - assert_eq!(diff.zones.added.len(), 0); - assert_eq!(diff.zones.removed.len(), 0); - assert_eq!(diff.zones.modified.len(), 0); - assert_eq!(diff.zones.errors.len(), 0); - assert_eq!(diff.physical_disks.added.len(), 0); - assert_eq!(diff.physical_disks.removed.len(), 0); - assert_eq!(diff.datasets.added.len(), 0); - assert_eq!(diff.datasets.removed.len(), 0); - assert_eq!(diff.datasets.modified.len(), 0); - assert_eq!(diff.datasets.unchanged.len(), 3); + let summary = blueprint2.diff_since_blueprint(&blueprint1); + println!("1 -> 2 (expected no changes):\n{}", summary.display()); + assert_eq!(summary.sleds_added.len(), 0); + assert_eq!(summary.sleds_removed.len(), 0); + assert_eq!(summary.sleds_modified.len(), 0); + assert_eq!(summary.sleds_unchanged.len(), 3); + assert_eq!(summary.total_zones_added(), 0); + assert_eq!(summary.total_zones_removed(), 0); + assert_eq!(summary.total_zones_modified(), 0); + assert_eq!(summary.total_disks_added(), 0); + assert_eq!(summary.total_disks_removed(), 0); + assert_eq!(summary.total_disks_modified(), 0); + assert_eq!(summary.total_datasets_added(), 0); + assert_eq!(summary.total_datasets_removed(), 0); + assert_eq!(summary.total_datasets_modified(), 0); verify_blueprint(&blueprint2); // Now add a new sled. @@ -906,29 +906,34 @@ mod test { .plan() .expect("failed to plan"); - let diff = blueprint3.diff_since_blueprint(&blueprint2); + let summary = blueprint3.diff_since_blueprint(&blueprint2); println!( "2 -> 3 (expect new NTP zone on new sled):\n{}", - diff.display() + summary.display() ); assert_contents( "tests/output/planner_basic_add_sled_2_3.txt", - &diff.display().to_string(), + &summary.display().to_string(), ); - assert_eq!(diff.sleds_added.len(), 1); - assert_eq!(diff.physical_disks.added.len(), 1); - assert_eq!(diff.datasets.added.len(), 1); - let sled_id = *diff.sleds_added.first().unwrap(); - let sled_zones = diff.zones.added.get(&sled_id).unwrap(); + + assert_eq!(summary.sleds_added.len(), 1); + assert_eq!(summary.total_disks_added(), 10); + assert_eq!(summary.total_datasets_added(), 21); + let sled_id = *summary.sleds_added.first().unwrap(); + let sled_zones = + summary.diff.blueprint_zones.added.get(&sled_id).unwrap(); // We have defined elsewhere that the first generation contains no // zones. So the first one with zones must be newer. See // OmicronZonesConfig::INITIAL_GENERATION. - assert!(sled_zones.generation_after.unwrap() > Generation::new()); + assert!(sled_zones.generation > Generation::new()); assert_eq!(sled_id, new_sled_id); assert_eq!(sled_zones.zones.len(), 1); - assert!(matches!(sled_zones.zones[0].kind(), ZoneKind::InternalNtp)); - assert_eq!(diff.sleds_removed.len(), 0); - assert_eq!(diff.sleds_modified.len(), 0); + assert!(matches!( + sled_zones.zones.first().unwrap().kind(), + ZoneKind::InternalNtp + )); + assert_eq!(summary.sleds_removed.len(), 0); + assert_eq!(summary.sleds_modified.len(), 0); verify_blueprint(&blueprint3); // Check that with no change in inventory, the planner makes no changes. @@ -945,11 +950,11 @@ mod test { .with_rng(PlannerRng::from_seed((TEST_NAME, "bp4"))) .plan() .expect("failed to plan"); - let diff = blueprint4.diff_since_blueprint(&blueprint3); - println!("3 -> 4 (expected no changes):\n{}", diff.display()); - assert_eq!(diff.sleds_added.len(), 0); - assert_eq!(diff.sleds_removed.len(), 0); - assert_eq!(diff.sleds_modified.len(), 0); + let summary = blueprint4.diff_since_blueprint(&blueprint3); + println!("3 -> 4 (expected no changes):\n{}", summary.display()); + assert_eq!(summary.sleds_added.len(), 0); + assert_eq!(summary.sleds_removed.len(), 0); + assert_eq!(summary.sleds_modified.len(), 0); verify_blueprint(&blueprint4); // Now update the inventory to have the requested NTP zone. @@ -985,29 +990,29 @@ mod test { .plan() .expect("failed to plan"); - let diff = blueprint5.diff_since_blueprint(&blueprint3); - println!("3 -> 5 (expect Crucible zones):\n{}", diff.display()); + let summary = blueprint5.diff_since_blueprint(&blueprint3); + println!("3 -> 5 (expect Crucible zones):\n{}", summary.display()); assert_contents( "tests/output/planner_basic_add_sled_3_5.txt", - &diff.display().to_string(), + &summary.display().to_string(), ); - assert_eq!(diff.sleds_added.len(), 0); - assert_eq!(diff.sleds_removed.len(), 0); - assert_eq!(diff.sleds_modified.len(), 1); - let sled_id = diff.sleds_modified.first().unwrap(); + assert_eq!(summary.sleds_added.len(), 0); + assert_eq!(summary.sleds_removed.len(), 0); + assert_eq!(summary.sleds_modified.len(), 1); + let sled_id = summary.sleds_modified.first().unwrap(); assert_eq!(*sled_id, new_sled_id); // No removed or modified zones on this sled - assert!(!diff.zones.removed.contains_key(sled_id)); - assert!(!diff.zones.modified.contains_key(sled_id)); + let zones_cfg_diff = summary.zones_on_modified_sled(sled_id).unwrap(); + assert!(zones_cfg_diff.zones.removed.is_empty()); + assert!(zones_cfg_diff.zones.modified.is_empty()); // 10 crucible zones addeed - let zones_added = diff.zones.added.get(sled_id).unwrap(); assert_eq!( - zones_added.generation_after.unwrap(), - zones_added.generation_before.unwrap().next() + *zones_cfg_diff.generation.after, + zones_cfg_diff.generation.before.next() ); - assert_eq!(zones_added.zones.len(), 10); - for zone in &zones_added.zones { + assert_eq!(zones_cfg_diff.zones.added.len(), 10); + for zone in zones_cfg_diff.zones.added.values() { if zone.kind() != ZoneKind::Crucible { panic!("unexpectedly added a non-Crucible zone: {zone:?}"); } @@ -1080,28 +1085,31 @@ mod test { .plan() .expect("failed to plan"); - let diff = blueprint2.diff_since_blueprint(&blueprint1); - println!("1 -> 2 (added additional Nexus zones):\n{}", diff.display()); - assert_eq!(diff.sleds_added.len(), 0); - assert_eq!(diff.sleds_removed.len(), 0); - assert_eq!(diff.sleds_modified.len(), 1); - let changed_sled_id = diff.sleds_modified.first().unwrap(); + let summary = blueprint2.diff_since_blueprint(&blueprint1); + println!( + "1 -> 2 (added additional Nexus zones):\n{}", + summary.display() + ); + assert_eq!(summary.sleds_added.len(), 0); + assert_eq!(summary.sleds_removed.len(), 0); + assert_eq!(summary.sleds_modified.len(), 1); + let changed_sled_id = summary.sleds_modified.first().unwrap(); assert_eq!(*changed_sled_id, sled_id); - assert_eq!(diff.zones.removed.len(), 0); - assert_eq!(diff.zones.modified.len(), 0); - assert_eq!(diff.physical_disks.added.len(), 0); - assert_eq!(diff.physical_disks.removed.len(), 0); - assert_eq!(diff.datasets.added.len(), 1); - assert_eq!(diff.datasets.modified.len(), 0); - assert_eq!(diff.datasets.removed.len(), 0); - - let zones_added = diff.zones.added.get(changed_sled_id).unwrap(); assert_eq!( - zones_added.zones.len(), - input.target_nexus_zone_count() - 1 + summary + .datasets_on_modified_sled(&sled_id) + .unwrap() + .datasets + .added + .len(), + 4 ); - for zone in &zones_added.zones { + + let zones_added = + &summary.zones_on_modified_sled(&sled_id).unwrap().zones.added; + assert_eq!(zones_added.len(), input.target_nexus_zone_count() - 1); + for (_, zone) in zones_added { if zone.kind() != ZoneKind::Nexus { panic!("unexpectedly added a non-Nexus zone: {zone:?}"); } @@ -1158,20 +1166,29 @@ mod test { .plan() .expect("failed to plan"); - let diff = blueprint2.diff_since_blueprint(&blueprint1); - println!("1 -> 2 (added additional Nexus zones):\n{}", diff.display()); - assert_eq!(diff.sleds_added.len(), 0); - assert_eq!(diff.sleds_removed.len(), 0); - assert_eq!(diff.sleds_modified.len(), 3); + let summary = blueprint2.diff_since_blueprint(&blueprint1); + println!( + "1 -> 2 (added additional Nexus zones):\n{}", + summary.display() + ); + assert_eq!(summary.sleds_added.len(), 0); + assert_eq!(summary.sleds_removed.len(), 0); + assert_eq!(summary.sleds_modified.len(), 3); // All 3 sleds should get additional Nexus zones. We expect a total of // 11 new Nexus zones, which should be spread evenly across the three // sleds (two should get 4 and one should get 3). let mut total_new_nexus_zones = 0; - for sled_id in diff.sleds_modified { - assert!(!diff.zones.removed.contains_key(&sled_id)); - assert!(!diff.zones.modified.contains_key(&sled_id)); - let zones_added = &diff.zones.added.get(&sled_id).unwrap().zones; + for sled_id in &summary.sleds_modified { + assert!(!summary + .diff + .blueprint_zones + .removed + .contains_key(sled_id)); + let zones_cfg_diff = + summary.zones_on_modified_sled(sled_id).unwrap(); + assert!(zones_cfg_diff.zones.modified.is_empty()); + let zones_added = &zones_cfg_diff.zones.added; match zones_added.len() { n @ (3 | 4) => { total_new_nexus_zones += n; @@ -1180,7 +1197,7 @@ mod test { panic!("unexpected number of zones added to {sled_id}: {n}") } } - for zone in zones_added { + for (_, zone) in zones_added { if zone.kind() != ZoneKind::Nexus { panic!("unexpectedly added a non-Nexus zone: {zone:?}"); } @@ -1283,38 +1300,39 @@ mod test { .plan() .expect("failed to plan"); - let diff = blueprint2.diff_since_blueprint(&blueprint1); + let summary = blueprint2.diff_since_blueprint(&blueprint1); println!( "1 -> 2 (added additional internal DNS zones):\n{}", - diff.display() + summary.display() ); - assert_eq!(diff.sleds_added.len(), 0); - assert_eq!(diff.sleds_removed.len(), 0); - assert_eq!(diff.sleds_modified.len(), 2); + assert_eq!(summary.sleds_added.len(), 0); + assert_eq!(summary.sleds_removed.len(), 0); + assert_eq!(summary.sleds_modified.len(), 2); // 2 sleds should each get 1 additional internal DNS zone. let mut total_new_zones = 0; - for sled_id in diff.sleds_modified { - assert!(!diff.zones.removed.contains_key(&sled_id)); - assert!(!diff.zones.modified.contains_key(&sled_id)); - if let Some(zones_added) = &diff.zones.added.get(&sled_id) { - let zones = &zones_added.zones; - match zones.len() { - n @ 1 => { - total_new_zones += n; - } - n => { - panic!("unexpected number of zones added to {sled_id}: {n}") - } + for sled_id in &summary.sleds_modified { + let zones_diff = + &summary.zones_on_modified_sled(&sled_id).unwrap().zones; + assert!(zones_diff.removed.is_empty()); + assert!(zones_diff.modified.is_empty()); + let zones_added = &zones_diff.added; + match zones_added.len() { + 0 => {} + n @ 1 => { + total_new_zones += n; } - for zone in zones { - assert_eq!( - zone.kind(), - ZoneKind::InternalDns, - "unexpectedly added a non-internal-DNS zone: {zone:?}" - ); + n => { + panic!("unexpected number of zones added to {sled_id}: {n}") } } + for (_, zone) in zones_added { + assert_eq!( + zone.kind(), + ZoneKind::InternalDns, + "unexpectedly added a non-internal-DNS zone: {zone:?}" + ); + } } assert_eq!(total_new_zones, 2); @@ -1669,22 +1687,24 @@ mod test { .plan() .expect("failed to plan"); - let diff = blueprint2.diff_since_blueprint(&blueprint1); - println!("1 -> 2 (some new disks, one expunged):\n{}", diff.display()); - assert_eq!(diff.sleds_modified.len(), 1); - let sled_id = diff.sleds_modified.first().unwrap(); + let summary = blueprint2.diff_since_blueprint(&blueprint1); + println!( + "1 -> 2 (some new disks, one expunged):\n{}", + summary.display() + ); + assert_eq!(summary.sleds_modified.len(), 1); // We should be adding a Crucible zone for each new in-service disk. - assert_eq!( - diff.zones.added.get(sled_id).unwrap().zones.len(), - NEW_IN_SERVICE_DISKS - ); - assert!(!diff.zones.removed.contains_key(sled_id)); - assert_eq!(diff.physical_disks.added.len(), 1); - assert_eq!(diff.physical_disks.removed.len(), 0); - assert_eq!(diff.datasets.added.len(), 1); - assert_eq!(diff.datasets.modified.len(), 0); - assert_eq!(diff.datasets.removed.len(), 0); + assert_eq!(summary.total_zones_added(), NEW_IN_SERVICE_DISKS); + assert_eq!(summary.total_zones_removed(), 0); + assert_eq!(summary.total_disks_added(), NEW_IN_SERVICE_DISKS); + assert_eq!(summary.total_disks_removed(), 0); + + // 1 Zone, Crucible, Transient Crucible Zone, and Debug dataset created + // per disk. + assert_eq!(summary.total_datasets_added(), NEW_IN_SERVICE_DISKS * 4); + assert_eq!(summary.total_datasets_removed(), 0); + assert_eq!(summary.total_datasets_modified(), 0); // Test a no-op planning iteration. assert_planning_makes_no_changes( @@ -1752,25 +1772,26 @@ mod test { .plan() .expect("failed to plan"); - let diff = blueprint2.diff_since_blueprint(&blueprint1); - println!("1 -> 2 (modify a dataset):\n{}", diff.display()); + let summary = blueprint2.diff_since_blueprint(&blueprint1); + println!("1 -> 2 (modify a dataset):\n{}", summary.display()); assert_contents( "tests/output/planner_dataset_settings_modified_in_place_1_2.txt", - &diff.display().to_string(), + &summary.display().to_string(), ); - assert_eq!(diff.sleds_added.len(), 0); - assert_eq!(diff.sleds_removed.len(), 0); - assert_eq!(diff.sleds_modified.len(), 1); + assert_eq!(summary.sleds_added.len(), 0); + assert_eq!(summary.sleds_removed.len(), 0); + assert_eq!(summary.sleds_modified.len(), 1); - assert_eq!(diff.zones.added.len(), 0); - assert_eq!(diff.zones.removed.len(), 0); - assert_eq!(diff.zones.modified.len(), 0); - assert_eq!(diff.physical_disks.added.len(), 0); - assert_eq!(diff.physical_disks.removed.len(), 0); - assert_eq!(diff.datasets.added.len(), 0); - assert_eq!(diff.datasets.removed.len(), 0); - assert_eq!(diff.datasets.modified.len(), 1); + assert_eq!(summary.total_zones_added(), 0); + assert_eq!(summary.total_zones_removed(), 0); + assert_eq!(summary.total_zones_modified(), 0); + assert_eq!(summary.total_disks_added(), 0); + assert_eq!(summary.total_disks_removed(), 0); + assert_eq!(summary.total_disks_modified(), 0); + assert_eq!(summary.total_datasets_added(), 0); + assert_eq!(summary.total_datasets_removed(), 0); + assert_eq!(summary.total_datasets_modified(), 1); logctx.cleanup_successful(); } @@ -1837,27 +1858,27 @@ mod test { .plan() .expect("failed to plan"); - let diff = blueprint2.diff_since_blueprint(&blueprint1); - println!("1 -> 2 (expunge a disk):\n{}", diff.display()); - assert_eq!(diff.sleds_added.len(), 0); - assert_eq!(diff.sleds_removed.len(), 0); - assert_eq!(diff.sleds_modified.len(), 1); + let summary = blueprint2.diff_since_blueprint(&blueprint1); + println!("1 -> 2 (expunge a disk):\n{}", summary.display()); + assert_eq!(summary.sleds_added.len(), 0); + assert_eq!(summary.sleds_removed.len(), 0); + assert_eq!(summary.sleds_modified.len(), 1); // We should be removing a single zone, associated with the Crucible // using that device. - assert_eq!(diff.zones.added.len(), 0); - assert_eq!(diff.zones.removed.len(), 0); - assert_eq!(diff.zones.modified.len(), 1); - assert_eq!(diff.physical_disks.added.len(), 0); - assert_eq!(diff.physical_disks.removed.len(), 1); - assert_eq!(diff.datasets.added.len(), 0); + assert_eq!(summary.total_zones_added(), 0); + assert_eq!(summary.total_zones_removed(), 0); + assert_eq!(summary.total_zones_modified(), 1); + assert_eq!(summary.total_disks_added(), 0); + assert_eq!(summary.total_disks_removed(), 1); + assert_eq!(summary.total_datasets_added(), 0); // NOTE: Expunging a disk doesn't immediately delete datasets; see the // "decommissioned_disk_cleaner" background task for more context. - assert_eq!(diff.datasets.removed.len(), 0); + assert_eq!(summary.total_datasets_removed(), 0); // The disposition has changed from `InService` to `Expunged` for the 4 // datasets on this sled. - assert_eq!(diff.datasets.modified.len(), 1); + assert_eq!(summary.total_datasets_modified(), 4); // We don't know the expected name, other than the fact it's a crucible zone let test_transient_zone_kind = DatasetKind::TransientZone { name: "some-crucible-zone-name".to_string(), @@ -1868,37 +1889,43 @@ mod test { DatasetKind::TransientZoneRoot, test_transient_zone_kind.clone(), ]); - for modified in - &diff.datasets.modified.first_key_value().unwrap().1.datasets + for (_, sled_with_modified_datasets) in + &summary.diff.blueprint_datasets.modified { - assert_eq!( - modified.before.disposition, - BlueprintDatasetDisposition::InService - ); - assert_eq!( - modified.after.disposition, - BlueprintDatasetDisposition::Expunged - ); - if let DatasetKind::TransientZone { name } = &modified.before.kind { - assert!(name.starts_with("oxz_crucible")); - assert!(expected_kinds.remove(&test_transient_zone_kind)); - } else { - assert!(expected_kinds.remove(&modified.before.kind)); + for (_, modified) in &sled_with_modified_datasets.datasets.modified + { + assert_eq!( + *modified.disposition.before, + BlueprintDatasetDisposition::InService + ); + assert_eq!( + *modified.disposition.after, + BlueprintDatasetDisposition::Expunged + ); + if let DatasetKind::TransientZone { name } = + &modified.kind.before + { + assert!(name.starts_with("oxz_crucible")); + assert!(expected_kinds.remove(&test_transient_zone_kind)); + } else { + assert!(expected_kinds.remove(&modified.kind.before)); + } } } assert!(expected_kinds.is_empty()); let (_zone_id, modified_zones) = - diff.zones.modified.iter().next().unwrap(); - assert_eq!(modified_zones.zones.len(), 1); - let modified_zone = &modified_zones.zones.first().unwrap().zone; + summary.diff.blueprint_zones.modified.iter().next().unwrap(); + assert_eq!(modified_zones.zones.modified.len(), 1); + let (_, modified_zone) = + &modified_zones.zones.modified.first_key_value().unwrap(); assert!( - matches!(modified_zone.kind(), ZoneKind::Crucible), + matches!(modified_zone.zone_type.before.kind(), ZoneKind::Crucible), "Expected the modified zone to be a Crucible zone, but it was: {:?}", - modified_zone.kind() + modified_zone.zone_type.before.kind() ); assert_eq!( - modified_zone.disposition, + *modified_zone.disposition.after, BlueprintZoneDisposition::Expunged, "Should have expunged this zone" ); @@ -1998,30 +2025,33 @@ mod test { .plan() .expect("failed to plan"); - let diff = blueprint2.diff_since_blueprint(&blueprint1); - println!("1 -> 2 (expunge a disk):\n{}", diff.display()); - assert_eq!(diff.sleds_added.len(), 0); - assert_eq!(diff.sleds_removed.len(), 0); - assert_eq!(diff.sleds_modified.len(), 1); + let summary = blueprint2.diff_since_blueprint(&blueprint1); + println!("1 -> 2 (expunge a disk):\n{}", summary.display()); + assert_eq!(summary.sleds_added.len(), 0); + assert_eq!(summary.sleds_removed.len(), 0); + assert_eq!(summary.sleds_modified.len(), 1); // We should be removing all zones using this zpool. Because we're // removing the NTP zone, we should add a new one. - assert_eq!(diff.zones.added.len(), 1); - assert_eq!(diff.zones.removed.len(), 0); - assert_eq!(diff.zones.modified.len(), 1); - - let (_zone_id, added_zones) = diff.zones.added.iter().next().unwrap(); - assert_eq!(added_zones.zones.len(), 1); - for zone in &added_zones.zones { + assert_eq!(summary.total_zones_added(), 1); + assert_eq!(summary.total_zones_removed(), 0); + assert_eq!(summary.total_zones_modified(), 6); + + let (_zone_id, zones_on_a_modified_sled) = + summary.diff.blueprint_zones.modified.iter().next().unwrap(); + let added_zones = &zones_on_a_modified_sled.zones.added; + assert_eq!(added_zones.len(), 1); + for (_, zone) in added_zones { assert_eq!(zone.kind(), ZoneKind::InternalNtp); } - let (_zone_id, modified_zones) = - diff.zones.modified.iter().next().unwrap(); - assert_eq!(modified_zones.zones.len(), zones_using_zpool); - for modified_zone in &modified_zones.zones { + assert_eq!( + zones_on_a_modified_sled.zones.modified.len(), + zones_using_zpool + ); + for (_, modified_zone) in &zones_on_a_modified_sled.zones.modified { assert_eq!( - modified_zone.zone.disposition, + *modified_zone.disposition.after, BlueprintZoneDisposition::Expunged, "Should have expunged this zone" ); @@ -2154,14 +2184,14 @@ mod test { &blueprint2.display().to_string(), ); - let diff = blueprint2.diff_since_blueprint(&blueprint1); + let summary = blueprint2.diff_since_blueprint(&blueprint1); println!( "1 -> 2 (added additional Nexus zones, take 2 sleds out of service):\n{}", - diff.display() + summary.display() ); assert_contents( "tests/output/planner_nonprovisionable_1_2.txt", - &diff.display().to_string(), + &summary.display().to_string(), ); // The expunged and decommissioned sleds should have had all zones be @@ -2172,16 +2202,18 @@ mod test { // cleanup, and we aren't performing garbage collection on zones or // sleds at the moment. - assert_eq!(diff.sleds_added.len(), 0); - assert_eq!(diff.sleds_removed.len(), 0); + assert_eq!(summary.sleds_added.len(), 0); + assert_eq!(summary.sleds_removed.len(), 0); + assert_eq!(summary.sleds_modified.len(), 4); + assert_eq!(summary.sleds_unchanged.len(), 1); - assert_all_zones_expunged(&diff, expunged_sled_id, "expunged sled"); + assert_all_zones_expunged(&summary, expunged_sled_id, "expunged sled"); // Only 2 of the 3 remaining sleds (not the non-provisionable sled) // should get additional Nexus zones. We expect a total of 6 new Nexus // zones, which should be split evenly between the two sleds, while the // non-provisionable sled should be unchanged. - let mut remaining_modified_sleds = diff.sleds_modified.clone(); + let mut remaining_modified_sleds = summary.sleds_modified.clone(); remaining_modified_sleds.remove(&expunged_sled_id); remaining_modified_sleds.remove(&decommissioned_sled_id); @@ -2191,10 +2223,11 @@ mod test { assert!(sled_id != nonprovisionable_sled_id); assert!(sled_id != expunged_sled_id); assert!(sled_id != decommissioned_sled_id); - assert!(!diff.zones.removed.contains_key(&sled_id)); - assert!(!diff.zones.modified.contains_key(&sled_id)); - let zones = &diff.zones.added.get(&sled_id).unwrap().zones; - for zone in zones { + let zones_on_modified_sled = + &summary.zones_on_modified_sled(&sled_id).unwrap().zones; + assert!(zones_on_modified_sled.removed.is_empty()); + let zones = &zones_on_modified_sled.added; + for (_, zone) in zones { if ZoneKind::Nexus != zone.kind() { panic!("unexpectedly added a non-Nexus zone: {zone:?}"); }; @@ -2301,13 +2334,18 @@ mod test { } #[track_caller] - fn assert_all_zones_expunged( - diff: &BlueprintDiff, + fn assert_all_zones_expunged<'a>( + summary: &'a BlueprintDiffSummary<'a>, expunged_sled_id: SledUuid, desc: &str, ) { assert!( - !diff.zones.added.contains_key(&expunged_sled_id), + summary + .diff + .blueprint_zones + .added + .get(&expunged_sled_id) + .map_or(true, |zones| zones.zones.is_empty()), "for {desc}, no zones should have been added to blueprint" ); @@ -2317,26 +2355,31 @@ mod test { // process that isn't currently defined. assert!( - !diff.zones.removed.contains_key(&expunged_sled_id), + summary + .diff + .blueprint_zones + .removed + .get(&expunged_sled_id) + .map_or(true, |zones| zones.zones.is_empty()), "for {desc}, no zones should have been removed from blueprint" ); // Run through all the common zones and ensure that all of them // have been marked expunged. let modified_zones = - diff.zones.modified.get(&expunged_sled_id).unwrap(); + summary.zones_on_modified_sled(&expunged_sled_id).unwrap(); assert_eq!( - modified_zones.generation_before.next(), - modified_zones.generation_after, + modified_zones.generation.before.next(), + *modified_zones.generation.after, "for {desc}, generation should have been bumped" ); - for modified_zone in &modified_zones.zones { + for (_, modified_zone) in &modified_zones.zones.modified { assert_eq!( - modified_zone.zone.disposition, + *modified_zone.disposition.after, BlueprintZoneDisposition::Expunged, "for {desc}, zone {} should have been marked expunged", - modified_zone.zone.id + modified_zone.id.after ); } } @@ -2421,16 +2464,16 @@ mod test { // collect zones, so we should still have the sled's expunged zones // (even though the sled itself is no longer present in the list of // commissioned sleds). - let diff = blueprint3.diff_since_blueprint(&blueprint2); + let summary = blueprint3.diff_since_blueprint(&blueprint2); println!( "2 -> 3 (decommissioned {expunged_sled_id}):\n{}", - diff.display() + summary.display() ); - assert_eq!(diff.sleds_added.len(), 0); - assert_eq!(diff.sleds_removed.len(), 0); - assert_eq!(diff.sleds_modified.len(), 0); + assert_eq!(summary.sleds_added.len(), 0); + assert_eq!(summary.sleds_removed.len(), 0); + assert_eq!(summary.sleds_modified.len(), 0); assert_eq!( - diff.sleds_unchanged.len(), + summary.sleds_unchanged.len(), ExampleSystemBuilder::DEFAULT_N_SLEDS ); @@ -2467,16 +2510,16 @@ mod test { .plan() .expect("succeeded in planner"); - let diff = blueprint4.diff_since_blueprint(&blueprint3); + let summary = blueprint4.diff_since_blueprint(&blueprint3); println!( "3 -> 4 (removed from input {expunged_sled_id}):\n{}", - diff.display() + summary.display() ); - assert_eq!(diff.sleds_added.len(), 0); - assert_eq!(diff.sleds_removed.len(), 0); - assert_eq!(diff.sleds_modified.len(), 0); + assert_eq!(summary.sleds_added.len(), 0); + assert_eq!(summary.sleds_removed.len(), 0); + assert_eq!(summary.sleds_modified.len(), 0); assert_eq!( - diff.sleds_unchanged.len(), + summary.sleds_unchanged.len(), ExampleSystemBuilder::DEFAULT_N_SLEDS ); diff --git a/nexus/types/Cargo.toml b/nexus/types/Cargo.toml index edf22679ef4..30916f3eb76 100644 --- a/nexus/types/Cargo.toml +++ b/nexus/types/Cargo.toml @@ -15,9 +15,9 @@ chrono.workspace = true clap.workspace = true clickhouse-admin-types.workspace = true cookie.workspace = true +daft.workspace = true derive-where.workspace = true derive_more.workspace = true -diffus.workspace = true dropshot.workspace = true futures.workspace = true http.workspace = true diff --git a/nexus/types/src/deployment.rs b/nexus/types/src/deployment.rs index ff9627491f8..64981ab7026 100644 --- a/nexus/types/src/deployment.rs +++ b/nexus/types/src/deployment.rs @@ -18,7 +18,7 @@ use crate::inventory::Collection; pub use crate::inventory::SourceNatConfig; pub use crate::inventory::ZpoolName; use blueprint_diff::ClickhouseClusterConfigDiffTablesForSingleBlueprint; -use diffus::Diffus; +use daft::Diffable; use nexus_sled_agent_shared::inventory::OmicronZoneConfig; use nexus_sled_agent_shared::inventory::OmicronZonesConfig; use nexus_sled_agent_shared::inventory::ZoneKind; @@ -34,7 +34,6 @@ use omicron_common::disk::OmicronPhysicalDiskConfig; use omicron_common::disk::OmicronPhysicalDisksConfig; use omicron_common::disk::SharedDatasetConfig; use omicron_uuid_kinds::BlueprintUuid; -use omicron_uuid_kinds::CollectionUuid; use omicron_uuid_kinds::DatasetUuid; use omicron_uuid_kinds::OmicronZoneUuid; use omicron_uuid_kinds::PhysicalDiskUuid; @@ -54,7 +53,6 @@ use strum::IntoEnumIterator; mod blueprint_diff; mod blueprint_display; mod clickhouse; -pub mod diff_visitors; pub mod execution; pub mod id_map; mod network_resources; @@ -63,7 +61,6 @@ mod tri_map; mod zone_type; pub use clickhouse::ClickhouseClusterConfig; -pub use diff_visitors::BpVisitorContext; pub use network_resources::AddNetworkResourceError; pub use network_resources::OmicronZoneExternalFloatingAddr; pub use network_resources::OmicronZoneExternalFloatingIp; @@ -102,7 +99,7 @@ use blueprint_display::{ }; use id_map::{IdMap, IdMappable}; -pub use blueprint_diff::BlueprintDiff; +pub use blueprint_diff::BlueprintDiffSummary; /// Describes a complete set of software and configuration for the system // Blueprints are a fundamental part of how the system modifies itself. Each @@ -143,7 +140,7 @@ pub use blueprint_diff::BlueprintDiff; // This is aimed at supporting add/remove sleds. The plan is to grow this to // include more of the system as we support more use cases. #[derive( - Clone, Debug, Eq, PartialEq, JsonSchema, Deserialize, Serialize, Diffus, + Clone, Debug, Eq, PartialEq, JsonSchema, Deserialize, Serialize, Diffable, )] pub struct Blueprint { /// unique identifier for this blueprint @@ -191,10 +188,14 @@ pub struct Blueprint { /// Allocation of Clickhouse Servers and Keepers for replicated clickhouse /// setups. This is set to `None` if replicated clickhouse is not in use. + // + // We already have some manual diff code for this, and don't expect the + // structure to change any time soon. + #[daft(leaf)] pub clickhouse_cluster_config: Option, /// when this blueprint was generated (for debugging) - #[diffus(ignore)] + #[daft(ignore)] pub time_created: chrono::DateTime, /// identity of the component that generated the blueprint (for debugging) /// This would generally be the Uuid of a Nexus instance. @@ -285,28 +286,11 @@ impl Blueprint { /// /// The argument provided is the "before" side, and `self` is the "after" /// side. - pub fn diff_since_blueprint(&self, before: &Blueprint) -> BlueprintDiff { - BlueprintDiff::new( - DiffBeforeMetadata::Blueprint(Box::new(before.metadata())), - DiffBeforeClickhouseClusterConfig::from(before), - before.sled_state.clone(), - before - .blueprint_zones - .iter() - .map(|(sled_id, zones)| (*sled_id, zones.clone())) - .collect(), - before - .blueprint_disks - .iter() - .map(|(sled_id, disks)| (*sled_id, disks.clone())) - .collect(), - before - .blueprint_datasets - .iter() - .map(|(sled_id, datasets)| (*sled_id, datasets.clone())) - .collect(), - &self, - ) + pub fn diff_since_blueprint<'a>( + &'a self, + before: &'a Blueprint, + ) -> BlueprintDiffSummary<'a> { + BlueprintDiffSummary::new(before, self) } /// Return a struct that can be displayed to present information about the @@ -550,7 +534,7 @@ impl fmt::Display for BlueprintDisplay<'_> { /// /// Part of [`Blueprint`]. #[derive( - Debug, Clone, Eq, PartialEq, JsonSchema, Deserialize, Serialize, Diffus, + Debug, Clone, Eq, PartialEq, JsonSchema, Deserialize, Serialize, Diffable, )] pub struct BlueprintZonesConfig { /// Generation number of this configuration. @@ -647,7 +631,7 @@ fn zone_sort_key(z: &T) -> impl Ord { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct BlueprintZoneConfig { /// The disposition (desired state) of this zone recorded in the blueprint. @@ -667,12 +651,6 @@ impl IdMappable for BlueprintZoneConfig { } } -impl diffus::Same for BlueprintZoneConfig { - fn same(&self, other: &Self) -> bool { - self == other - } -} - impl BlueprintZoneConfig { /// Returns the underlay IP address associated with this zone. /// @@ -724,7 +702,7 @@ impl From for OmicronZoneConfig { Deserialize, Serialize, EnumIter, - Diffus, + Diffable, )] #[serde(rename_all = "snake_case")] pub enum BlueprintZoneDisposition { @@ -868,7 +846,7 @@ pub enum BlueprintDatasetFilter { Deserialize, Serialize, EnumIter, - Diffus, + Diffable, )] #[serde(rename_all = "snake_case")] pub enum BlueprintPhysicalDiskDisposition { @@ -901,7 +879,7 @@ impl BlueprintPhysicalDiskDisposition { /// Information about an Omicron physical disk as recorded in a bluerprint. #[derive( - Clone, Debug, Deserialize, Serialize, JsonSchema, PartialEq, Eq, Diffus, + Clone, Debug, Deserialize, Serialize, JsonSchema, PartialEq, Eq, Diffable, )] pub struct BlueprintPhysicalDiskConfig { pub disposition: BlueprintPhysicalDiskDisposition, @@ -914,7 +892,7 @@ pub struct BlueprintPhysicalDiskConfig { /// /// Part of [`Blueprint`]. #[derive( - Clone, Debug, Deserialize, Serialize, JsonSchema, PartialEq, Eq, Diffus, + Clone, Debug, Deserialize, Serialize, JsonSchema, PartialEq, Eq, Diffable, )] pub struct BlueprintPhysicalDisksConfig { pub generation: Generation, @@ -929,12 +907,6 @@ impl IdMappable for BlueprintPhysicalDiskConfig { } } -impl diffus::Same for BlueprintPhysicalDiskConfig { - fn same(&self, other: &Self) -> bool { - self == other - } -} - // Required by RSS impl Default for BlueprintPhysicalDisksConfig { fn default() -> Self { @@ -970,7 +942,7 @@ impl From for OmicronPhysicalDisksConfig { /// Information about Omicron datasets as recorded in a blueprint. #[derive( - Debug, Clone, Eq, PartialEq, JsonSchema, Deserialize, Serialize, Diffus, + Debug, Clone, Eq, PartialEq, JsonSchema, Deserialize, Serialize, Diffable, )] pub struct BlueprintDatasetsConfig { pub generation: Generation, @@ -1014,7 +986,7 @@ impl IdMappable for BlueprintDatasetConfig { Deserialize, Serialize, EnumIter, - Diffus, + Diffable, )] #[serde(rename_all = "snake_case")] pub enum BlueprintDatasetDisposition { @@ -1053,7 +1025,7 @@ impl BlueprintDatasetDisposition { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct BlueprintDatasetConfig { // TODO: Display this in diffs - leave for now, for backwards compat @@ -1130,12 +1102,6 @@ pub struct BlueprintMetadata { pub comment: String, } -impl BlueprintMetadata { - pub fn display_id(&self) -> String { - format!("blueprint {}", self.id) - } -} - /// Describes what blueprint, if any, the system is currently working toward #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, JsonSchema)] pub struct BlueprintTarget { @@ -1156,40 +1122,6 @@ pub struct BlueprintTargetSet { pub enabled: bool, } -/// Data about the "before" version within a [`BlueprintDiff`]. -#[derive(Clone, Debug)] -pub enum DiffBeforeMetadata { - /// The diff was made from a collection. - Collection { id: CollectionUuid }, - /// The diff was made from a blueprint. - Blueprint(Box), -} - -impl DiffBeforeMetadata { - pub fn display_id(&self) -> String { - match self { - DiffBeforeMetadata::Collection { id } => format!("collection {id}"), - DiffBeforeMetadata::Blueprint(b) => b.display_id(), - } - } -} - -/// Data about the "before" version within a [`BlueprintDiff`] -/// -/// We only track keepers in inventory collections. -#[derive(Clone, Debug)] -pub enum DiffBeforeClickhouseClusterConfig { - Blueprint(Option), -} - -impl From<&Blueprint> for DiffBeforeClickhouseClusterConfig { - fn from(value: &Blueprint) -> Self { - DiffBeforeClickhouseClusterConfig::Blueprint( - value.clickhouse_cluster_config.clone(), - ) - } -} - /// A unique identifier for a dataset within a collection. /// TODO: Should we use just the `DatasetUuid` and re-organize the tables to put the `DatasetUuid` first? /// This was kept for backwards compatibility, even though IDs are not optional diff --git a/nexus/types/src/deployment/blueprint_diff.rs b/nexus/types/src/deployment/blueprint_diff.rs index 72c08557f45..71f2bd59090 100644 --- a/nexus/types/src/deployment/blueprint_diff.rs +++ b/nexus/types/src/deployment/blueprint_diff.rs @@ -11,13 +11,16 @@ use super::blueprint_display::{ BpTable, BpTableColumn, BpTableData, BpTableRow, KvListWithHeading, KvPair, }; use super::{ - zone_sort_key, Blueprint, ClickhouseClusterConfig, - CockroachDbPreserveDowngrade, DiffBeforeClickhouseClusterConfig, + unwrap_or_none, zone_sort_key, BlueprintDatasetConfigDiff, + BlueprintDatasetsConfigDiff, BlueprintDiff, BlueprintMetadata, + BlueprintPhysicalDiskConfig, BlueprintPhysicalDisksConfigDiff, + BlueprintZoneConfigDiff, BlueprintZonesConfigDiff, ClickhouseClusterConfig, + CockroachDbPreserveDowngrade, }; -use diffus::Diffable; +use daft::Diffable; use nexus_sled_agent_shared::inventory::ZoneKind; use omicron_common::api::external::Generation; -use omicron_common::disk::DiskIdentity; +use omicron_common::disk::{DatasetName, DiskIdentity}; use omicron_uuid_kinds::OmicronZoneUuid; use omicron_uuid_kinds::SledUuid; use std::collections::{BTreeMap, BTreeSet}; @@ -25,12 +28,598 @@ use std::fmt; use crate::deployment::blueprint_display::BpClickhouseKeepersTableSchema; use crate::deployment::{ - BlueprintDatasetConfig, BlueprintDatasetsConfig, BlueprintMetadata, - BlueprintPhysicalDisksConfig, BlueprintZoneConfig, - BlueprintZoneDisposition, BlueprintZonesConfig, - CollectionDatasetIdentifier, DiffBeforeMetadata, ZoneSortKey, + Blueprint, BlueprintDatasetConfig, BlueprintZoneConfig, + BlueprintZoneDisposition, CollectionDatasetIdentifier, ZoneSortKey, }; -use crate::external_api::views::SledState; + +// A wrapper type around a `daft` generated `BlueprintDiff that provides summary +// data and direct access to the underlying diff. +#[derive(Debug)] +pub struct BlueprintDiffSummary<'a> { + pub before: &'a Blueprint, + pub after: &'a Blueprint, + pub diff: BlueprintDiff<'a>, + pub all_sleds: BTreeSet, + pub sleds_added: BTreeSet, + pub sleds_removed: BTreeSet, + pub sleds_modified: BTreeSet, + pub sleds_unchanged: BTreeSet, +} + +impl<'a> BlueprintDiffSummary<'a> { + pub fn new(before: &'a Blueprint, after: &'a Blueprint) -> Self { + let diff = before.diff(after); + // We assume for now that sled_state additions represent sled additions. + // Once we collapse the 4 blueprint maps this will be unambiguously + // true. + let sleds_added: BTreeSet = + diff.sled_state.added.keys().map(|k| **k).collect(); + + // We can't do the same for removals unfortunately. We prematurely + // prune decommissioned sleds, but there may still be zones, disks, + // or datasets that have not yet been removed. We must check for this. + let mut sleds_removed: BTreeSet<_> = + diff.blueprint_zones.removed.keys().map(|k| **k).collect(); + + sleds_removed.retain(|sled_id| { + // Disks and datasets are removed + (diff.blueprint_disks.removed.contains_key(sled_id) + && diff.blueprint_datasets.removed.contains_key(sled_id)) || + + // Disks and datasets don't exist + (!diff.blueprint_disks.unchanged.contains_key(sled_id) + && !diff.blueprint_disks.added.contains_key(sled_id) + && !diff.blueprint_disks.modified.contains_key(sled_id) + && !diff.blueprint_datasets.unchanged.contains_key(sled_id) + && !diff.blueprint_datasets.added.contains_key(sled_id) + && !diff.blueprint_datasets.modified.contains_key(sled_id) + ) + }); + + // In principle, sleds_unchanged are the intersection of all unchanged + // sets. + // + // Because of backwards compatibility however, the zones may still be + // present when expunged, but disks and datasets gone. Because of this, + // if there are no unchanged disks and datasets for the same sleds with + // unchanged zones, then we must check to see if there are any modified, + // added, or removed disks or datasets at all on the given sled. If not, + // we consider those sleds unchanged. + let mut sleds_unchanged: BTreeSet<_> = + diff.blueprint_zones.unchanged.keys().map(|id| **id).collect(); + + sleds_unchanged.retain(|sled_id| { + // Disks and datasets are unchanged + (diff.blueprint_disks.unchanged.contains_key(sled_id) + && diff.blueprint_datasets.unchanged.contains_key(sled_id)) || + + // Disks and datasets don't exist + (!diff.blueprint_disks.removed.contains_key(sled_id) + && !diff.blueprint_disks.added.contains_key(sled_id) + && !diff.blueprint_disks.modified.contains_key(sled_id) + && !diff.blueprint_datasets.removed.contains_key(sled_id) + && !diff.blueprint_datasets.added.contains_key(sled_id) + && !diff.blueprint_datasets.modified.contains_key(sled_id) + ) + }); + + // Modifieds sleds are the union of sleds modified in `sled_state`, + // `blueprint_zones`, `blueprint_disks`, and `blueprint_datasets`. + // + // Because of backwards compatibility, disks and datasets get removed + // when expunged. Because of this we must also check for removed disks + // and datasets that are not in removed sleds. + let mut sleds_modified: BTreeSet<_> = diff + .sled_state + .modified + .keys() + .chain(diff.blueprint_zones.modified.keys()) + .chain(diff.blueprint_disks.modified.keys()) + .chain(diff.blueprint_datasets.modified.keys()) + .map(|k| **k) + .collect(); + for sled_id in diff + .blueprint_disks + .removed + .keys() + .chain(diff.blueprint_datasets.removed.keys()) + { + if !sleds_removed.contains(*sled_id) { + sleds_modified.insert(**sled_id); + } + } + + let all_sleds = sleds_added + .iter() + .chain(sleds_removed.iter()) + .chain(sleds_modified.iter()) + .chain(sleds_unchanged.iter()) + .cloned() + .collect(); + + BlueprintDiffSummary { + before, + after, + diff, + all_sleds, + sleds_added, + sleds_removed, + sleds_modified, + sleds_unchanged, + } + } + + /// Return a struct that can be used to display the diff. + pub fn display(&'a self) -> BlueprintDiffDisplay<'a> { + BlueprintDiffDisplay::new(self) + } + + /// Returns whether the diff reflects any changes or if the blueprints are + /// equivalent. + pub fn has_changes(&self) -> bool { + // Any changes to physical disks, datasets, or zones would be reflected + // in `self.sleds_modified`, `self.sleds_added`, or + // `self.sleds_removed`. + if !self.sleds_modified.is_empty() + || !self.sleds_added.is_empty() + || !self.sleds_removed.is_empty() + { + return true; + } + + self.diff.clickhouse_cluster_config.before + != self.diff.clickhouse_cluster_config.after + } + + /// The number of zones added across all sleds + pub fn total_zones_added(&self) -> usize { + self.diff + .blueprint_zones + .added + .values() + .fold(0, |acc, c| acc + c.zones.len()) + + self + .diff + .blueprint_zones + .modified + .values() + .fold(0, |acc, c| acc + c.zones.added.len()) + } + + /// The number of zones removed across all sleds + pub fn total_zones_removed(&self) -> usize { + self.diff + .blueprint_zones + .removed + .values() + .fold(0, |acc, c| acc + c.zones.len()) + + self + .diff + .blueprint_zones + .modified + .values() + .fold(0, |acc, c| acc + c.zones.removed.len()) + } + /// The number of zones modified across all sleds + pub fn total_zones_modified(&self) -> usize { + self.diff + .blueprint_zones + .modified + .values() + .fold(0, |acc, c| acc + c.zones.modified.len()) + } + + /// The number of disks added across all sleds + pub fn total_disks_added(&self) -> usize { + self.diff + .blueprint_disks + .added + .values() + .fold(0, |acc, c| acc + c.disks.len()) + + self + .diff + .blueprint_disks + .modified + .values() + .fold(0, |acc, c| acc + c.disks.added.len()) + } + + /// The number of disks removed across all sleds + pub fn total_disks_removed(&self) -> usize { + self.diff + .blueprint_disks + .removed + .values() + .fold(0, |acc, c| acc + c.disks.len()) + + self + .diff + .blueprint_disks + .modified + .values() + .fold(0, |acc, c| acc + c.disks.removed.len()) + } + /// The number of disks modified across all sleds + pub fn total_disks_modified(&self) -> usize { + self.diff + .blueprint_disks + .modified + .values() + .fold(0, |acc, c| acc + c.disks.modified.len()) + } + + /// The number of datasets added across all sleds + pub fn total_datasets_added(&self) -> usize { + self.diff + .blueprint_datasets + .added + .values() + .fold(0, |acc, c| acc + c.datasets.len()) + + self + .diff + .blueprint_datasets + .modified + .values() + .fold(0, |acc, c| acc + c.datasets.added.len()) + } + + /// The number of datasets removed across all sleds + pub fn total_datasets_removed(&self) -> usize { + self.diff + .blueprint_datasets + .removed + .values() + .fold(0, |acc, c| acc + c.datasets.len()) + + self + .diff + .blueprint_datasets + .modified + .values() + .fold(0, |acc, c| acc + c.datasets.removed.len()) + } + /// The number of datasets modified across all sleds + pub fn total_datasets_modified(&self) -> usize { + self.diff + .blueprint_datasets + .modified + .values() + .fold(0, |acc, c| acc + c.datasets.modified.len()) + } + + /// Return the `BlueprintZonesConfigDiff` for a modified sled + pub fn zones_on_modified_sled( + &self, + sled_id: &SledUuid, + ) -> Option<&'a BlueprintZonesConfigDiff> { + self.diff.blueprint_zones.modified.get(sled_id) + } + + /// Return the `BlueprintDisksConfigDiff` for a modified sled + pub fn disks_on_modified_sled( + &self, + sled_id: &SledUuid, + ) -> Option<&'a BlueprintPhysicalDisksConfigDiff> { + self.diff.blueprint_disks.modified.get(sled_id) + } + + /// Return the `BlueprintDatasetsConfigDiff` for a modified sled + pub fn datasets_on_modified_sled( + &self, + sled_id: &SledUuid, + ) -> Option<&'a BlueprintDatasetsConfigDiff> { + self.diff.blueprint_datasets.modified.get(sled_id) + } + + /// Iterate over all added zones on a sled + pub fn added_zones(&self, sled_id: &SledUuid) -> Option { + // First check if the sled is added + if let Some(&zones_cfg) = self.diff.blueprint_zones.added.get(sled_id) { + if zones_cfg.zones.is_empty() { + return None; + } + return Some(BpDiffZoneDetails::new( + None, + Some(zones_cfg.generation), + zones_cfg.zones.iter(), + )); + } + + // Then check if the sled is modified and there are any added zones + let zones_cfg_diff = self.diff.blueprint_zones.modified.get(sled_id)?; + if zones_cfg_diff.zones.added.is_empty() { + return None; + } + Some(BpDiffZoneDetails::new( + Some(*zones_cfg_diff.generation.before), + Some(*zones_cfg_diff.generation.after), + zones_cfg_diff.zones.added.values().map(|z| *z), + )) + } + + /// Iterate over all removed zones on a sled + pub fn removed_zones( + &self, + sled_id: &SledUuid, + ) -> Option { + // First check if the sled is removed + if let Some(&zones_cfg) = self.diff.blueprint_zones.removed.get(sled_id) + { + if zones_cfg.zones.is_empty() { + return None; + } + return Some(BpDiffZoneDetails::new( + Some(zones_cfg.generation), + None, + zones_cfg.zones.iter(), + )); + } + + // Then check if the sled is modified and there are any removed zones + let zones_cfg_diff = self.diff.blueprint_zones.modified.get(sled_id)?; + if zones_cfg_diff.zones.removed.is_empty() { + return None; + } + Some(BpDiffZoneDetails::new( + Some(*zones_cfg_diff.generation.before), + Some(*zones_cfg_diff.generation.after), + zones_cfg_diff.zones.removed.values().map(|z| *z), + )) + } + + /// Iterate over all modified zones on a sled + pub fn modified_zones( + &'a self, + sled_id: &SledUuid, + ) -> Option<(BpDiffZonesModified, BpDiffZoneErrors)> { + // Then check if the sled is modified and there are any modified zones + let zones_cfg_diff = self.diff.blueprint_zones.modified.get(sled_id)?; + if zones_cfg_diff.zones.modified.is_empty() { + return None; + } + Some(BpDiffZonesModified::new( + *zones_cfg_diff.generation.before, + *zones_cfg_diff.generation.after, + zones_cfg_diff.zones.modified.values(), + )) + } + + /// Iterate over all unchanged zones on a sled + pub fn unchanged_zones( + &self, + sled_id: &SledUuid, + ) -> Option { + // First check if the sled is unchanged + if let Some(&zones_cfg) = + self.diff.blueprint_zones.unchanged.get(sled_id) + { + if zones_cfg.zones.is_empty() { + return None; + } + return Some(BpDiffZoneDetails::new( + None, + Some(zones_cfg.generation), + zones_cfg.zones.iter(), + )); + } + + // Then check if the sled is modified and there are any unchanged zones + let zones_cfg_diff = self.diff.blueprint_zones.modified.get(sled_id)?; + if zones_cfg_diff.zones.unchanged.is_empty() { + return None; + } + Some(BpDiffZoneDetails::new( + Some(*zones_cfg_diff.generation.before), + Some(*zones_cfg_diff.generation.after), + zones_cfg_diff.zones.unchanged.values().map(|z| *z), + )) + } + + /// Iterate over all added disks on a sled + pub fn added_disks( + &self, + sled_id: &SledUuid, + ) -> Option { + // First check if the sled is added + if let Some(&disks_cfg) = self.diff.blueprint_disks.added.get(sled_id) { + if disks_cfg.disks.is_empty() { + return None; + } + return Some(DiffPhysicalDisksDetails::new( + None, + Some(disks_cfg.generation), + disks_cfg.disks.iter(), + )); + } + + // Then check if the sled is modified and there are any added disks + let disks_cfg_diff = self.diff.blueprint_disks.modified.get(sled_id)?; + if disks_cfg_diff.disks.added.is_empty() { + return None; + } + Some(DiffPhysicalDisksDetails::new( + Some(*disks_cfg_diff.generation.before), + Some(*disks_cfg_diff.generation.after), + disks_cfg_diff.disks.added.values().map(|z| *z), + )) + } + + /// Iterate over all removed disks on a sled + pub fn removed_disks( + &self, + sled_id: &SledUuid, + ) -> Option { + // First check if the sled is removed + if let Some(&disks_cfg) = self.diff.blueprint_disks.removed.get(sled_id) + { + if disks_cfg.disks.is_empty() { + return None; + } + return Some(DiffPhysicalDisksDetails::new( + Some(disks_cfg.generation), + None, + disks_cfg.disks.iter(), + )); + } + + // Then check if the sled is modified and there are any removed disks + let disks_cfg_diff = self.diff.blueprint_disks.modified.get(sled_id)?; + if disks_cfg_diff.disks.removed.is_empty() { + return None; + } + Some(DiffPhysicalDisksDetails::new( + Some(*disks_cfg_diff.generation.before), + Some(*disks_cfg_diff.generation.after), + disks_cfg_diff.disks.removed.values().map(|z| *z), + )) + } + + /// Iterate over all unchanged disks on a sled + pub fn unchanged_disks( + &self, + sled_id: &SledUuid, + ) -> Option { + // First check if the sled is unchanged + if let Some(&disks_cfg) = + self.diff.blueprint_disks.unchanged.get(sled_id) + { + if disks_cfg.disks.is_empty() { + return None; + } + return Some(DiffPhysicalDisksDetails::new( + None, + Some(disks_cfg.generation), + disks_cfg.disks.iter(), + )); + } + + // Then check if the sled is modified and there are any unchanged disks + let disks_cfg_diff = self.diff.blueprint_disks.modified.get(sled_id)?; + if disks_cfg_diff.disks.unchanged.is_empty() { + return None; + } + Some(DiffPhysicalDisksDetails::new( + Some(*disks_cfg_diff.generation.before), + Some(*disks_cfg_diff.generation.after), + disks_cfg_diff.disks.unchanged.values().map(|z| *z), + )) + } + + /// Iterate over all added datasets on a sled + pub fn added_datasets( + &self, + sled_id: &SledUuid, + ) -> Option { + // First check if the sled is added + if let Some(&datasets_cfg) = + self.diff.blueprint_datasets.added.get(sled_id) + { + if datasets_cfg.datasets.is_empty() { + return None; + } + return Some(DiffDatasetsDetails::new( + None, + Some(datasets_cfg.generation), + datasets_cfg.datasets.iter(), + )); + } + + // Then check if the sled is modified and there are any added datasets + let datasets_cfg_diff = + self.diff.blueprint_datasets.modified.get(sled_id)?; + if datasets_cfg_diff.datasets.added.is_empty() { + return None; + } + Some(DiffDatasetsDetails::new( + Some(*datasets_cfg_diff.generation.before), + Some(*datasets_cfg_diff.generation.after), + datasets_cfg_diff.datasets.added.values().map(|z| *z), + )) + } + + /// Iterate over all removed datasets on a sled + pub fn removed_datasets( + &self, + sled_id: &SledUuid, + ) -> Option { + // First check if the sled is removed + if let Some(&datasets_cfg) = + self.diff.blueprint_datasets.removed.get(sled_id) + { + if datasets_cfg.datasets.is_empty() { + return None; + } + return Some(DiffDatasetsDetails::new( + Some(datasets_cfg.generation), + None, + datasets_cfg.datasets.iter(), + )); + } + + // Then check if the sled is modified and there are any removed datasets + let datasets_cfg_diff = + self.diff.blueprint_datasets.modified.get(sled_id)?; + if datasets_cfg_diff.datasets.removed.is_empty() { + return None; + } + Some(DiffDatasetsDetails::new( + Some(*datasets_cfg_diff.generation.before), + Some(*datasets_cfg_diff.generation.after), + datasets_cfg_diff.datasets.removed.values().map(|z| *z), + )) + } + + /// Iterate over all unchanged datasets on a sled + pub fn unchanged_datasets( + &self, + sled_id: &SledUuid, + ) -> Option { + // First check if the sled is unchanged + if let Some(&datasets_cfg) = + self.diff.blueprint_datasets.unchanged.get(sled_id) + { + if datasets_cfg.datasets.is_empty() { + return None; + } + return Some(DiffDatasetsDetails::new( + None, + Some(datasets_cfg.generation), + datasets_cfg.datasets.iter(), + )); + } + + // Then check if the sled is modified and there are any unchanged datasets + let datasets_cfg_diff = + self.diff.blueprint_datasets.modified.get(sled_id)?; + if datasets_cfg_diff.datasets.unchanged.is_empty() { + return None; + } + Some(DiffDatasetsDetails::new( + Some(*datasets_cfg_diff.generation.before), + Some(*datasets_cfg_diff.generation.after), + datasets_cfg_diff.datasets.unchanged.values().map(|z| *z), + )) + } + + /// Iterate over all modified datasets on a sled + pub fn modified_datasets( + &'a self, + sled_id: &SledUuid, + ) -> Option> { + // Check if the sled is modified and there are any modified datasets + let datasets_cfg_diff = + self.diff.blueprint_datasets.modified.get(sled_id)?; + if datasets_cfg_diff.datasets.modified.is_empty() { + return None; + } + let mut datasets: Vec<_> = + datasets_cfg_diff.datasets.modified.values().collect(); + datasets.sort_unstable_by_key(|d| (d.kind.before, d.pool.before)); + Some(BpDiffDatasetsModified { + generation_before: *datasets_cfg_diff.generation.before, + generation_after: *datasets_cfg_diff.generation.after, + datasets, + }) + } +} /// Diffs for omicron zones on a given sled with a given `BpDiffState` #[derive(Debug)] @@ -40,6 +629,18 @@ pub struct BpDiffZoneDetails { pub zones: Vec, } +impl BpDiffZoneDetails { + pub fn new<'a>( + generation_before: Option, + generation_after: Option, + zones_iter: impl Iterator, + ) -> Self { + let mut zones: Vec<_> = zones_iter.cloned().collect(); + zones.sort_unstable_by_key(zone_sort_key); + BpDiffZoneDetails { generation_before, generation_after, zones } + } +} + impl BpTableData for BpDiffZoneDetails { fn bp_generation(&self) -> BpGeneration { BpGeneration::Diff { @@ -85,45 +686,52 @@ impl ZoneSortKey for ModifiedZone { } impl ModifiedZone { - #[allow(clippy::result_large_err)] - pub fn new( - before: BlueprintZoneConfig, - after: BlueprintZoneConfig, + pub fn from_diff( + diff: &BlueprintZoneConfigDiff, ) -> Result { // Do we have any errors? If so, create a "reason" string. let mut reason = String::new(); - if before.kind() != after.kind() { + // These first two checks are only for backwards compatibility. They are + // all included in the zone_type comparison below. + if diff.zone_type.before.kind() != diff.zone_type.after.kind() { let msg = format!( "mismatched zone kind: before: {}, after: {}\n", - before.kind().report_str(), - after.kind().report_str(), + diff.zone_type.before.kind().report_str(), + diff.zone_type.after.kind().report_str(), ); reason.push_str(&msg); } - if before.underlay_ip() != after.underlay_ip() { + if diff.zone_type.before.underlay_ip() + != diff.zone_type.after.underlay_ip() + { let msg = format!( "mismatched underlay IP: before: {}, after: {}\n", - before.underlay_ip(), - after.underlay_ip() + diff.zone_type.before.underlay_ip(), + diff.zone_type.after.underlay_ip() ); reason.push_str(&msg); } - if before.zone_type != after.zone_type { + if diff.zone_type.before != diff.zone_type.after { let msg = format!( "mismatched zone type: after: {:#?}\n", - after.zone_type + diff.zone_type.after ); reason.push_str(&msg); } if reason.is_empty() { Ok(ModifiedZone { - prior_disposition: before.disposition, - zone: after, + prior_disposition: *diff.disposition.before, + zone: BlueprintZoneConfig { + disposition: *diff.disposition.after, + id: *diff.id.after, + filesystem_pool: diff.filesystem_pool.after.clone(), + zone_type: diff.zone_type.after.clone(), + }, }) } else { Err(BpDiffZoneError { - zone_before: before, - zone_after: after, + zone_before_id: *diff.id.before, + zone_after_id: *diff.id.after, reason, }) } @@ -138,6 +746,28 @@ pub struct BpDiffZonesModified { pub zones: Vec, } +impl BpDiffZonesModified { + pub fn new<'a>( + generation_before: Generation, + generation_after: Generation, + zone_diffs: impl Iterator>, + ) -> (BpDiffZonesModified, BpDiffZoneErrors) { + let mut zones = vec![]; + let mut errors = vec![]; + for diff in zone_diffs { + match ModifiedZone::from_diff(diff) { + Ok(modified_zone) => zones.push(modified_zone), + Err(error) => errors.push(error), + } + } + zones.sort_unstable_by_key(zone_sort_key); + ( + BpDiffZonesModified { generation_before, generation_after, zones }, + BpDiffZoneErrors { generation_before, generation_after, errors }, + ) + } +} + impl BpTableData for BpDiffZonesModified { fn bp_generation(&self) -> BpGeneration { BpGeneration::Diff { @@ -176,8 +806,8 @@ pub struct BpDiffZoneErrors { #[derive(Debug)] pub struct BpDiffZoneError { - pub zone_before: BlueprintZoneConfig, - pub zone_after: BlueprintZoneConfig, + pub zone_before_id: OmicronZoneUuid, + pub zone_after_id: OmicronZoneUuid, pub reason: String, } @@ -192,150 +822,29 @@ pub struct BpDiffZones { } impl BpDiffZones { - pub fn new( - before: BTreeMap, - mut after: BTreeMap, + /// Convert from our diff summary to our display compatibility layer + /// from the prior version of code. + pub fn from_diff_summary<'a>( + summary: &'a BlueprintDiffSummary<'a>, ) -> Self { let mut diffs = BpDiffZones::default(); - for (sled_id, before_zones) in before { - let before_generation = before_zones.generation; - let mut removed = vec![]; - if let Some(after_zones) = after.remove(&sled_id) { - let after_generation = after_zones.generation; - let mut unchanged = vec![]; - let mut modified = vec![]; - let mut errors = vec![]; - let mut added = vec![]; - - // Compare `before_zones` and `after_zones` to look - // for additions, deletions, modifications, and errors. - let before_by_id: BTreeMap<_, BlueprintZoneConfig> = - before_zones - .zones - .into_iter() - .map(|z| (z.id(), z)) - .collect(); - let mut after_by_id: BTreeMap<_, BlueprintZoneConfig> = - after_zones.zones.into_iter().map(|z| (z.id, z)).collect(); - - for (zone_id, zone_before) in before_by_id { - if let Some(zone_after) = after_by_id.remove(&zone_id) { - // Are the zones equal? - if zone_before == zone_after { - unchanged.push(zone_after); - } else { - // The zones are different. They are only allowed to differ in terms - // of `disposition`, otherwise we have an error. - match ModifiedZone::new(zone_before, zone_after) { - Ok(modified_zone) => { - modified.push(modified_zone) - } - Err(error) => errors.push(error), - } - } - } else { - // This zone doesn't exist in `zone_after` so it must have - // been removed. - removed.push(zone_before); - } - } - // Any remaining zones in `after_by_id` are newly added - for (_, zone_after) in after_by_id { - added.push(zone_after); - } - - // Add all records to `diffs` that come from either `before` or `after` - // for this `sled_id`. - if !unchanged.is_empty() { - unchanged.sort_unstable_by_key(zone_sort_key); - diffs.unchanged.insert( - sled_id, - BpDiffZoneDetails { - generation_before: Some(before_generation), - generation_after: Some(after_generation), - zones: unchanged, - }, - ); - } - if !removed.is_empty() { - removed.sort_unstable_by_key(zone_sort_key); - diffs.removed.insert( - sled_id, - BpDiffZoneDetails { - generation_before: Some(before_generation), - generation_after: Some(after_generation), - zones: removed, - }, - ); - } - if !added.is_empty() { - added.sort_unstable_by_key(zone_sort_key); - diffs.added.insert( - sled_id, - BpDiffZoneDetails { - generation_before: Some(before_generation), - generation_after: Some(after_generation), - zones: added, - }, - ); - } - if !modified.is_empty() { - modified.sort_unstable_by_key(zone_sort_key); - diffs.modified.insert( - sled_id, - BpDiffZonesModified { - generation_before: before_generation, - generation_after: after_generation, - zones: modified, - }, - ); - } - if !errors.is_empty() { - diffs.errors.insert( - sled_id, - BpDiffZoneErrors { - generation_before: before_generation, - generation_after: after_generation, - errors, - }, - ); - } - } else { - // No `after_zones` for this `sled_id`, so `before_zones` are removed - assert!(removed.is_empty()); - for zone in before_zones.zones { - removed.push(zone); - } - - if !removed.is_empty() { - removed.sort_unstable_by_key(zone_sort_key); - diffs.removed.insert( - sled_id, - BpDiffZoneDetails { - generation_before: Some(before_generation), - generation_after: None, - zones: removed, - }, - ); - } + for sled_id in &summary.all_sleds { + if let Some(added) = summary.added_zones(sled_id) { + diffs.added.insert(*sled_id, added); } - } - - // Any sleds remaining in `after` have just been added, since we remove - // sleds from `after`, that were also in `before`, in the above loop. - for (sled_id, after_zones) in after { - if !after_zones.zones.is_empty() { - diffs.added.insert( - sled_id, - BpDiffZoneDetails { - generation_before: None, - generation_after: Some(after_zones.generation), - zones: after_zones.zones.into_iter().collect(), - }, - ); + if let Some(removed) = summary.removed_zones(sled_id) { + diffs.removed.insert(*sled_id, removed); + } + if let Some(unchanged) = summary.unchanged_zones(sled_id) { + diffs.unchanged.insert(*sled_id, unchanged); + } + if let Some((modified, errors)) = summary.modified_zones(sled_id) { + diffs.modified.insert(*sled_id, modified); + if !errors.errors.is_empty() { + diffs.errors.insert(*sled_id, errors); + } } } - diffs } @@ -397,7 +906,22 @@ pub struct DiffPhysicalDisksDetails { pub after_generation: Option, // Disks added, removed, or unmodified - pub disks: BTreeSet, + pub disks: Vec, +} + +impl DiffPhysicalDisksDetails { + pub fn new<'a>( + before_generation: Option, + after_generation: Option, + disks_iter: impl Iterator, + ) -> Self { + let mut disks: Vec<_> = disks_iter + .map(|disk_config| &disk_config.identity) + .cloned() + .collect(); + disks.sort_unstable(); + DiffPhysicalDisksDetails { before_generation, after_generation, disks } + } } impl BpTableData for DiffPhysicalDisksDetails { @@ -426,89 +950,19 @@ pub struct BpDiffPhysicalDisks { } impl BpDiffPhysicalDisks { - pub fn new( - before: BTreeMap, - mut after: BTreeMap, - ) -> Self { + pub fn from_diff_summary(summary: &BlueprintDiffSummary<'_>) -> Self { let mut diffs = BpDiffPhysicalDisks::default(); - for (sled_id, before_disks) in before { - let before_generation = Some(before_disks.generation); - if let Some(after_disks) = after.remove(&sled_id) { - let after_generation = Some(after_disks.generation); - let a: BTreeSet = - after_disks.disks.into_iter().map(|d| d.identity).collect(); - let b = before_disks - .disks - .iter() - .map(|d| d.identity.clone()) - .collect(); - let added: BTreeSet<_> = a.difference(&b).cloned().collect(); - let removed: BTreeSet<_> = b.difference(&a).cloned().collect(); - let unchanged: BTreeSet<_> = - a.intersection(&b).cloned().collect(); - if !added.is_empty() { - diffs.added.insert( - sled_id, - DiffPhysicalDisksDetails { - before_generation, - after_generation, - disks: added, - }, - ); - } - if !removed.is_empty() { - diffs.removed.insert( - sled_id, - DiffPhysicalDisksDetails { - before_generation, - after_generation, - disks: removed, - }, - ); - } - if !unchanged.is_empty() { - diffs.unchanged.insert( - sled_id, - DiffPhysicalDisksDetails { - before_generation, - after_generation, - disks: unchanged, - }, - ); - } - } else { - diffs.removed.insert( - sled_id, - DiffPhysicalDisksDetails { - before_generation, - after_generation: None, - disks: before_disks - .disks - .into_iter() - .map(|d| d.identity) - .collect(), - }, - ); + for sled_id in &summary.all_sleds { + if let Some(added) = summary.added_disks(sled_id) { + diffs.added.insert(*sled_id, added); } - } - - // Any sleds remaining in `after` have just been added, since we remove - // sleds from `after`, that were also in `before`, in the above loop. - for (sled_id, after_disks) in after { - let added: BTreeSet = - after_disks.disks.into_iter().map(|d| d.identity).collect(); - if !added.is_empty() { - diffs.added.insert( - sled_id, - DiffPhysicalDisksDetails { - before_generation: None, - after_generation: Some(after_disks.generation), - disks: added, - }, - ); + if let Some(removed) = summary.removed_disks(sled_id) { + diffs.removed.insert(*sled_id, removed); + } + if let Some(unchanged) = summary.unchanged_disks(sled_id) { + diffs.unchanged.insert(*sled_id, unchanged); } } - diffs } @@ -553,6 +1007,24 @@ pub struct DiffDatasetsDetails { pub datasets: BTreeMap, } +impl DiffDatasetsDetails { + pub fn new<'a>( + before_generation: Option, + after_generation: Option, + datasets_iter: impl Iterator, + ) -> Self { + DiffDatasetsDetails { + before_generation, + after_generation, + datasets: datasets_iter + .map(|dataset_config| { + (dataset_config.into(), dataset_config.clone()) + }) + .collect(), + } + } +} + impl BpTableData for DiffDatasetsDetails { fn bp_generation(&self) -> BpGeneration { BpGeneration::Diff { @@ -577,41 +1049,54 @@ impl BpTableData for DiffDatasetsDetails { } #[derive(Debug)] -pub struct ModifiedDataset { - pub before: BlueprintDatasetConfig, - pub after: BlueprintDatasetConfig, -} - -#[derive(Debug)] -pub struct BpDiffDatasetsModified { - pub generation_before: Option, - pub generation_after: Option, - pub datasets: Vec, +pub struct BpDiffDatasetsModified<'a> { + pub generation_before: Generation, + pub generation_after: Generation, + pub datasets: Vec<&'a BlueprintDatasetConfigDiff<'a>>, } -impl BpTableData for BpDiffDatasetsModified { +impl BpTableData for BpDiffDatasetsModified<'_> { fn bp_generation(&self) -> BpGeneration { BpGeneration::Diff { - before: self.generation_before, - after: self.generation_after, + before: Some(self.generation_before), + after: Some(self.generation_after), } } fn rows(&self, state: BpDiffState) -> impl Iterator { - self.datasets.iter().map(move |dataset| { - let before_strings = dataset.before.as_strings(); - let after_strings = dataset.after.as_strings(); - + self.datasets.iter().map(move |&dataset| { let mut columns = vec![]; - for (before, after) in std::iter::zip(before_strings, after_strings) - { - let column = if before != after { - BpTableColumn::diff(before, after) - } else { - BpTableColumn::value(before) - }; - columns.push(column); - } + + // Dataset Name + let before = DatasetName::new( + dataset.pool.before.clone(), + dataset.kind.before.clone(), + ) + .full_name(); + let after = DatasetName::new( + dataset.pool.after.clone(), + dataset.kind.after.clone(), + ) + .full_name(); + columns.push(BpTableColumn::new(before, after)); + + // IDs don't change + columns.push(BpTableColumn::Value(dataset.id.before.to_string())); + + // Quota + let before = unwrap_or_none(dataset.quota.before); + let after = unwrap_or_none(dataset.quota.after); + columns.push(BpTableColumn::new(before, after)); + + // Reservation + let before = unwrap_or_none(dataset.reservation.before); + let after = unwrap_or_none(dataset.reservation.after); + columns.push(BpTableColumn::new(before, after)); + + // Compression + let before = dataset.compression.before.to_string(); + let after = dataset.compression.after.to_string(); + columns.push(BpTableColumn::new(before, after)); BpTableRow::new(state, columns) }) @@ -619,149 +1104,32 @@ impl BpTableData for BpDiffDatasetsModified { } #[derive(Debug, Default)] -pub struct BpDiffDatasets { +pub struct BpDiffDatasets<'a> { pub added: BTreeMap, pub removed: BTreeMap, - pub modified: BTreeMap, + pub modified: BTreeMap>, pub unchanged: BTreeMap, } -impl BpDiffDatasets { - pub fn new( - before: BTreeMap, - mut after: BTreeMap, - ) -> Self { +impl<'a> BpDiffDatasets<'a> { + pub fn from_diff_summary(summary: &'a BlueprintDiffSummary<'a>) -> Self { let mut diffs = BpDiffDatasets::default(); - - // Observe the set of old sleds first - for (sled_id, before_datasets) in before { - let before_generation = before_datasets.generation; - - // If the sled exists in both the old and new set, compare - // the set of datasets to identify which "grouping" they should - // land in. - if let Some(after_datasets) = after.remove(&sled_id) { - let after_generation = Some(after_datasets.generation); - - let mut unchanged = BTreeMap::new(); - let mut modified = BTreeMap::new(); - let mut removed = BTreeMap::new(); - - // Normalize the "before" and "after" data to compare individual - // datasets. - - let b = before_datasets - .datasets - .iter() - .map(|d| (CollectionDatasetIdentifier::from(d), d.clone())); - let mut added: BTreeMap< - CollectionDatasetIdentifier, - BlueprintDatasetConfig, - > = after_datasets - .datasets - .iter() - .map(|d| (d.into(), d.clone())) - .collect(); - - for (id, dataset_before) in b { - if let Some(dataset_after) = added.remove(&id) { - if dataset_before == dataset_after { - unchanged.insert(id, dataset_after); - } else { - modified - .insert(id, (dataset_before, dataset_after)); - } - } else { - removed.insert(id, dataset_before); - } - } - - if !added.is_empty() { - diffs.added.insert( - sled_id, - DiffDatasetsDetails { - before_generation: Some(before_generation), - after_generation, - datasets: added, - }, - ); - } - if !removed.is_empty() { - diffs.removed.insert( - sled_id, - DiffDatasetsDetails { - before_generation: Some(before_generation), - after_generation, - datasets: removed, - }, - ); - } - if !modified.is_empty() { - diffs.modified.insert( - sled_id, - BpDiffDatasetsModified { - generation_before: Some(before_generation), - generation_after: after_generation, - datasets: modified - .into_values() - .map(|(before, after)| ModifiedDataset { - before, - after, - }) - .collect(), - }, - ); - } - if !unchanged.is_empty() { - diffs.unchanged.insert( - sled_id, - DiffDatasetsDetails { - before_generation: Some(before_generation), - after_generation, - datasets: unchanged, - }, - ); - } - } else { - diffs.removed.insert( - sled_id, - DiffDatasetsDetails { - before_generation: Some(before_generation), - after_generation: None, - datasets: before_datasets - .datasets - .into_iter() - .map(|d| (CollectionDatasetIdentifier::from(&d), d)) - .collect(), - }, - ); + for sled_id in &summary.all_sleds { + if let Some(added) = summary.added_datasets(sled_id) { + diffs.added.insert(*sled_id, added); } - } - - // Any sleds remaining in `after` have just been added, since we remove - // sleds from `after`, that were also in `before`, in the above loop. - for (sled_id, after_datasets) in after { - let added: BTreeMap = - after_datasets - .datasets - .into_iter() - .map(|d| (CollectionDatasetIdentifier::from(&d), d)) - .collect(); - if !added.is_empty() { - diffs.added.insert( - sled_id, - DiffDatasetsDetails { - before_generation: None, - after_generation: Some(after_datasets.generation), - datasets: added, - }, - ); + if let Some(removed) = summary.removed_datasets(sled_id) { + diffs.removed.insert(*sled_id, removed); + } + if let Some(unchanged) = summary.unchanged_datasets(sled_id) { + diffs.unchanged.insert(*sled_id, unchanged); + } + if let Some(modified) = summary.modified_datasets(sled_id) { + diffs.modified.insert(*sled_id, modified); } } - diffs } - /// Return a [`BpTable`] for the given `sled_id` pub fn to_bp_sled_subtable(&self, sled_id: &SledUuid) -> Option { let mut generation = BpGeneration::Diff { before: None, after: None }; @@ -794,192 +1162,6 @@ impl BpDiffDatasets { } } -/// Summarizes the differences between two blueprints -#[derive(Debug)] -pub struct BlueprintDiff { - pub before_meta: DiffBeforeMetadata, - pub after_meta: BlueprintMetadata, - pub before_state: BTreeMap, - pub after_state: BTreeMap, - pub zones: BpDiffZones, - pub physical_disks: BpDiffPhysicalDisks, - pub datasets: BpDiffDatasets, - pub sleds_added: BTreeSet, - pub sleds_removed: BTreeSet, - pub sleds_unchanged: BTreeSet, - pub sleds_modified: BTreeSet, - pub before_clickhouse_cluster_config: DiffBeforeClickhouseClusterConfig, - pub after_clickhouse_cluster_config: Option, -} - -impl BlueprintDiff { - /// Build a diff with the provided contents, verifying that the provided - /// data is valid. - pub fn new( - before_meta: DiffBeforeMetadata, - before_clickhouse_cluster_config: DiffBeforeClickhouseClusterConfig, - before_state: BTreeMap, - before_zones: BTreeMap, - before_disks: BTreeMap, - before_datasets: BTreeMap, - after_blueprint: &Blueprint, - ) -> Self { - let mut after_state = after_blueprint.sled_state.clone(); - let after_zones = after_blueprint.blueprint_zones.clone(); - let after_disks = after_blueprint.blueprint_disks.clone(); - let after_datasets = after_blueprint.blueprint_datasets.clone(); - - // Work around a quirk of sled decommissioning. If a sled has a before - // state of `decommissioned`, it may or may not be present in - // `after_state` (presence will depend on whether or not the sled was - // present in the `PlanningInput`). However, we may still have entries - // in `after_zones` or `after_disks` due to expunged zones/disks that - // haven't been fully cleaned up yet. Without this workaround, this may - // produce confusing results: the sled might appear to be modified only - // because the state went from `decommissioned` to "missing entirely". - // We'll patch this up here: if we have a decommissioned sled that has - // no `after_state` entry but _does_ still have a corresponding zones or - // disks entry, we'll artificially insert `decommissioned` to avoid - // misleading output. - for (sled_id, _) in before_state - .iter() - .filter(|&(_, &state)| state == SledState::Decommissioned) - { - if !after_state.contains_key(sled_id) - && (after_zones.contains_key(sled_id) - || after_disks.contains_key(sled_id)) - { - after_state.insert(*sled_id, SledState::Decommissioned); - } - } - - let before_sleds: BTreeSet<_> = before_state - .keys() - .chain(before_zones.keys()) - .chain(before_disks.keys()) - .chain(before_datasets.keys()) - .collect(); - let after_sleds: BTreeSet<_> = after_state - .keys() - .chain(after_zones.keys()) - .chain(after_disks.keys()) - .chain(after_datasets.keys()) - .collect(); - let all_sleds: BTreeSet<_> = - before_sleds.union(&after_sleds).map(|&sled_id| *sled_id).collect(); - - // All sleds that have state, zones, disks or datasets in `after_*`, but not - // `before_*` have been added. - let sleds_added: BTreeSet<_> = after_sleds - .difference(&before_sleds) - .map(|&sled_id| *sled_id) - .collect(); - - // All sleds that have state, zones, disks or datasets in `before_*`, but not - // `after_*` have been removed. - let sleds_removed: BTreeSet<_> = before_sleds - .difference(&after_sleds) - .map(|&sled_id| *sled_id) - .collect(); - - let zones = BpDiffZones::new(before_zones, after_zones); - let physical_disks = - BpDiffPhysicalDisks::new(before_disks, after_disks); - let datasets = BpDiffDatasets::new(before_datasets, after_datasets); - - // Sleds that haven't been added or removed are either unchanged or - // modified. - let sleds_unchanged_or_modified: BTreeSet<_> = all_sleds - .iter() - .filter(|&sled_id| { - !sleds_added.contains(sled_id) - && !sleds_removed.contains(sled_id) - }) - .map(|s| *s) - .collect(); - - // Sleds are modified if their state changed or any zones or disks on - // those sleds are anything other than unchanged. - let mut sleds_modified = sleds_unchanged_or_modified.clone(); - sleds_modified.retain(|sled_id| { - before_state.get(sled_id) != after_state.get(sled_id) - || physical_disks.added.contains_key(sled_id) - || physical_disks.removed.contains_key(sled_id) - || datasets.added.contains_key(sled_id) - || datasets.modified.contains_key(sled_id) - || datasets.removed.contains_key(sled_id) - || zones.added.contains_key(sled_id) - || zones.removed.contains_key(sled_id) - || zones.modified.contains_key(sled_id) - || zones.errors.contains_key(sled_id) - }); - - // The rest of the sleds must be unchanged. - let unchanged_sleds: BTreeSet<_> = sleds_unchanged_or_modified - .difference(&sleds_modified) - .map(|sled_id| *sled_id) - .collect(); - - BlueprintDiff { - before_meta, - after_meta: after_blueprint.metadata(), - before_state, - after_state, - zones, - physical_disks, - datasets, - sleds_added, - sleds_removed, - sleds_unchanged: unchanged_sleds, - sleds_modified, - before_clickhouse_cluster_config, - after_clickhouse_cluster_config: after_blueprint - .clickhouse_cluster_config - .clone(), - } - } - - /// Return a struct that can be used to display the diff. - pub fn display(&self) -> BlueprintDiffDisplay<'_> { - BlueprintDiffDisplay::new(self) - } - - /// Returns whether the diff reflects any changes or if the blueprints are - /// equivalent. - pub fn has_changes(&self) -> bool { - // Any changes to physical disks, datasets, or zones would be reflected - // in `self.sleds_modified`, `self.sleds_added`, or - // `self.sleds_removed`. - if !self.sleds_modified.is_empty() - || !self.sleds_added.is_empty() - || !self.sleds_removed.is_empty() - { - return true; - } - - // The clickhouse cluster config has changed if: - // - there was one before and now there isn't - // - there wasn't one before and now there is - // - there's one both before and after and their generation has changed - match ( - &self.before_clickhouse_cluster_config, - &self.after_clickhouse_cluster_config, - ) { - (DiffBeforeClickhouseClusterConfig::Blueprint(None), None) => false, - (DiffBeforeClickhouseClusterConfig::Blueprint(None), Some(_)) => { - true - } - (DiffBeforeClickhouseClusterConfig::Blueprint(Some(_)), None) => { - true - } - ( - DiffBeforeClickhouseClusterConfig::Blueprint(Some(before)), - Some(after), - ) => before.diff(&after).is_change(), - } - } -} - /// A printable representation of `ClickhouseClusterConfig` diff tables where /// there is only a single known blueprint with no before or after collection or /// bluerpint to compare to. @@ -1188,12 +1370,8 @@ impl ClickhouseClusterConfigDiffTables { BpTableRow::new( BpDiffState::Added, vec![ - BpTableColumn::CollectionNotPresentDiff { - after: zone_id.to_string(), - }, - BpTableColumn::CollectionNotPresentDiff { - after: server_id.to_string(), - }, + BpTableColumn::Value(zone_id.to_string()), + BpTableColumn::Value(server_id.to_string()), ], ) }) @@ -1376,18 +1554,29 @@ impl ClickhouseClusterConfigDiffTables { /// Wrapper to allow a [`BlueprintDiff`] to be displayed. /// -/// Returned by [`BlueprintDiff::display()`]. -#[derive(Clone, Debug)] +/// Returned by [`BlueprintDiffSummary::display()`]. +#[derive(Debug)] #[must_use = "this struct does nothing unless displayed"] pub struct BlueprintDiffDisplay<'diff> { - pub diff: &'diff BlueprintDiff, - // TODO: add colorization with a stylesheet + summary: &'diff BlueprintDiffSummary<'diff>, + // These structures are intermediate structures that we generate displayable + // tables from. + before_meta: BlueprintMetadata, + after_meta: BlueprintMetadata, + zones: BpDiffZones, + disks: BpDiffPhysicalDisks, + datasets: BpDiffDatasets<'diff>, } impl<'diff> BlueprintDiffDisplay<'diff> { #[inline] - fn new(diff: &'diff BlueprintDiff) -> Self { - Self { diff } + fn new(summary: &'diff BlueprintDiffSummary<'diff>) -> Self { + let before_meta = summary.before.metadata(); + let after_meta = summary.after.metadata(); + let zones = BpDiffZones::from_diff_summary(summary); + let disks = BpDiffPhysicalDisks::from_diff_summary(summary); + let datasets = BpDiffDatasets::from_diff_summary(summary); + Self { summary, before_meta, after_meta, zones, disks, datasets } } pub fn make_metadata_diff_tables( @@ -1399,38 +1588,23 @@ impl<'diff> BlueprintDiffDisplay<'diff> { }; ($member:ident, $label:expr, $display:expr) => { - match &self.diff.before_meta { - DiffBeforeMetadata::Collection { .. } => { - // Collections have no metadata, so this is new - KvPair::new( - BpDiffState::Added, - $label, - linear_table_modified( - &NOT_PRESENT_IN_COLLECTION_PARENS, - &$display(&self.diff.after_meta.$member), - ), - ) - } - DiffBeforeMetadata::Blueprint(before) => { - if before.$member == self.diff.after_meta.$member { - KvPair::new( - BpDiffState::Unchanged, - $label, - linear_table_unchanged(&$display( - &self.diff.after_meta.$member, - )), - ) - } else { - KvPair::new( - BpDiffState::Modified, - $label, - linear_table_modified( - &$display(&before.$member), - &$display(&self.diff.after_meta.$member), - ), - ) - } - } + if self.before_meta.$member == self.after_meta.$member { + KvPair::new( + BpDiffState::Unchanged, + $label, + linear_table_unchanged(&$display( + &self.after_meta.$member, + )), + ) + } else { + KvPair::new( + BpDiffState::Modified, + $label, + linear_table_modified( + &$display(&self.before_meta.$member), + &$display(&self.after_meta.$member), + ), + ) } }; } @@ -1465,60 +1639,51 @@ impl<'diff> BlueprintDiffDisplay<'diff> { &self, ) -> Option { match ( - &self.diff.before_clickhouse_cluster_config, - &self.diff.after_clickhouse_cluster_config, + &self.summary.diff.clickhouse_cluster_config.before, + &self.summary.diff.clickhouse_cluster_config.after, ) { // Before blueprint + after blueprint - ( - DiffBeforeClickhouseClusterConfig::Blueprint(Some(before)), - Some(after), - ) => Some(ClickhouseClusterConfigDiffTables::diff_blueprints( - before, after, - )), + (Some(before), Some(after)) => { + Some(ClickhouseClusterConfigDiffTables::diff_blueprints( + before, after, + )) + } // Before blueprint only - ( - DiffBeforeClickhouseClusterConfig::Blueprint(Some(before)), - None, - ) => { + (Some(before), None) => { Some(ClickhouseClusterConfigDiffTables::removed_from_blueprint( before, )) } // After blueprint only - ( - DiffBeforeClickhouseClusterConfig::Blueprint(None), - Some(after), - ) => Some(ClickhouseClusterConfigDiffTables::added_to_blueprint( - after, - )), + (None, Some(after)) => Some( + ClickhouseClusterConfigDiffTables::added_to_blueprint(after), + ), // No before or after - (DiffBeforeClickhouseClusterConfig::Blueprint(None), None) => None, + (None, None) => None, } } - /// Write out physical disk and zone tables for a given `sled_id` + /// Write out disk, dataset, and zone tables for a given `sled_id` fn write_tables( &self, f: &mut fmt::Formatter<'_>, sled_id: &SledUuid, ) -> fmt::Result { - // Write the physical disks table if it exists - if let Some(table) = - self.diff.physical_disks.to_bp_sled_subtable(sled_id) - { + // Write the physical disks table if needed + if let Some(table) = self.disks.to_bp_sled_subtable(sled_id) { writeln!(f, "{table}\n")?; } // Write the datasets table if it exists - if let Some(table) = self.diff.datasets.to_bp_sled_subtable(sled_id) { + if let Some(table) = self.datasets.to_bp_sled_subtable(sled_id) { writeln!(f, "{table}\n")?; } // Write the zones table if it exists - if let Some(table) = self.diff.zones.to_bp_sled_subtable(sled_id) { + if let Some(table) = self.zones.to_bp_sled_subtable(sled_id) { writeln!(f, "{table}\n")?; } @@ -1530,90 +1695,60 @@ impl<'diff> BlueprintDiffDisplay<'diff> { /// before and after should be that can only be wrong if we have a bug /// constructing the diff. fn sled_state_unchanged(&self, sled_id: &SledUuid) -> String { - let before = self.diff.before_state.get(sled_id); - let after = self.diff.after_state.get(sled_id); - if before == after { - after - .map(|s| s.to_string()) - .unwrap_or_else(|| "state unknown".to_string()) - } else { - format!( - "blueprint diff error: unchanged sled changed state from \ - {before:?} to {after:?}" - ) - } + self.summary + .diff + .sled_state + .unchanged + .get(sled_id) + .map(|before| before.to_string()) + .unwrap_or("unknown".to_string()) } fn sled_state_added(&self, sled_id: &SledUuid) -> String { - let before = self.diff.before_state.get(sled_id); - let after = self.diff.after_state.get(sled_id); - if before.is_none() { - after - .map(|s| format!("{s}")) - .unwrap_or_else(|| "unknown".to_string()) - } else { - format!( - "blueprint diff error: added sled has old state \ - {before:?} (now {after:?})" - ) - } + let after = self.summary.diff.sled_state.added.get(sled_id).unwrap(); + format!("{after}") } fn sled_state_removed(&self, sled_id: &SledUuid) -> String { - let before = self.diff.before_state.get(sled_id); - let after = self.diff.after_state.get(sled_id); - if after.is_none() { - before - .map(|s| format!("was {s}")) - .unwrap_or_else(|| "state was unknown".to_string()) - } else { - format!( - "blueprint diff error: removed sled has new state \ - {after:?} (was {before:?})" - ) - } + let before = self.summary.diff.sled_state.removed.get(sled_id).unwrap(); + format!("was {before}") } fn sled_state_modified(&self, sled_id: &SledUuid) -> String { - let before = self.diff.before_state.get(sled_id); - let after = self.diff.after_state.get(sled_id); - match (before, after) { - (Some(before), Some(after)) if before != after => { - format!("{before} -> {after}") + let modified_sled_state = + self.summary.diff.sled_state.modified.get(sled_id); + match modified_sled_state { + None => { + // The sled_state itself wasn't modified. It must be unchanged. + match self.summary.diff.sled_state.unchanged.get(sled_id) { + Some(state) => { + format!("{state}") + } + None => "unknown".to_string(), + } } - (Some(state), Some(_)) => { - // states are equal; the sled was presumably modified some other - // way - format!("{state}") + Some(diff) => { + let before = diff.before; + let after = diff.after; + if before != after { + format!("{before} -> {after}") + } else { + format!("{before}") + } } - (None, Some(after)) => format!("unknown -> {after}"), - (Some(before), None) => format!("{before} -> unknown"), - (None, None) => "unknown".to_string(), } } } impl fmt::Display for BlueprintDiffDisplay<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let diff = self.diff; + let summary = self.summary; + let before_metadata = self.summary.before.metadata(); + let after_metadata = self.summary.after.metadata(); - // Print things differently based on whether the diff is between a - // collection and a blueprint, or a blueprint and a blueprint. - match &diff.before_meta { - DiffBeforeMetadata::Collection { id } => { - writeln!( - f, - "from: collection {}\n\ - to: blueprint {}", - id, diff.after_meta.id, - )?; - } - DiffBeforeMetadata::Blueprint(before) => { - writeln!( - f, - "from: blueprint {}\n\ - to: blueprint {}\n", - before.id, diff.after_meta.id - )?; - } - } + writeln!( + f, + "from: blueprint {}\n\ + to: blueprint {}\n", + before_metadata.id, after_metadata.id + )?; // Write out sled information // @@ -1632,9 +1767,9 @@ impl fmt::Display for BlueprintDiffDisplay<'_> { // We put errors at the bottom to ensure they are seen immediately. // Write out tables for unchanged sleds - if !diff.sleds_unchanged.is_empty() { + if !summary.sleds_unchanged.is_empty() { writeln!(f, " UNCHANGED SLEDS:\n")?; - for sled_id in &diff.sleds_unchanged { + for sled_id in &summary.sleds_unchanged { writeln!( f, " sled {sled_id} ({}):\n", @@ -1645,9 +1780,9 @@ impl fmt::Display for BlueprintDiffDisplay<'_> { } // Write out tables for removed sleds - if !diff.sleds_removed.is_empty() { + if !summary.sleds_removed.is_empty() { writeln!(f, " REMOVED SLEDS:\n")?; - for sled_id in &diff.sleds_removed { + for sled_id in &summary.sleds_removed { writeln!( f, " sled {sled_id} ({}):\n", @@ -1658,9 +1793,9 @@ impl fmt::Display for BlueprintDiffDisplay<'_> { } // Write out tables for modified sleds - if !diff.sleds_modified.is_empty() { + if !summary.sleds_modified.is_empty() { writeln!(f, " MODIFIED SLEDS:\n")?; - for sled_id in &diff.sleds_modified { + for sled_id in &summary.sleds_modified { writeln!( f, " sled {sled_id} ({}):\n", @@ -1671,9 +1806,9 @@ impl fmt::Display for BlueprintDiffDisplay<'_> { } // Write out tables for added sleds - if !diff.sleds_added.is_empty() { + if !summary.sleds_added.is_empty() { writeln!(f, " ADDED SLEDS:\n")?; - for sled_id in &diff.sleds_added { + for sled_id in &summary.sleds_added { writeln!( f, " sled {sled_id} ({}):\n", @@ -1684,9 +1819,9 @@ impl fmt::Display for BlueprintDiffDisplay<'_> { } // Write out zone errors. - if !diff.zones.errors.is_empty() { + if !self.zones.errors.is_empty() { writeln!(f, "ERRORS:")?; - for (sled_id, errors) in &diff.zones.errors { + for (sled_id, errors) in &self.zones.errors { writeln!(f, "\n sled {sled_id}\n")?; writeln!( f, @@ -1695,7 +1830,7 @@ impl fmt::Display for BlueprintDiffDisplay<'_> { )?; for err in &errors.errors { - writeln!(f, " zone id: {}", err.zone_before.id())?; + writeln!(f, " zone id: {}", err.zone_before_id)?; writeln!(f, " reason: {}", err.reason)?; } } diff --git a/nexus/types/src/deployment/blueprint_display.rs b/nexus/types/src/deployment/blueprint_display.rs index b1c1e0fa80c..76c102e0812 100644 --- a/nexus/types/src/deployment/blueprint_display.rs +++ b/nexus/types/src/deployment/blueprint_display.rs @@ -125,13 +125,17 @@ impl fmt::Display for BpGeneration { pub enum BpTableColumn { Value(String), Diff { before: String, after: String }, - // A special nomenclature for when we are diffing a collection with a - // blueprint but the before value doesn't exist in the collection, because - // collections don't have such a field. - CollectionNotPresentDiff { after: String }, } impl BpTableColumn { + pub fn new(before: String, after: String) -> BpTableColumn { + if before != after { + BpTableColumn::Diff { before, after } + } else { + BpTableColumn::Value(before) + } + } + pub fn value(s: String) -> BpTableColumn { BpTableColumn::Value(s) } @@ -153,10 +157,6 @@ impl BpTableColumn { // the before or after values + 2. usize::max(before.len(), after.len()) + 2 } - BpTableColumn::CollectionNotPresentDiff { after } => { - usize::max(NOT_PRESENT_IN_COLLECTION_PARENS.len(), after.len()) - + 4 - } } } } @@ -282,12 +282,6 @@ impl fmt::Display for BpTable { // modify `BpTableColumn::len` to reflect this. (format!("{REMOVED_PREFIX} {before}"), true) } - BpTableColumn::CollectionNotPresentDiff { .. } => ( - // If we remove the prefix and space, we'll need to also - // modify `BpTableColumn::len` to reflect this. - NOT_PRESENT_IN_COLLECTION_PARENS.to_string(), - true, - ), }; multiline_row |= needs_multiline; @@ -313,9 +307,6 @@ impl fmt::Display for BpTable { // modify `BpTableColumn::len` to reflect this. format!("{ADDED_PREFIX} {after}") } - BpTableColumn::CollectionNotPresentDiff { after } => { - after.to_string() - } }; if i == 0 { let s = format!(" {SUB_LAST} {column}"); diff --git a/nexus/types/src/deployment/clickhouse.rs b/nexus/types/src/deployment/clickhouse.rs index f8443c6afe8..0d74ff299b5 100644 --- a/nexus/types/src/deployment/clickhouse.rs +++ b/nexus/types/src/deployment/clickhouse.rs @@ -5,7 +5,7 @@ //! Types used in blueprints related to clickhouse configuration use clickhouse_admin_types::{KeeperId, ServerId}; -use diffus::Diffus; +use daft::Diffable; use omicron_common::api::external::Generation; use omicron_uuid_kinds::OmicronZoneUuid; use schemars::JsonSchema; @@ -14,7 +14,7 @@ use std::collections::BTreeMap; /// Global configuration for all clickhouse servers (replicas) and keepers #[derive( - Clone, Debug, Eq, PartialEq, JsonSchema, Deserialize, Serialize, Diffus, + Clone, Debug, Eq, PartialEq, JsonSchema, Deserialize, Serialize, Diffable, )] pub struct ClickhouseClusterConfig { /// The last update to the clickhouse cluster configuration diff --git a/nexus/types/src/deployment/diff_visitors.rs b/nexus/types/src/deployment/diff_visitors.rs deleted file mode 100644 index 0cf614c8cec..00000000000 --- a/nexus/types/src/deployment/diff_visitors.rs +++ /dev/null @@ -1,61 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at https://mozilla.org/MPL/2.0/. - -//! An API for visiting diffs between blueprints generated via [diffus](https://github.com/oxidecomputer/diffus) -//! -//! Modelled after [`syn::visit`](https://docs.rs/syn/1/syn/visit). - -pub mod visit_blueprint_datasets_config; -pub mod visit_blueprint_physical_disks_config; -pub mod visit_blueprint_zones_config; - -use diffus::edit::enm; -use omicron_uuid_kinds::{ - DatasetUuid, OmicronZoneUuid, PhysicalDiskUuid, SledUuid, -}; - -use super::{ - BlueprintZoneConfig, BlueprintZoneDisposition, BlueprintZoneType, - BlueprintZonesConfig, EditedBlueprintZoneConfig, -}; - -/// A context for blueprint related visitors -#[derive(Debug, Clone, Default)] -pub struct BpVisitorContext { - pub sled_id: Option, - pub zone_id: Option, - pub disk_id: Option, - pub dataset_id: Option, -} - -#[derive(Debug, Clone, Copy)] -pub struct Change<'e, T> { - pub before: &'e T, - pub after: &'e T, -} - -impl<'e, T> Change<'e, T> { - pub fn new(before: &'e T, after: &'e T) -> Change<'e, T> { - Change { before, after } - } -} - -impl<'e, T> From<(&'e T, &'e T)> for Change<'e, T> { - fn from(value: (&'e T, &'e T)) -> Self { - Change::new(value.0, value.1) - } -} - -impl<'e, T, Diff> From<&enm::Edit<'e, T, Diff>> for Change<'e, T> { - fn from(value: &enm::Edit<'e, T, Diff>) -> Self { - match value { - enm::Edit::VariantChanged(before, after) => { - Change::new(before, after) - } - enm::Edit::AssociatedChanged { before, after, .. } => { - Change::new(before, after) - } - } - } -} diff --git a/nexus/types/src/deployment/diff_visitors/visit_blueprint_datasets_config.rs b/nexus/types/src/deployment/diff_visitors/visit_blueprint_datasets_config.rs deleted file mode 100644 index 87d9d080a8f..00000000000 --- a/nexus/types/src/deployment/diff_visitors/visit_blueprint_datasets_config.rs +++ /dev/null @@ -1,588 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at https://mozilla.org/MPL/2.0/. - -//! A visitor for `BlueprintDatasetsConfig` - -use super::Change; -use crate::deployment::{ - BlueprintDatasetConfig, BlueprintDatasetDisposition, - BlueprintDatasetsConfig, BpVisitorContext, DatasetKind, - EditedBlueprintDatasetConfig, ZpoolName, -}; -use diffus::edit::{map, Edit}; -use omicron_common::{ - api::external::{ByteCount, Generation}, - disk::CompressionAlgorithm, -}; -use std::net::SocketAddrV6; - -/// A trait to visit a [`BlueprintDatasetsConfig`] -pub trait VisitBlueprintDatasetsConfig<'e> { - fn visit_root( - &mut self, - ctx: &mut BpVisitorContext, - node: Edit<'e, BlueprintDatasetsConfig>, - ) { - visit_root(self, ctx, node); - } - - /// A change to `BlueprintZonesConfig::generation` - fn visit_generation_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, Generation>, - ) { - // Leaf node - } - - /// An insert to `BlueprintDatasetsConfig::datasets` - fn visit_datasets_insert( - &mut self, - _ctx: &mut BpVisitorContext, - _node: &BlueprintDatasetConfig, - ) { - // Leaf node - } - - /// A removal from `BlueprintDatasetsConfig::datasets` - fn visit_datasets_remove( - &mut self, - _ctx: &mut BpVisitorContext, - _node: &BlueprintDatasetConfig, - ) { - // Leaf node - } - - /// A change in a value in `BlueprintDatasetsConfig::datasets` - fn visit_dataset_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, BlueprintDatasetConfig>, - ) { - // Leaf node - } - - /// A point where we allow direct access to a `diffus_derive` generated - /// struct representing a change to a `BlueprintDatasetConfig`. - /// - /// This is the equivalent node in the tree to `visit_dataset_change`, but gives a - /// `diffus_derive` generated structure rather than the before and after of - /// the original structs that were diffed. - fn visit_dataset_edit( - &mut self, - ctx: &mut BpVisitorContext, - node: &EditedBlueprintDatasetConfig<'e>, - ) { - visit_dataset_edit(self, ctx, node); - } - - /// A change in `BlueprintDatasetConfig::disposition` - fn visit_dataset_disposition_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, BlueprintDatasetDisposition>, - ) { - // Leaf node - } - /// A change in `BlueprintDatasetConfig::pool` - fn visit_dataset_pool_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, ZpoolName>, - ) { - // Leaf node - } - /// A change in `BlueprintDatasetConfig::kind` - fn visit_dataset_kind_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, DatasetKind>, - ) { - // Leaf node - } - /// A change in `BlueprintDatasetConfig::address` - fn visit_dataset_address_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, Option>, - ) { - // Leaf node - } - /// A change in `BlueprintDatasetConfig::quota` - fn visit_dataset_quota_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, Option>, - ) { - // Leaf node - } - - /// A change in `BlueprintDatasetConfig::reservation` - fn visit_dataset_reservation_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, Option>, - ) { - // Leaf node - } - - /// A change in `BlueprintDatasetConfig::compression` - fn visit_dataset_compression_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, CompressionAlgorithm>, - ) { - // Leaf node - } -} - -pub fn visit_root<'e, V>( - v: &mut V, - ctx: &mut BpVisitorContext, - node: Edit<'e, BlueprintDatasetsConfig>, -) where - V: VisitBlueprintDatasetsConfig<'e> + ?Sized, -{ - let Edit::Change { diff, .. } = node else { - return; - }; - - if let Edit::Change { diff, .. } = diff.generation { - v.visit_generation_change(ctx, diff.into()); - } - if let Edit::Change { diff, .. } = diff.datasets { - for (&dataset_id, edit) in &diff { - ctx.dataset_id = Some(*dataset_id); - match edit { - map::Edit::Copy(_) => {} - map::Edit::Insert(dataset_config) => { - v.visit_datasets_insert(ctx, dataset_config); - } - map::Edit::Remove(dataset_config) => { - v.visit_datasets_remove(ctx, dataset_config); - } - map::Edit::Change { before, after, diff } => { - v.visit_dataset_change(ctx, Change::new(before, after)); - v.visit_dataset_edit(ctx, diff); - } - } - } - // Reset the context - ctx.dataset_id = None; - } -} - -pub fn visit_dataset_edit<'e, V>( - v: &mut V, - ctx: &mut BpVisitorContext, - node: &EditedBlueprintDatasetConfig<'e>, -) where - V: VisitBlueprintDatasetsConfig<'e> + ?Sized, -{ - if let Edit::Change { before, after, .. } = &node.disposition { - v.visit_dataset_disposition_change(ctx, Change::new(*before, *after)); - } - if let Edit::Change { before, after, .. } = &node.pool { - v.visit_dataset_pool_change(ctx, Change::new(*before, *after)); - } - if let Edit::Change { before, after, .. } = &node.kind { - v.visit_dataset_kind_change(ctx, Change::new(*before, *after)); - } - if let Edit::Change { before, after, .. } = &node.address { - v.visit_dataset_address_change(ctx, Change::new(*before, *after)); - } - if let Edit::Change { before, after, .. } = &node.quota { - v.visit_dataset_quota_change(ctx, Change::new(*before, *after)); - } - if let Edit::Change { before, after, .. } = &node.reservation { - v.visit_dataset_reservation_change(ctx, Change::new(*before, *after)); - } - if let Edit::Change { before, after, .. } = &node.compression { - v.visit_dataset_compression_change(ctx, Change::new(*before, *after)); - } -} -#[cfg(test)] -mod tests { - use std::net::Ipv6Addr; - - use super::*; - use diffus::Diffable; - use omicron_uuid_kinds::{DatasetUuid, ZpoolUuid}; - - struct TestVisitor<'a> { - before: &'a BlueprintDatasetsConfig, - after: &'a BlueprintDatasetsConfig, - total_inserts: usize, - total_removes: usize, - change_callbacks_fired: usize, - } - - impl<'a> TestVisitor<'a> { - pub fn new( - before: &'a BlueprintDatasetsConfig, - after: &'a BlueprintDatasetsConfig, - ) -> Self { - TestVisitor { - before, - after, - total_inserts: 0, - total_removes: 0, - change_callbacks_fired: 0, - } - } - } - - impl<'e> VisitBlueprintDatasetsConfig<'e> for TestVisitor<'e> { - fn visit_generation_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, Generation>, - ) { - assert_eq!(change.before, &self.before.generation); - assert_eq!(change.after, &self.after.generation); - assert_ne!(self.before.generation, self.after.generation); - - // We aren't operating on a specific dataset - assert!(ctx.dataset_id.is_none()); - - self.change_callbacks_fired += 1; - } - - fn visit_datasets_insert( - &mut self, - ctx: &mut BpVisitorContext, - node: &BlueprintDatasetConfig, - ) { - assert!(!self.before.datasets.contains_key(&node.id)); - assert!(self.after.datasets.contains_key(&node.id)); - - // The inserted node is the same as what's in `after` - assert_eq!(node, self.after.datasets.get(&node.id).unwrap()); - - // The key for the current dataset id was filled in - assert_eq!(ctx.dataset_id, Some(node.id)); - - self.total_inserts += 1; - self.change_callbacks_fired += 1; - } - - fn visit_datasets_remove( - &mut self, - ctx: &mut BpVisitorContext, - node: &BlueprintDatasetConfig, - ) { - assert!(self.before.datasets.contains_key(&node.id)); - assert!(!self.after.datasets.contains_key(&node.id)); - - // The removed node is the same as what's in `before` - assert_eq!(node, self.before.datasets.get(&node.id).unwrap()); - - // The key for the current dataset id was filled in - assert_eq!(ctx.dataset_id, Some(node.id)); - - self.total_removes += 1; - self.change_callbacks_fired += 1; - } - - fn visit_dataset_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, BlueprintDatasetConfig>, - ) { - // The key for the current dataset id was filled in and - // the dataset with the same id was changed - assert_eq!(ctx.dataset_id, Some(change.before.id)); - assert_eq!(ctx.dataset_id, Some(change.after.id)); - - // The change is actually correct - assert_eq!( - self.before.datasets.get(&ctx.dataset_id.unwrap()), - Some(change.before) - ); - assert_eq!( - self.after.datasets.get(&ctx.dataset_id.unwrap()), - Some(change.after) - ); - self.change_callbacks_fired += 1; - } - - fn visit_dataset_disposition_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, BlueprintDatasetDisposition>, - ) { - assert_ne!(change.before, change.after); - assert_eq!( - self.before - .datasets - .get(&ctx.dataset_id.unwrap()) - .unwrap() - .disposition, - *change.before - ); - assert_eq!( - self.after - .datasets - .get(&ctx.dataset_id.unwrap()) - .unwrap() - .disposition, - *change.after - ); - self.change_callbacks_fired += 1; - } - - fn visit_dataset_pool_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, ZpoolName>, - ) { - assert_ne!(change.before, change.after); - assert_eq!( - self.before - .datasets - .get(&ctx.dataset_id.unwrap()) - .unwrap() - .pool, - *change.before - ); - assert_eq!( - self.after.datasets.get(&ctx.dataset_id.unwrap()).unwrap().pool, - *change.after - ); - self.change_callbacks_fired += 1; - } - - fn visit_dataset_kind_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, DatasetKind>, - ) { - assert_ne!(change.before, change.after); - assert_eq!( - self.before - .datasets - .get(&ctx.dataset_id.unwrap()) - .unwrap() - .kind, - *change.before - ); - assert_eq!( - self.after.datasets.get(&ctx.dataset_id.unwrap()).unwrap().kind, - *change.after - ); - self.change_callbacks_fired += 1; - } - - fn visit_dataset_address_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, Option>, - ) { - assert_ne!(change.before, change.after); - assert_eq!( - self.before - .datasets - .get(&ctx.dataset_id.unwrap()) - .unwrap() - .address, - *change.before - ); - assert_eq!( - self.after - .datasets - .get(&ctx.dataset_id.unwrap()) - .unwrap() - .address, - *change.after - ); - self.change_callbacks_fired += 1; - } - - fn visit_dataset_quota_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, Option>, - ) { - assert_ne!(change.before, change.after); - assert_eq!( - self.before - .datasets - .get(&ctx.dataset_id.unwrap()) - .unwrap() - .quota, - *change.before - ); - assert_eq!( - self.after - .datasets - .get(&ctx.dataset_id.unwrap()) - .unwrap() - .quota, - *change.after - ); - self.change_callbacks_fired += 1; - } - - fn visit_dataset_reservation_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, Option>, - ) { - assert_ne!(change.before, change.after); - assert_eq!( - self.before - .datasets - .get(&ctx.dataset_id.unwrap()) - .unwrap() - .reservation, - *change.before - ); - assert_eq!( - self.after - .datasets - .get(&ctx.dataset_id.unwrap()) - .unwrap() - .reservation, - *change.after - ); - self.change_callbacks_fired += 1; - } - - fn visit_dataset_compression_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, CompressionAlgorithm>, - ) { - assert_ne!(change.before, change.after); - assert_eq!( - self.before - .datasets - .get(&ctx.dataset_id.unwrap()) - .unwrap() - .compression, - *change.before - ); - assert_eq!( - self.after - .datasets - .get(&ctx.dataset_id.unwrap()) - .unwrap() - .compression, - *change.after - ); - self.change_callbacks_fired += 1; - } - } - - #[test] - fn diff_same_config() { - let before = BlueprintDatasetsConfig { - generation: Generation::new(), - datasets: [BlueprintDatasetConfig { - disposition: BlueprintDatasetDisposition::InService, - id: DatasetUuid::new_v4(), - pool: ZpoolName::new_external(ZpoolUuid::new_v4()), - kind: DatasetKind::Cockroach, - address: None, - quota: None, - reservation: None, - compression: CompressionAlgorithm::On, - }] - .into_iter() - .collect(), - }; - let after = before.clone(); - - let mut ctx = BpVisitorContext::default(); - let mut visitor = TestVisitor::new(&before, &after); - let diff = before.diff(&after); - visitor.visit_root(&mut ctx, diff); - - // No change callbacks should fire - assert_eq!(0, visitor.change_callbacks_fired); - } - - #[test] - fn diff_field_changes() { - let before = BlueprintDatasetsConfig { - generation: Generation::new(), - datasets: [BlueprintDatasetConfig { - disposition: BlueprintDatasetDisposition::InService, - id: DatasetUuid::new_v4(), - pool: ZpoolName::new_external(ZpoolUuid::new_v4()), - kind: DatasetKind::Cockroach, - address: None, - quota: None, - reservation: None, - compression: CompressionAlgorithm::On, - }] - .into_iter() - .collect(), - }; - let mut after = before.clone(); - after.generation = after.generation.next(); - { - let mut dataset = after.datasets.iter_mut().next().unwrap(); - dataset.disposition = BlueprintDatasetDisposition::Expunged; - dataset.pool = ZpoolName::new_external(ZpoolUuid::new_v4()); - dataset.kind = DatasetKind::Clickhouse; - dataset.address = Some(SocketAddrV6::new( - Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), - 9999, - 0, - 0, - )); - dataset.quota = Some(ByteCount::from_kibibytes_u32(200)); - dataset.reservation = Some(ByteCount::from_mebibytes_u32(100)); - dataset.compression = CompressionAlgorithm::Off; - } - - let mut ctx = BpVisitorContext::default(); - let mut visitor = TestVisitor::new(&before, &after); - let diff = before.diff(&after); - visitor.visit_root(&mut ctx, diff); - - // A bunch of callbacks fire due to our diffs - // 7 fields modified + the parent change to the dataset + generation - assert_eq!(9, visitor.change_callbacks_fired); - } - - #[test] - fn diff_insert_delete_datasets() { - let config1 = BlueprintDatasetConfig { - disposition: BlueprintDatasetDisposition::InService, - id: DatasetUuid::new_v4(), - pool: ZpoolName::new_external(ZpoolUuid::new_v4()), - kind: DatasetKind::Cockroach, - address: None, - quota: None, - reservation: None, - compression: CompressionAlgorithm::On, - }; - - // Using a different `id` means this zone will count as an inserted one, - // and the original zone will be counted as removed. - let mut config2 = config1.clone(); - config2.id = DatasetUuid::new_v4(); - - let before = BlueprintDatasetsConfig { - generation: Generation::new(), - datasets: [config1].into_iter().collect(), - }; - - let after = BlueprintDatasetsConfig { - generation: Generation::new(), - datasets: [config2].into_iter().collect(), - }; - - let mut ctx = BpVisitorContext::default(); - let mut visitor = TestVisitor::new(&before, &after); - let diff = before.diff(&after); - visitor.visit_root(&mut ctx, diff); - - assert_eq!(visitor.total_inserts, 1); - assert_eq!(visitor.total_removes, 1); - assert_eq!(visitor.change_callbacks_fired, 2); - } -} diff --git a/nexus/types/src/deployment/diff_visitors/visit_blueprint_physical_disks_config.rs b/nexus/types/src/deployment/diff_visitors/visit_blueprint_physical_disks_config.rs deleted file mode 100644 index fce220f638e..00000000000 --- a/nexus/types/src/deployment/diff_visitors/visit_blueprint_physical_disks_config.rs +++ /dev/null @@ -1,420 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at https://mozilla.org/MPL/2.0/. - -//! A visitor for `BlueprintPhysicalDisksConfig` - -use super::Change; -use crate::deployment::{ - BlueprintPhysicalDiskConfig, BlueprintPhysicalDiskDisposition, - BlueprintPhysicalDisksConfig, BpVisitorContext, DiskIdentity, - EditedBlueprintPhysicalDiskConfig, ZpoolUuid, -}; -use diffus::edit::{map, Edit}; -use omicron_common::api::external::Generation; - -/// A trait to visit a [`BlueprintPhysicalDisksConfig`] -pub trait VisitBlueprintPhysicalDisksConfig<'e> { - fn visit_root( - &mut self, - ctx: &mut BpVisitorContext, - node: Edit<'e, BlueprintPhysicalDisksConfig>, - ) { - visit_root(self, ctx, node); - } - - /// A change to `BlueprintZonesConfig::generation` - fn visit_generation_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, Generation>, - ) { - // Leaf node - } - - /// An insert to `BlueprintPhysicalDisksConfig::disks` - fn visit_disks_insert( - &mut self, - _ctx: &mut BpVisitorContext, - _node: &BlueprintPhysicalDiskConfig, - ) { - // Leaf node - } - - /// A removal from `BlueprintPhysicalDisksConfig::disks` - fn visit_disks_remove( - &mut self, - _ctx: &mut BpVisitorContext, - _node: &BlueprintPhysicalDiskConfig, - ) { - // Leaf node - } - - /// A change in a value in `BlueprintPhysicalDisksConfig::disks` - fn visit_disk_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, BlueprintPhysicalDiskConfig>, - ) { - // Leaf node - } - - /// A point where we allow direct access to a `diffus_derive` generated - /// struct representing a change to a `BlueprintPhysicalDiskConfig`. - /// - /// This is the equivalent node in the tree to `visit_disk_change`, but gives a - /// `diffus_derive` generated structure rather than the before and after of - /// the original structs that were diffed. - fn visit_disk_edit( - &mut self, - ctx: &mut BpVisitorContext, - node: &EditedBlueprintPhysicalDiskConfig<'e>, - ) { - visit_disk_edit(self, ctx, node); - } - - /// A change in `BlueprintPhysicalDiskConfig::disposition` - fn visit_disk_disposition_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, BlueprintPhysicalDiskDisposition>, - ) { - // Leaf node - } - - /// A change in `BlueprintPhysicalDiskConfig::identity` - fn visit_disk_identity_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, DiskIdentity>, - ) { - // Leaf node - } - - /// A change in `BlueprintPhysicalDiskConfig::pool_id` - fn visit_disk_pool_id_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, ZpoolUuid>, - ) { - // Leaf node - } -} - -/// The root of the diff for a [`BlueprintPhysicalDisksConfig`] -pub fn visit_root<'e, V>( - v: &mut V, - ctx: &mut BpVisitorContext, - node: Edit<'e, BlueprintPhysicalDisksConfig>, -) where - V: VisitBlueprintPhysicalDisksConfig<'e> + ?Sized, -{ - if let Edit::Change { diff, .. } = node { - if let Edit::Change { diff, .. } = diff.generation { - v.visit_generation_change(ctx, diff.into()); - } - - if let Edit::Change { diff, .. } = diff.disks { - for (&disk_id, edit) in &diff { - ctx.disk_id = Some(*disk_id); - match edit { - map::Edit::Copy(_) => {} - map::Edit::Insert(disk_config) => { - v.visit_disks_insert(ctx, disk_config); - } - map::Edit::Remove(disk_config) => { - v.visit_disks_remove(ctx, disk_config); - } - map::Edit::Change { before, after, diff } => { - v.visit_disk_change(ctx, Change::new(before, after)); - v.visit_disk_edit(ctx, diff); - } - } - } - // Reset the context - ctx.disk_id = None; - } - } -} - -pub fn visit_disk_edit<'e, V>( - v: &mut V, - ctx: &mut BpVisitorContext, - node: &EditedBlueprintPhysicalDiskConfig<'e>, -) where - V: VisitBlueprintPhysicalDisksConfig<'e> + ?Sized, -{ - if let Edit::Change { before, after, .. } = &node.disposition { - v.visit_disk_disposition_change(ctx, Change::new(*before, *after)); - } - if let Edit::Change { before, after, .. } = &node.identity { - v.visit_disk_identity_change(ctx, Change::new(*before, *after)); - } - if let Edit::Change { before, after, .. } = &node.pool_id { - v.visit_disk_pool_id_change(ctx, Change::new(*before, *after)); - } -} - -#[cfg(test)] -mod tests { - use super::*; - use diffus::Diffable; - use omicron_uuid_kinds::{PhysicalDiskUuid, ZpoolUuid}; - - struct TestVisitor<'a> { - before: &'a BlueprintPhysicalDisksConfig, - after: &'a BlueprintPhysicalDisksConfig, - total_inserts: usize, - total_removes: usize, - change_callbacks_fired: usize, - } - - impl<'a> TestVisitor<'a> { - pub fn new( - before: &'a BlueprintPhysicalDisksConfig, - after: &'a BlueprintPhysicalDisksConfig, - ) -> Self { - TestVisitor { - before, - after, - total_inserts: 0, - total_removes: 0, - change_callbacks_fired: 0, - } - } - } - - impl<'e> VisitBlueprintPhysicalDisksConfig<'e> for TestVisitor<'e> { - fn visit_generation_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, Generation>, - ) { - assert_eq!(change.before, &self.before.generation); - assert_eq!(change.after, &self.after.generation); - assert_ne!(self.before.generation, self.after.generation); - - // We aren't operating on a specific disk - assert!(ctx.disk_id.is_none()); - - self.change_callbacks_fired += 1; - } - - fn visit_disks_insert( - &mut self, - ctx: &mut BpVisitorContext, - node: &BlueprintPhysicalDiskConfig, - ) { - assert!(!self.before.disks.contains_key(&node.id)); - assert!(self.after.disks.contains_key(&node.id)); - - // The inserted node is the same as what's in `after` - assert_eq!(node, self.after.disks.get(&node.id).unwrap()); - - // The key for the current disk id was filled in - assert_eq!(ctx.disk_id, Some(node.id)); - - self.total_inserts += 1; - self.change_callbacks_fired += 1; - } - - fn visit_disks_remove( - &mut self, - ctx: &mut BpVisitorContext, - node: &BlueprintPhysicalDiskConfig, - ) { - assert!(self.before.disks.contains_key(&node.id)); - assert!(!self.after.disks.contains_key(&node.id)); - - // The removed node is the same as what's in `before` - assert_eq!(node, self.before.disks.get(&node.id).unwrap()); - - // The key for the current disk id was filled in - assert_eq!(ctx.disk_id, Some(node.id)); - - self.total_removes += 1; - self.change_callbacks_fired += 1; - } - - fn visit_disk_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, BlueprintPhysicalDiskConfig>, - ) { - // The key for the current disk id was filled in and - // the disk with the same id was changed - assert_eq!(ctx.disk_id, Some(change.before.id)); - assert_eq!(ctx.disk_id, Some(change.after.id)); - - // The change is actually correct - assert_eq!( - self.before.disks.get(&ctx.disk_id.unwrap()), - Some(change.before) - ); - assert_eq!( - self.after.disks.get(&ctx.disk_id.unwrap()), - Some(change.after) - ); - self.change_callbacks_fired += 1; - } - - fn visit_disk_disposition_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, BlueprintPhysicalDiskDisposition>, - ) { - assert_ne!(change.before, change.after); - assert_eq!( - self.before - .disks - .get(&ctx.disk_id.unwrap()) - .unwrap() - .disposition, - *change.before - ); - assert_eq!( - self.after - .disks - .get(&ctx.disk_id.unwrap()) - .unwrap() - .disposition, - *change.after - ); - self.change_callbacks_fired += 1; - } - - fn visit_disk_identity_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, DiskIdentity>, - ) { - assert_ne!(change.before, change.after); - assert_eq!( - self.before.disks.get(&ctx.disk_id.unwrap()).unwrap().identity, - *change.before - ); - assert_eq!( - self.after.disks.get(&ctx.disk_id.unwrap()).unwrap().identity, - *change.after - ); - self.change_callbacks_fired += 1; - } - - fn visit_disk_pool_id_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, ZpoolUuid>, - ) { - assert_ne!(change.before, change.after); - assert_eq!( - self.before.disks.get(&ctx.disk_id.unwrap()).unwrap().pool_id, - *change.before - ); - assert_eq!( - self.after.disks.get(&ctx.disk_id.unwrap()).unwrap().pool_id, - *change.after - ); - self.change_callbacks_fired += 1; - } - } - - #[test] - fn diff_same_config() { - let before = BlueprintPhysicalDisksConfig { - generation: Generation::new(), - disks: [BlueprintPhysicalDiskConfig { - disposition: BlueprintPhysicalDiskDisposition::InService, - identity: DiskIdentity { - vendor: "test".into(), - model: "test".into(), - serial: "test".into(), - }, - id: PhysicalDiskUuid::new_v4(), - pool_id: ZpoolUuid::new_v4(), - }] - .into_iter() - .collect(), - }; - let after = before.clone(); - - let mut ctx = BpVisitorContext::default(); - let mut visitor = TestVisitor::new(&before, &after); - let diff = before.diff(&after); - visitor.visit_root(&mut ctx, diff); - - // No change callbacks should fire - assert_eq!(0, visitor.change_callbacks_fired); - } - - #[test] - fn diff_field_changes() { - let before = BlueprintPhysicalDisksConfig { - generation: Generation::new(), - disks: [BlueprintPhysicalDiskConfig { - disposition: BlueprintPhysicalDiskDisposition::InService, - identity: DiskIdentity { - vendor: "test".into(), - model: "test".into(), - serial: "test".into(), - }, - id: PhysicalDiskUuid::new_v4(), - pool_id: ZpoolUuid::new_v4(), - }] - .into_iter() - .collect(), - }; - let mut after = before.clone(); - after.generation = after.generation.next(); - { - let mut disk = after.disks.iter_mut().next().unwrap(); - disk.disposition = BlueprintPhysicalDiskDisposition::Expunged; - disk.identity.vendor = "modified".into(); - disk.pool_id = ZpoolUuid::new_v4(); - } - - let mut ctx = BpVisitorContext::default(); - let mut visitor = TestVisitor::new(&before, &after); - let diff = before.diff(&after); - visitor.visit_root(&mut ctx, diff); - - // A bunch of callbacks fire due to our diffs - assert_eq!(5, visitor.change_callbacks_fired); - } - - #[test] - fn diff_insert_delete_disks() { - let config1 = BlueprintPhysicalDiskConfig { - disposition: BlueprintPhysicalDiskDisposition::InService, - identity: DiskIdentity { - vendor: "test".into(), - model: "test".into(), - serial: "test".into(), - }, - id: PhysicalDiskUuid::new_v4(), - pool_id: ZpoolUuid::new_v4(), - }; - // Using a different `id` means this zone will count as an inserted one, - // and the original zone will be counted as removed. - let mut config2 = config1.clone(); - config2.id = PhysicalDiskUuid::new_v4(); - - let before = BlueprintPhysicalDisksConfig { - generation: Generation::new(), - disks: [config1].into_iter().collect(), - }; - - let after = BlueprintPhysicalDisksConfig { - generation: Generation::new(), - disks: [config2].into_iter().collect(), - }; - - let mut ctx = BpVisitorContext::default(); - let mut visitor = TestVisitor::new(&before, &after); - let diff = before.diff(&after); - visitor.visit_root(&mut ctx, diff); - - assert_eq!(visitor.total_inserts, 1); - assert_eq!(visitor.total_removes, 1); - assert_eq!(visitor.change_callbacks_fired, 2); - } -} diff --git a/nexus/types/src/deployment/diff_visitors/visit_blueprint_zones_config.rs b/nexus/types/src/deployment/diff_visitors/visit_blueprint_zones_config.rs deleted file mode 100644 index b5231578ef3..00000000000 --- a/nexus/types/src/deployment/diff_visitors/visit_blueprint_zones_config.rs +++ /dev/null @@ -1,482 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at https://mozilla.org/MPL/2.0/. - -//! A visitor for `BlueprintZonesConfig` - -use super::{ - BlueprintZoneConfig, BlueprintZoneDisposition, BlueprintZoneType, - BlueprintZonesConfig, BpVisitorContext, Change, EditedBlueprintZoneConfig, -}; - -use diffus::edit::{map, Edit}; -use omicron_common::{api::external::Generation, zpool_name::ZpoolName}; - -/// A trait to visit a [`BlueprintZonesConfig`] -pub trait VisitBlueprintZonesConfig<'e> { - fn visit_root( - &mut self, - ctx: &mut BpVisitorContext, - node: Edit<'e, BlueprintZonesConfig>, - ) { - visit_root(self, ctx, node); - } - - /// A change to `BlueprintZonesConfig::generation` - fn visit_generation_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, Generation>, - ) { - // Leaf node - } - - /// An insert to `BlueprintZonesConfig::zones` - fn visit_zones_insert( - &mut self, - _ctx: &mut BpVisitorContext, - _node: &BlueprintZoneConfig, - ) { - // Leaf node - } - - /// A removal from `BlueprintZonesConfig::zones` - fn visit_zones_remove( - &mut self, - _ctx: &mut BpVisitorContext, - _node: &BlueprintZoneConfig, - ) { - // Leaf node - } - - /// A change in a value in `BlueprintZonesConfig::zones` - fn visit_zone_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, BlueprintZoneConfig>, - ) { - // Leaf node - } - - /// A point where we allow direct access to a `diffus_derive` generated - /// struct representing a change to a `BlueprintZoneConfig`. - /// - /// This is the equivalent node in the tree to `visit_zone_change`, but - /// gives a `diffus_derive` generated structure rather than the before and - /// after of the original structs that were diffed. - fn visit_zone_edit( - &mut self, - ctx: &mut BpVisitorContext, - node: &EditedBlueprintZoneConfig<'e>, - ) { - visit_zone_edit(self, ctx, node); - } - - /// A change in `BlueprintZoneConfig::disposition` - fn visit_zone_disposition_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, BlueprintZoneDisposition>, - ) { - // Leaf node - } - - /// A change in a `BlueprintZoneConfig::filesystem_pool` - fn visit_zone_filesystem_pool_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, Option>, - ) { - // Leaf node - } - - /// A change in a `BlueprintZoneConfig::zone_type` - /// - /// A `BlueprintZoneType` is a complicated structure. In order to keep the - /// first version of this visitor tractable, we just return the a `Change` - /// rather than a diffus `EditedBlueprintZoneType` that we have to walk. - /// We'll likely want to add this to get full coverage, but it can come - /// later, and should probably live in its own visitor that we call from - /// this point. - fn visit_zone_zone_type_change( - &mut self, - _ctx: &mut BpVisitorContext, - _change: Change<'e, BlueprintZoneType>, - ) { - // Leaf node - for now - } -} - -/// The root of the diff for a `BlueprintZonesConfig` -pub fn visit_root<'e, V>( - v: &mut V, - ctx: &mut BpVisitorContext, - node: Edit<'e, BlueprintZonesConfig>, -) where - V: VisitBlueprintZonesConfig<'e> + ?Sized, -{ - if let Edit::Change { diff: bp_zones_config, .. } = node { - if let Edit::Change { diff, .. } = bp_zones_config.generation { - v.visit_generation_change(ctx, diff.into()); - } - if let Edit::Change { diff, .. } = bp_zones_config.zones { - for (&zone_id, bp_zone_config_edit) in &diff { - ctx.zone_id = Some(*zone_id); - match bp_zone_config_edit { - map::Edit::Copy(_) => {} - map::Edit::Insert(bp_zone_config) => { - v.visit_zones_insert(ctx, bp_zone_config); - } - map::Edit::Remove(bp_zone_config) => { - v.visit_zones_remove(ctx, bp_zone_config); - } - map::Edit::Change { - before, - after, - diff: edited_bp_zone_config, - .. - } => { - v.visit_zone_change(ctx, Change::new(before, after)); - v.visit_zone_edit(ctx, edited_bp_zone_config); - } - } - } - // Reset the context - ctx.zone_id = None; - } - } -} - -pub fn visit_zone_edit<'e, V>( - v: &mut V, - ctx: &mut BpVisitorContext, - node: &EditedBlueprintZoneConfig<'e>, -) where - V: VisitBlueprintZonesConfig<'e> + ?Sized, -{ - if let Edit::Change { diff, .. } = &node.disposition { - v.visit_zone_disposition_change(ctx, diff.into()); - } - if let Edit::Change { diff, .. } = &node.filesystem_pool { - v.visit_zone_filesystem_pool_change(ctx, diff.into()); - } - if let Edit::Change { diff, .. } = &node.zone_type { - v.visit_zone_zone_type_change(ctx, diff.into()); - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::deployment::blueprint_zone_type; - use diffus::Diffable; - use nexus_sled_agent_shared::inventory::OmicronZoneDataset; - use omicron_uuid_kinds::{OmicronZoneUuid, ZpoolUuid}; - use std::collections::BTreeSet; - - struct TestVisitor<'a> { - before: &'a BlueprintZonesConfig, - after: &'a BlueprintZonesConfig, - total_inserts: usize, - total_removes: usize, - change_callbacks_fired: usize, - } - - impl<'a> TestVisitor<'a> { - pub fn new( - before: &'a BlueprintZonesConfig, - after: &'a BlueprintZonesConfig, - ) -> Self { - TestVisitor { - before, - after, - total_inserts: 0, - total_removes: 0, - change_callbacks_fired: 0, - } - } - } - - impl<'e> VisitBlueprintZonesConfig<'e> for TestVisitor<'e> { - fn visit_generation_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, Generation>, - ) { - assert_eq!(change.before, &self.before.generation); - assert_eq!(change.after, &self.after.generation); - assert_ne!(self.before.generation, self.after.generation); - - // We aren't operating on a particular zone - assert!(ctx.zone_id.is_none()); - - self.change_callbacks_fired += 1; - } - - fn visit_zones_insert( - &mut self, - ctx: &mut BpVisitorContext, - node: &BlueprintZoneConfig, - ) { - let before: BTreeSet<_> = self.before.zones.keys().collect(); - let after: BTreeSet<_> = self.after.zones.keys().collect(); - assert!(!before.contains(&node.id)); - assert!(after.contains(&node.id)); - - // The inserted node is the same as what's in `after` - assert_eq!(node, self.after.zones.get(&node.id).unwrap()); - - // The key for the current zone id was filled in - assert_eq!(ctx.zone_id, Some(node.id)); - - self.total_inserts += 1; - self.change_callbacks_fired += 1; - } - - fn visit_zones_remove( - &mut self, - ctx: &mut BpVisitorContext, - node: &BlueprintZoneConfig, - ) { - let before: BTreeSet<_> = self.before.zones.keys().collect(); - let after: BTreeSet<_> = self.after.zones.keys().collect(); - assert!(before.contains(&node.id)); - assert!(!after.contains(&node.id)); - - // The removed node is the same as what's in `before` - assert_eq!(node, self.before.zones.get(&node.id).unwrap()); - - // The key for the current zone id was filled in - assert_eq!(ctx.zone_id, Some(node.id)); - - self.total_removes += 1; - self.change_callbacks_fired += 1; - } - - fn visit_zone_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, BlueprintZoneConfig>, - ) { - // The key for the current zone id was filled in and - // the zone with the same id was changed - assert_eq!(ctx.zone_id, Some(change.before.id)); - assert_eq!(ctx.zone_id, Some(change.after.id)); - - // The change is actually correct - assert_eq!( - self.before.zones.get(&ctx.zone_id.unwrap()), - Some(change.before) - ); - assert_eq!( - self.after.zones.get(&ctx.zone_id.unwrap()), - Some(change.after) - ); - self.change_callbacks_fired += 1; - } - - fn visit_zone_disposition_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, BlueprintZoneDisposition>, - ) { - assert_ne!(change.before, change.after); - assert_eq!( - self.before - .zones - .get(&ctx.zone_id.unwrap()) - .unwrap() - .disposition, - *change.before - ); - assert_eq!( - self.after - .zones - .get(&ctx.zone_id.unwrap()) - .unwrap() - .disposition, - *change.after - ); - self.change_callbacks_fired += 1; - } - - fn visit_zone_filesystem_pool_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, Option>, - ) { - assert_ne!(change.before, change.after); - assert_eq!( - self.before - .zones - .get(&ctx.zone_id.unwrap()) - .unwrap() - .filesystem_pool, - *change.before - ); - assert_eq!( - self.after - .zones - .get(&ctx.zone_id.unwrap()) - .unwrap() - .filesystem_pool, - *change.after - ); - self.change_callbacks_fired += 1; - } - - fn visit_zone_zone_type_change( - &mut self, - ctx: &mut BpVisitorContext, - change: Change<'e, BlueprintZoneType>, - ) { - assert_ne!(change.before, change.after); - assert_eq!( - self.before.zones.get(&ctx.zone_id.unwrap()).unwrap().zone_type, - *change.before - ); - assert_eq!( - self.after.zones.get(&ctx.zone_id.unwrap()).unwrap().zone_type, - *change.after - ); - self.change_callbacks_fired += 1; - } - } - - #[test] - fn diff_same_blueprint() { - let before = BlueprintZonesConfig { - generation: Generation::new(), - zones: [BlueprintZoneConfig { - disposition: BlueprintZoneDisposition::InService, - id: OmicronZoneUuid::new_v4(), - filesystem_pool: None, - zone_type: BlueprintZoneType::Crucible( - blueprint_zone_type::Crucible { - address: "[2001:db8::1]:8080".parse().unwrap(), - dataset: OmicronZoneDataset { - pool_name: ZpoolName::new_external( - ZpoolUuid::new_v4(), - ), - }, - }, - ), - }] - .into_iter() - .collect(), - }; - let after = before.clone(); - - let mut ctx = BpVisitorContext::default(); - let mut visitor = TestVisitor::new(&before, &after); - let diff = before.diff(&after); - visitor.visit_root(&mut ctx, diff); - - // No change callbacks should fire - assert_eq!(0, visitor.change_callbacks_fired); - } - - #[test] - fn diff_field_changes() { - let before = BlueprintZonesConfig { - generation: Generation::new(), - zones: [BlueprintZoneConfig { - disposition: BlueprintZoneDisposition::InService, - id: OmicronZoneUuid::new_v4(), - filesystem_pool: None, - zone_type: BlueprintZoneType::Crucible( - blueprint_zone_type::Crucible { - address: "[2001:db8::1]:8080".parse().unwrap(), - dataset: OmicronZoneDataset { - pool_name: ZpoolName::new_external( - ZpoolUuid::new_v4(), - ), - }, - }, - ), - }] - .into_iter() - .collect(), - }; - let mut after = before.clone(); - after.generation = after.generation.next(); - { - let mut zone = after.zones.iter_mut().next().unwrap(); - zone.disposition = BlueprintZoneDisposition::Expunged; - zone.filesystem_pool = - Some(ZpoolName::new_external(ZpoolUuid::new_v4())); - zone.zone_type = - BlueprintZoneType::Crucible(blueprint_zone_type::Crucible { - address: "[2001:db8::2]:8080".parse().unwrap(), - dataset: OmicronZoneDataset { - pool_name: ZpoolName::new_external(ZpoolUuid::new_v4()), - }, - }); - } - - let mut ctx = BpVisitorContext::default(); - let mut visitor = TestVisitor::new(&before, &after); - let diff = before.diff(&after); - visitor.visit_root(&mut ctx, diff); - - // A bunch of callbacks fire due to our diffs - assert_eq!(5, visitor.change_callbacks_fired); - } - - #[test] - fn test_insert_delete_zones() { - let before = BlueprintZonesConfig { - generation: Generation::new(), - zones: [BlueprintZoneConfig { - disposition: BlueprintZoneDisposition::InService, - id: OmicronZoneUuid::new_v4(), - filesystem_pool: None, - zone_type: BlueprintZoneType::Crucible( - blueprint_zone_type::Crucible { - address: "[2001:db8::1]:8080".parse().unwrap(), - dataset: OmicronZoneDataset { - pool_name: ZpoolName::new_external( - ZpoolUuid::new_v4(), - ), - }, - }, - ), - }] - .into_iter() - .collect(), - }; - - // Using a different `id` means this zone will count as an inserted one, - // and the original zone will be counted as removed. - - let after = BlueprintZonesConfig { - generation: Generation::new(), - zones: [BlueprintZoneConfig { - disposition: BlueprintZoneDisposition::InService, - id: OmicronZoneUuid::new_v4(), - filesystem_pool: None, - zone_type: BlueprintZoneType::Crucible( - blueprint_zone_type::Crucible { - address: "[2001:db8::1]:8080".parse().unwrap(), - dataset: OmicronZoneDataset { - pool_name: ZpoolName::new_external( - ZpoolUuid::new_v4(), - ), - }, - }, - ), - }] - .into_iter() - .collect(), - }; - - let mut ctx = BpVisitorContext::default(); - let mut visitor = TestVisitor::new(&before, &after); - let diff = before.diff(&after); - visitor.visit_root(&mut ctx, diff); - - assert_eq!(visitor.total_inserts, 1); - assert_eq!(visitor.total_removes, 1); - assert_eq!(visitor.change_callbacks_fired, 2); - } -} diff --git a/nexus/types/src/deployment/id_map.rs b/nexus/types/src/deployment/id_map.rs index ce81bb4a86a..178ad71b5ed 100644 --- a/nexus/types/src/deployment/id_map.rs +++ b/nexus/types/src/deployment/id_map.rs @@ -2,9 +2,9 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. +use daft::BTreeMapDiff; +use daft::Diffable; use derive_where::derive_where; -use diffus::edit::Edit; -use diffus::Diffable; use schemars::JsonSchema; use serde::de::Error as _; use serde::de::Visitor; @@ -13,12 +13,13 @@ use serde::Serialize; use std::collections::btree_map; use std::collections::BTreeMap; use std::fmt; +use std::fmt::Debug; use std::marker::PhantomData; use std::ops::Deref; use std::ops::DerefMut; pub trait IdMappable: - JsonSchema + Serialize + for<'de> Deserialize<'de> + for<'a> Diffable<'a> + JsonSchema + Serialize + for<'de> Deserialize<'de> + Diffable { type Id: Ord + Copy @@ -238,16 +239,14 @@ impl<'de, T: IdMappable> Deserialize<'de> for IdMap { } } -impl<'a, T: IdMappable + 'a> Diffable<'a> for IdMap { - type Diff = BTreeMap<&'a T::Id, diffus::edit::map::Edit<'a, T>>; +impl Diffable for IdMap { + type Diff<'daft> + = BTreeMapDiff<'daft, T::Id, T> + where + T: 'daft; - fn diff(&'a self, other: &'a Self) -> Edit<'a, Self> { - match self.inner.diff(&other.inner) { - Edit::Copy(_) => Edit::Copy(self), - Edit::Change { diff, .. } => { - Edit::Change { before: self, after: other, diff } - } - } + fn diff<'daft>(&'daft self, other: &'daft Self) -> Self::Diff<'daft> { + self.inner.diff(&other.inner) } } @@ -391,7 +390,7 @@ impl<'a, T: IdMappable> OccupiedEntry<'a, T> { #[cfg(test)] mod tests { use super::*; - use diffus::Diffus; + use daft::Diffable; use test_strategy::proptest; use test_strategy::Arbitrary; @@ -404,7 +403,7 @@ mod tests { JsonSchema, Serialize, Deserialize, - Diffus, + Diffable, )] struct TestEntry { id: u8, diff --git a/nexus/types/src/deployment/network_resources.rs b/nexus/types/src/deployment/network_resources.rs index b08e5a25824..e5ac1003da5 100644 --- a/nexus/types/src/deployment/network_resources.rs +++ b/nexus/types/src/deployment/network_resources.rs @@ -5,7 +5,7 @@ use super::tri_map::TriMap; use super::tri_map::TriMapEntry; use anyhow::anyhow; -use diffus::Diffus; +use daft::Diffable; use omicron_common::api::external::MacAddr; use omicron_common::api::internal::shared::SourceNatConfig; use omicron_uuid_kinds::ExternalIpUuid; @@ -222,7 +222,7 @@ pub enum OmicronZoneExternalIpKey { JsonSchema, Serialize, Deserialize, - Diffus, + Diffable, )] pub struct OmicronZoneExternalFloatingIp { pub id: ExternalIpUuid, @@ -241,7 +241,7 @@ pub struct OmicronZoneExternalFloatingIp { JsonSchema, Serialize, Deserialize, - Diffus, + Diffable, )] pub struct OmicronZoneExternalFloatingAddr { pub id: ExternalIpUuid, @@ -271,7 +271,7 @@ impl OmicronZoneExternalFloatingAddr { JsonSchema, Serialize, Deserialize, - Diffus, + Diffable, )] pub struct OmicronZoneExternalSnatIp { pub id: ExternalIpUuid, diff --git a/nexus/types/src/deployment/planning_input.rs b/nexus/types/src/deployment/planning_input.rs index 054c673d486..19ab6560059 100644 --- a/nexus/types/src/deployment/planning_input.rs +++ b/nexus/types/src/deployment/planning_input.rs @@ -17,7 +17,7 @@ use crate::external_api::views::SledState; use chrono::DateTime; use chrono::Utc; use clap::ValueEnum; -use diffus::Diffus; +use daft::Diffable; use ipnetwork::IpNetwork; use omicron_common::address::IpRange; use omicron_common::address::Ipv6Subnet; @@ -376,7 +376,7 @@ impl CockroachDbSettings { Deserialize, Serialize, JsonSchema, - Diffus, + Diffable, )] pub enum CockroachDbClusterVersion { #[display("22.1")] @@ -417,7 +417,7 @@ impl CockroachDbClusterVersion { Deserialize, Serialize, JsonSchema, - Diffus, + Diffable, )] #[serde(tag = "action", content = "data", rename_all = "snake_case")] pub enum CockroachDbPreserveDowngrade { diff --git a/nexus/types/src/deployment/zone_type.rs b/nexus/types/src/deployment/zone_type.rs index 79e7167d185..4f73e461f1e 100644 --- a/nexus/types/src/deployment/zone_type.rs +++ b/nexus/types/src/deployment/zone_type.rs @@ -9,7 +9,7 @@ //! that is not needed by sled-agent. use super::OmicronZoneExternalIp; -use diffus::Diffus; +use daft::Diffable; use nexus_sled_agent_shared::inventory::OmicronZoneDataset; use nexus_sled_agent_shared::inventory::OmicronZoneType; use nexus_sled_agent_shared::inventory::ZoneKind; @@ -31,7 +31,7 @@ use std::net::Ipv6Addr; JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] #[serde(tag = "type", rename_all = "snake_case")] pub enum BlueprintZoneType { @@ -331,7 +331,7 @@ pub mod blueprint_zone_type { use crate::deployment::OmicronZoneExternalFloatingAddr; use crate::deployment::OmicronZoneExternalFloatingIp; use crate::deployment::OmicronZoneExternalSnatIp; - use diffus::Diffus; + use daft::Diffable; use nexus_sled_agent_shared::inventory::OmicronZoneDataset; use omicron_common::api::internal::shared::NetworkInterface; use schemars::JsonSchema; @@ -351,7 +351,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct BoundaryNtp { pub address: SocketAddrV6, @@ -374,7 +374,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct Clickhouse { pub address: SocketAddrV6, @@ -391,7 +391,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct ClickhouseKeeper { pub address: SocketAddrV6, @@ -409,7 +409,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct ClickhouseServer { pub address: SocketAddrV6, @@ -426,7 +426,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct CockroachDb { pub address: SocketAddrV6, @@ -443,7 +443,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct Crucible { pub address: SocketAddrV6, @@ -460,7 +460,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct CruciblePantry { pub address: SocketAddrV6, @@ -476,7 +476,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct ExternalDns { pub dataset: OmicronZoneDataset, @@ -498,7 +498,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct InternalDns { pub dataset: OmicronZoneDataset, @@ -527,7 +527,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct InternalNtp { pub address: SocketAddrV6, @@ -543,7 +543,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct Nexus { /// The address at which the internal nexus server is reachable. @@ -568,7 +568,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct Oximeter { pub address: SocketAddrV6, diff --git a/nexus/types/src/external_api/views.rs b/nexus/types/src/external_api/views.rs index 3430d06f724..3bfda3cf0bd 100644 --- a/nexus/types/src/external_api/views.rs +++ b/nexus/types/src/external_api/views.rs @@ -11,7 +11,7 @@ use crate::identity::AssetIdentityMetadata; use api_identity::ObjectIdentity; use chrono::DateTime; use chrono::Utc; -use diffus::Diffus; +use daft::Diffable; use omicron_common::api::external::{ AllowedSourceIps as ExternalAllowedSourceIps, ByteCount, Digest, Error, IdentityMetadata, InstanceState, Name, ObjectIdentity, RoleName, @@ -705,7 +705,7 @@ impl fmt::Display for SledPolicy { PartialEq, Eq, EnumIter, - Diffus, + Diffable, )] #[serde(rename_all = "snake_case")] pub enum SledState { diff --git a/uuid-kinds/Cargo.toml b/uuid-kinds/Cargo.toml index dd12500ae3a..037c037889a 100644 --- a/uuid-kinds/Cargo.toml +++ b/uuid-kinds/Cargo.toml @@ -12,7 +12,7 @@ workspace = true # within omicron. [dependencies] -diffus.workspace = true +daft.workspace = true newtype-uuid.workspace = true paste.workspace = true proptest = { workspace = true, optional = true } diff --git a/uuid-kinds/src/lib.rs b/uuid-kinds/src/lib.rs index 1d6dc600226..f5560cd448a 100644 --- a/uuid-kinds/src/lib.rs +++ b/uuid-kinds/src/lib.rs @@ -14,7 +14,7 @@ pub use newtype_uuid::{ GenericUuid, ParseError, TagError, TypedUuid, TypedUuidKind, TypedUuidTag, }; -use diffus::Diffus; +use daft::Diffable; #[cfg(feature = "schemars08")] use schemars::JsonSchema; @@ -23,7 +23,7 @@ macro_rules! impl_typed_uuid_kind { $( paste::paste! { #[cfg_attr(feature = "schemars08", derive(JsonSchema))] - #[derive(Diffus)] + #[derive(Debug, PartialEq, Eq, Diffable)] pub enum [< $kind Kind>] {} impl TypedUuidKind for [< $kind Kind >] { From 9c9d3d1a35ce827de623188fce0699206d5d7b63 Mon Sep 17 00:00:00 2001 From: "oxide-renovate[bot]" <146848827+oxide-renovate[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 05:53:14 +0000 Subject: [PATCH 09/43] Update Rust crate guppy to 0.17.12 (#7408) --- Cargo.lock | 44 +++++++++++++++++++++++++++++--------------- Cargo.toml | 2 +- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3b8aa2e0678..f23a6e8bbad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1059,6 +1059,20 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "cargo_metadata" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8769706aad5d996120af43197bf46ef6ad0fda35216b4505f926a365a232d924" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.24", + "serde", + "serde_json", + "thiserror 2.0.11", +] + [[package]] name = "cargo_toml" version = "0.20.5" @@ -1138,9 +1152,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.17.0" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0890061c4d3223e7267f3bad2ec40b997d64faac1c2815a4a9d95018e2b9e9c" +checksum = "8d4ba6e40bd1184518716a6e1a781bf9160e286d219ccdb8ab2612e74cfe4789" dependencies = [ "smallvec 1.13.2", "target-lexicon", @@ -3658,13 +3672,13 @@ dependencies = [ [[package]] name = "guppy" -version = "0.17.8" +version = "0.17.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf47f1dcacf93614a4181e308b8341f5bf5d4f7ae2f67cc5a078df8e7023ea63" +checksum = "5a70d0754232d1c2fd4819914085dc06cccbe2f2377905cdd2e668ca77df6e72" dependencies = [ "ahash", "camino", - "cargo_metadata", + "cargo_metadata 0.19.1", "cfg-if", "debug-ignore", "fixedbitset", @@ -6973,7 +6987,7 @@ version = "0.1.0" dependencies = [ "anyhow", "camino", - "cargo_metadata", + "cargo_metadata 0.18.1", "clap", "expectorate", "newtype_derive", @@ -7208,7 +7222,7 @@ version = "0.1.0" dependencies = [ "anyhow", "camino", - "cargo_metadata", + "cargo_metadata 0.18.1", "clap", "expectorate", "futures", @@ -7262,7 +7276,7 @@ version = "0.1.0" dependencies = [ "anyhow", "camino", - "cargo_metadata", + "cargo_metadata 0.18.1", "fs-err", "omicron-workspace-hack", "serde", @@ -7276,7 +7290,7 @@ dependencies = [ "anyhow", "camino", "camino-tempfile", - "cargo_metadata", + "cargo_metadata 0.18.1", "chrono", "clap", "fs-err", @@ -8445,9 +8459,9 @@ dependencies = [ [[package]] name = "pathdiff" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" dependencies = [ "camino", ] @@ -11727,9 +11741,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "target-spec" -version = "3.2.2" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c5743abbf7bc7d5296ae61368b50cd218ac09432281cb5d48b97308d5c27909" +checksum = "da00bc76fdc8b7ed7163b7cf728179277b26985c177510b69cc320f30b5a517f" dependencies = [ "cfg-expr", "guppy-workspace-hack", @@ -12980,7 +12994,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2990d9ea5967266ea0ccf413a4aa5c42a93dbcfda9cb49a97de6931726b12566" dependencies = [ "anyhow", - "cargo_metadata", + "cargo_metadata 0.18.1", "cfg-if", "git2", "regex", @@ -13745,7 +13759,7 @@ dependencies = [ "anyhow", "camino", "camino-tempfile", - "cargo_metadata", + "cargo_metadata 0.18.1", "cargo_toml", "clap", "fs-err", diff --git a/Cargo.toml b/Cargo.toml index 3b1bfa61d14..fbebc842622 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -412,7 +412,7 @@ gateway-test-utils = { path = "gateway-test-utils" } gateway-types = { path = "gateway-types" } gethostname = "0.5.0" glob = "0.3.2" -guppy = "0.17.8" +guppy = "0.17.12" headers = "0.4.0" heck = "0.5" hex = "0.4.3" From 0d1dec0ef54d9c8ddc74c8cb30f72709b3885507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karen=20C=C3=A1rcamo?= Date: Wed, 5 Feb 2025 23:59:13 -0800 Subject: [PATCH 10/43] [clickhouse] Fix DB initialisation on cluster nodes (#7454) When running some manual tests with reconfigurator adding nodes to an existing cluster, I noticed that every time I added a new node, all of the other nodes would delete their existing `oximeter` database and create a new `oximeter` database with it's tables from scratch. This is not the behaviour we want. The other nodes should continue as they are and only the new node should have the database and schema initialised. The unwanted behaviour when adding a new node can be seen in the following logs of a node that already existed and was part of the cluster. - In the first line of the logs we can see initialisation is being skipped as the database already exists and is in the correct version. - At some point before 23:11:44.738Z the new node is created, db-wipe.sql runs `DROP DATABASE IF EXISTS oximeter ON CLUSTER oximeter_cluster SYNC;` and deletes every `oximeter` database in the nodes. - At 23:11:44.738Z clickhouse-admin sees the schema version is less that the current version (assumes "0" if the database doesn't exist) and wipes all of the databases again. - At 23:11:51.510Z the all of the databases are wiped again presumably because some other node was also wiping everything, and entered some sort of DROP DATABASE loop. - Finally, at 23:12:27.277Z clickhouse-admin skips initialization because the database is initialised and on the correct version. ```console 23:11:22.614Z INFO clickhouse-admin-server (ClickhouseCli): skipping initialization of replicated ClickHouse cluster at version 13 file = clickhouse-admin/src/http_entrypoints.rs:117 23:11:22.614Z INFO clickhouse-admin-server (dropshot): request completed file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:867 latency_us = 2412 local_addr = [fd00:1122:3344:101::26]:8888 method = PUT remote_addr = [fd00:1122:3344:101::c]:51733 req_id = a770bb5b-31cb-4bae-9647-cead050daec9 response_code = 204 uri = /init 23:11:44.590Z INFO clickhouse-admin-server (dropshot): accepted connection file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:1025 local_addr = [fd00:1122:3344:101::26]:8888 remote_addr = [fd00:1122:3344:101::c]:59101 23:11:44.729Z INFO clickhouse-admin-server (dropshot): request completed file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:867 latency_us = 35047 local_addr = [fd00:1122:3344:101::26]:8888 method = PUT remote_addr = [fd00:1122:3344:101::c]:59101 req_id = 6319e2c0-3f86-4e50-8565-457aa1f93654 response_code = 201 uri = /config 23:11:44.735Z INFO clickhouse-admin-server (ClickhouseCli): initializing replicated ClickHouse cluster to version 13 file = clickhouse-admin/src/http_entrypoints.rs:102 23:11:44.735Z INFO clickhouse-admin-server (ClickhouseCli): reading db version file = oximeter/db/src/client/mod.rs:732 id = 53f2d94d-0be6-4cc8-bc41-c4653ecc87ee 23:11:44.738Z INFO clickhouse-admin-server (ClickhouseCli): read oximeter database version file = oximeter/db/src/client/mod.rs:736 id = 53f2d94d-0be6-4cc8-bc41-c4653ecc87ee version = 0 23:11:44.738Z INFO clickhouse-admin-server (ClickhouseCli): wiping and re-initializing oximeter schema file = oximeter/db/src/client/mod.rs:741 id = 53f2d94d-0be6-4cc8-bc41-c4653ecc87ee 23:11:46.630Z INFO clickhouse-admin-server (dropshot): accepted connection file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:1025 local_addr = [fd00:1122:3344:101::26]:8888 remote_addr = [fd00:1122:3344:101::b]:44556 23:11:46.763Z INFO clickhouse-admin-server (dropshot): request completed file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:867 latency_us = 39948 local_addr = [fd00:1122:3344:101::26]:8888 method = PUT remote_addr = [fd00:1122:3344:101::b]:44556 req_id = 025a88a4-7fc6-420f-8301-59c2354946b7 response_code = 201 uri = /config 23:11:46.919Z INFO clickhouse-admin-server (dropshot): accepted connection file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:1025 local_addr = [fd00:1122:3344:101::26]:8888 remote_addr = [fd00:1122:3344:101::a]:38254 23:11:47.049Z INFO clickhouse-admin-server (dropshot): request completed file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:867 latency_us = 43307 local_addr = [fd00:1122:3344:101::26]:8888 method = PUT remote_addr = [fd00:1122:3344:101::a]:38254 req_id = 7c651e0d-d685-48c1-bed7-ad47a3dec2d4 response_code = 201 uri = /config 23:11:51.504Z INFO clickhouse-admin-server (dropshot): request completed error_message_external = Internal Server Error error_message_internal = can't initialize replicated ClickHouse cluster to version 13: Native protocol error file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:855 latency_us = 6774798 local_addr = [fd00:1122:3344:101::26]:8888 method = PUT remote_addr = [fd00:1122:3344:101::c]:59101 req_id = a7af1143-2b0e-44a3-80f6-c64b2ef9f294 response_code = 500 uri = /init 23:11:51.509Z WARN clickhouse-admin-server (ClickhouseCli): oximeter database does not exist, or is out-of-date file = oximeter/db/src/client/mod.rs:823 id = 53f2d94d-0be6-4cc8-bc41-c4653ecc87ee 23:11:51.509Z INFO clickhouse-admin-server (ClickhouseCli): initializing replicated ClickHouse cluster to version 13 file = clickhouse-admin/src/http_entrypoints.rs:102 23:11:51.509Z INFO clickhouse-admin-server (ClickhouseCli): reading db version file = oximeter/db/src/client/mod.rs:732 id = 53f2d94d-0be6-4cc8-bc41-c4653ecc87ee 23:11:51.510Z WARN clickhouse-admin-server (ClickhouseCli): oximeter database does not exist, or is out-of-date file = oximeter/db/src/client/mod.rs:823 id = 53f2d94d-0be6-4cc8-bc41-c4653ecc87ee 23:11:51.510Z INFO clickhouse-admin-server (ClickhouseCli): read oximeter database version file = oximeter/db/src/client/mod.rs:736 id = 53f2d94d-0be6-4cc8-bc41-c4653ecc87ee version = 0 23:11:51.510Z INFO clickhouse-admin-server (ClickhouseCli): wiping and re-initializing oximeter schema file = oximeter/db/src/client/mod.rs:741 id = 53f2d94d-0be6-4cc8-bc41-c4653ecc87ee 23:12:01.769Z WARN clickhouse-admin-server (dropshot): request handling cancelled (client disconnected) file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:801 latency_us = 15003374 local_addr = [fd00:1122:3344:101::26]:8888 method = PUT remote_addr = [fd00:1122:3344:101::b]:44556 req_id = 90380119-9271-488c-b6a4-904f58b5b081 uri = /init 23:12:02.053Z WARN clickhouse-admin-server (dropshot): request handling cancelled (client disconnected) file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:801 latency_us = 15003025 local_addr = [fd00:1122:3344:101::26]:8888 method = PUT remote_addr = [fd00:1122:3344:101::a]:38254 req_id = 41ba9f0b-50bd-4115-9dad-6f7c7b6d83d7 uri = /init 23:12:27.262Z INFO clickhouse-admin-server (ClickhouseCli): inserting current version file = oximeter/db/src/client/mod.rs:764 id = 53f2d94d-0be6-4cc8-bc41-c4653ecc87ee version = 13 23:12:27.275Z WARN clickhouse-admin-server (dropshot): request completed after handler was already cancelled file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:943 local_addr = [fd00:1122:3344:101::26]:8888 method = PUT remote_addr = [fd00:1122:3344:101::b]:44556 req_id = 90380119-9271-488c-b6a4-904f58b5b081 response_code = 204 uri = /init 23:12:27.277Z INFO clickhouse-admin-server (ClickhouseCli): skipping initialization of replicated ClickHouse cluster at version 13 file = clickhouse-admin/src/http_entrypoints.rs:117 ``` To fix this issue, we are now only wiping the database associated with the node we're targeting. Here are the logs after applying the fix: ```console 23:47:52.506Z INFO clickhouse-admin-server (ClickhouseCli): skipping initialization of replicated ClickHouse cluster at version 13 file = clickhouse-admin/src/http_entrypoints.rs:117 23:47:52.506Z INFO clickhouse-admin-server (dropshot): request completed file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:867 latency_us = 2386 local_addr = [fd00:1122:3344:101::28]:8888 method = PUT remote_addr = [fd00:1122:3344:101::b]:64010 req_id = 027b52d9-e5c8-4e35-998c-9e62529fb34c response_code = 204 uri = /init 23:47:54.394Z INFO clickhouse-admin-server (dropshot): accepted connection file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:1025 local_addr = [fd00:1122:3344:101::28]:8888 remote_addr = [fd00:1122:3344:101::a]:50268 23:47:54.436Z INFO clickhouse-admin-server (dropshot): request completed file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:867 latency_us = 41111 local_addr = [fd00:1122:3344:101::28]:8888 method = PUT remote_addr = [fd00:1122:3344:101::a]:50268 req_id = 62e645c8-30bb-4508-b18d-7c70e378c8ee response_code = 201 uri = /config 23:47:54.439Z INFO clickhouse-admin-server (ClickhouseCli): skipping initialization of replicated ClickHouse cluster at version 13 file = clickhouse-admin/src/http_entrypoints.rs:117 23:47:54.439Z INFO clickhouse-admin-server (dropshot): request completed file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:867 latency_us = 2249 local_addr = [fd00:1122:3344:101::28]:8888 method = PUT remote_addr = [fd00:1122:3344:101::a]:50268 req_id = 64303d02-dd4f-45ac-8b2d-9e7f3f7b1e69 response_code = 204 uri = /init 23:48:52.437Z INFO clickhouse-admin-server (dropshot): accepted connection file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:1025 local_addr = [fd00:1122:3344:101::28]:8888 remote_addr = [fd00:1122:3344:101::b]:61722 23:48:52.477Z INFO clickhouse-admin-server (dropshot): request completed file = /home/coatlicue/.cargo/registry/src/index.crates.io-6f17d22bba15001f/dropshot-0.15.1/src/server.rs:867 latency_us = 39209 local_addr = [fd00:1122:3344:101::28]:8888 method = PUT remote_addr = [fd00:1122:3344:101::b]:61722 req_id = 837ef3af-af33-4599-9459-06f0569018ad response_code = 201 uri = /config root@oxz_clickhouse_server_f5abb38c:~# cat /var/svc/log/oxide-clickhouse-admin-server:default.log | grep wiping | looker root@oxz_clickhouse_server_f5abb38c:~# ``` --- oximeter/db/src/client/mod.rs | 49 +++++++++++++---------------------- 1 file changed, 18 insertions(+), 31 deletions(-) diff --git a/oximeter/db/src/client/mod.rs b/oximeter/db/src/client/mod.rs index 1d09ec37236..bc52d446fb8 100644 --- a/oximeter/db/src/client/mod.rs +++ b/oximeter/db/src/client/mod.rs @@ -714,10 +714,8 @@ impl Client { /// Validates that the schema used by the DB matches the version used by /// the executable using it. /// - /// This function will **wipe** metrics data if the version stored within - /// the DB is less than the schema version of Oximeter. - /// If the version in the DB is newer than what is known to Oximeter, an - /// error is returned. + /// If the version in the DB is newer or older than what is known to Oximeter, + /// an error is returned. /// /// If you would like to non-destructively upgrade the database, then either /// the included binary `clickhouse-schema-updater` or the method @@ -737,21 +735,19 @@ impl Client { // Decide how to conform the on-disk version with this version of // Oximeter. - if version < expected_version { - info!(self.log, "wiping and re-initializing oximeter schema"); - // If the on-storage version is less than the constant embedded into - // this binary, the DB is out-of-date. Drop it, and re-populate it - // later. + if version == 0 { + info!(self.log, "initializing oximeter schema"); + // If the version is 0 the database does not exist. + // Create and populate it. if !replicated { - self.wipe_single_node_db().await?; self.init_single_node_db().await?; } else { - self.wipe_replicated_db().await?; self.init_replicated_db().await?; } - } else if version > expected_version { + } else if version != expected_version { // If the on-storage version is greater than the constant embedded - // into this binary, we may have downgraded. + // into this binary, we may have downgraded. If it's less, a schema + // upgrade may not have been successful. return Err(Error::DatabaseVersionMismatch { expected: crate::model::OXIMETER_VERSION, found: version, @@ -1635,9 +1631,9 @@ mod tests { }), ), ( - "test_database_version_wipes_old_version_replicated", + "test_database_version_will_not_upgrade_replicated", Box::new(move |db, client| { - Box::pin(test_database_version_wipes_old_version_impl(db, client)) + Box::pin(test_database_version_will_not_upgrade_impl(db, client)) }), ), ( @@ -3446,18 +3442,18 @@ mod tests { } #[tokio::test] - async fn test_database_version_wipes_old_version() { - let logctx = test_setup_log("test_database_version_wipes_old_version"); + async fn test_database_version_will_not_upgrade() { + let logctx = test_setup_log("test_database_version_will_not_upgrade"); let mut db = ClickHouseDeployment::new_single_node(&logctx).await.unwrap(); let client = Client::new(db.native_address().into(), &logctx.log); // NOTE: We don't init the DB, because the test explicitly tests that. - test_database_version_wipes_old_version_impl(&db, client).await; + test_database_version_will_not_upgrade_impl(&db, client).await; db.cleanup().await.unwrap(); logctx.cleanup_successful(); } - async fn test_database_version_wipes_old_version_impl( + async fn test_database_version_will_not_upgrade_impl( db: &ClickHouseDeployment, client: Client, ) { @@ -3468,21 +3464,12 @@ mod tests { .await .expect("Failed to initialize timeseries database"); - // Insert data here so we can remove it later. - // - // The values here don't matter much, we just want to check that - // the database data gets dropped later. - assert_eq!(0, get_schema_count(&client, None).await); - let sample = oximeter_test_utils::make_sample(); - client.insert_samples(&[sample.clone()]).await.unwrap(); - assert_eq!(1, get_schema_count(&client, None).await); - - // If we try to upgrade to a newer version, we'll drop old data. + // If we try to upgrade to a newer version, we expect a failure when + // reinitialising the client. client .initialize_db_with_version(replicated, model::OXIMETER_VERSION + 1) .await - .expect("Should have initialized database successfully"); - assert_eq!(0, get_schema_count(&client, None).await); + .expect_err("Should have failed, upgrades are not supported"); } #[tokio::test] From f0bf27e94b9f6f5a5c95d75e7b281ed2cbd847b0 Mon Sep 17 00:00:00 2001 From: Kyle Simpson Date: Thu, 6 Feb 2025 13:17:17 +0000 Subject: [PATCH 11/43] Do not exhaustively maintain `VpcSubnet` routes using a transaction (#7463) This PR reworks VPC subnet create/delete/rename so that they do not require an exhaustive reconcile procedure of the VPC system router managed in concert with their existence. This is instead handled using an explicit foreign key relationship back to the Subnet for this class of rule. As a consequence, these three operations are now sagas to ensure we have crash safety around the creation/deletion/maintenance of all their linked objects. Closes #7404. --- nexus/db-model/src/schema.rs | 1 + nexus/db-model/src/schema_versions.rs | 3 +- nexus/db-model/src/vpc_route.rs | 97 ++- nexus/db-model/src/vpc_subnet.rs | 4 +- nexus/db-queries/src/db/datastore/vpc.rs | 680 +++++++++++-------- nexus/src/app/sagas/mod.rs | 6 + nexus/src/app/sagas/vpc_create.rs | 70 +- nexus/src/app/sagas/vpc_subnet_create.rs | 610 +++++++++++++++++ nexus/src/app/sagas/vpc_subnet_delete.rs | 208 ++++++ nexus/src/app/sagas/vpc_subnet_update.rs | 218 ++++++ nexus/src/app/vpc_router.rs | 39 ++ nexus/src/app/vpc_subnet.rs | 292 +++----- nexus/tests/integration_tests/vpc_routers.rs | 5 +- schema/crdb/dbinit.sql | 25 +- schema/crdb/vpc-subnet-contention/up01.sql | 3 + schema/crdb/vpc-subnet-contention/up02.sql | 82 +++ schema/crdb/vpc-subnet-contention/up03.sql | 6 + schema/crdb/vpc-subnet-contention/up04.sql | 5 + 18 files changed, 1851 insertions(+), 503 deletions(-) create mode 100644 nexus/src/app/sagas/vpc_subnet_create.rs create mode 100644 nexus/src/app/sagas/vpc_subnet_delete.rs create mode 100644 nexus/src/app/sagas/vpc_subnet_update.rs create mode 100644 schema/crdb/vpc-subnet-contention/up01.sql create mode 100644 schema/crdb/vpc-subnet-contention/up02.sql create mode 100644 schema/crdb/vpc-subnet-contention/up03.sql create mode 100644 schema/crdb/vpc-subnet-contention/up04.sql diff --git a/nexus/db-model/src/schema.rs b/nexus/db-model/src/schema.rs index f734d1e88f3..8343d2ff2fc 100644 --- a/nexus/db-model/src/schema.rs +++ b/nexus/db-model/src/schema.rs @@ -1178,6 +1178,7 @@ table! { vpc_router_id -> Uuid, target -> Text, destination -> Text, + vpc_subnet_id -> Nullable, } } diff --git a/nexus/db-model/src/schema_versions.rs b/nexus/db-model/src/schema_versions.rs index 150f4d092df..79831241d99 100644 --- a/nexus/db-model/src/schema_versions.rs +++ b/nexus/db-model/src/schema_versions.rs @@ -17,7 +17,7 @@ use std::collections::BTreeMap; /// /// This must be updated when you change the database schema. Refer to /// schema/crdb/README.adoc in the root of this repository for details. -pub const SCHEMA_VERSION: SemverVersion = SemverVersion::new(122, 0, 0); +pub const SCHEMA_VERSION: SemverVersion = SemverVersion::new(123, 0, 0); /// List of all past database schema versions, in *reverse* order /// @@ -29,6 +29,7 @@ static KNOWN_VERSIONS: Lazy> = Lazy::new(|| { // | leaving the first copy as an example for the next person. // v // KnownVersion::new(next_int, "unique-dirname-with-the-sql-files"), + KnownVersion::new(123, "vpc-subnet-contention"), KnownVersion::new(122, "tuf-artifact-replication"), KnownVersion::new(121, "dataset-to-crucible-dataset"), KnownVersion::new(120, "rendezvous-debug-dataset"), diff --git a/nexus/db-model/src/vpc_route.rs b/nexus/db-model/src/vpc_route.rs index 3015df691f1..dbbf8e16bb4 100644 --- a/nexus/db-model/src/vpc_route.rs +++ b/nexus/db-model/src/vpc_route.rs @@ -109,6 +109,7 @@ pub struct RouterRoute { pub vpc_router_id: Uuid, pub target: RouteTarget, pub destination: RouteDestination, + pub vpc_subnet_id: Option, } impl RouterRoute { @@ -125,6 +126,7 @@ impl RouterRoute { kind: RouterRouteKind(kind), target: RouteTarget(params.target), destination: RouteDestination::new(params.destination), + vpc_subnet_id: None, } } @@ -133,39 +135,64 @@ impl RouterRoute { /// This defaults to use the same name as the subnet. If this would conflict /// with the internet gateway rules, then the UUID is used instead (alongside /// notice that a name conflict has occurred). - pub fn for_subnet( + pub fn new_subnet( route_id: Uuid, system_router_id: Uuid, - subnet: Name, + subnet_name: Name, + subnet_id: Uuid, ) -> Self { - let forbidden_names = ["default-v4", "default-v6"]; + let name = Self::deconflict_subnet_name(&subnet_name, route_id); - let name = if forbidden_names.contains(&subnet.as_str()) { + let identity = RouterRouteIdentity::new( + route_id, + external::IdentityMetadataCreateParams { + name, + description: "System-managed VPC Subnet route.".into(), + }, + ); + + // The destination and target are technically presentation-only -- + // these need to accurately track the state of subnet_id, which can + // cause messy reconciles. Otherwise in the app layer we make sure one + // exists for each subnet and keep the fields synced on a best-effort + // basis. The route RPW will always rely on that linked subnet instead + // of these values. + Self { + identity, + vpc_router_id: system_router_id, + kind: RouterRouteKind(external::RouterRouteKind::VpcSubnet), + target: RouteTarget(external::RouteTarget::Subnet( + subnet_name.0.clone(), + )), + destination: RouteDestination(external::RouteDestination::Subnet( + subnet_name.0, + )), + vpc_subnet_id: Some(subnet_id), + } + } + + /// Choose a new name (containing route_id) for a VPC subnet route when + /// it would conflict with prenamed IGW rules. These rules' names are + /// immutable. + pub fn deconflict_subnet_name( + name: &Name, + route_id: Uuid, + ) -> external::Name { + const FORBIDDEN_NAMES: [&str; 2] = ["default-v4", "default-v6"]; + if FORBIDDEN_NAMES.contains(&name.as_str()) { // unwrap safety: a uuid is not by itself a valid name // so prepend it with another string. - // - length constraint is <63 chars, + // - length constraint is <= 63 chars, // - a UUID is 36 chars including hyphens, - // - "{subnet}-" is 11 chars + // - "{name}-" is max 11 chars // - "conflict-" is 9 chars // = 56 chars - format!("conflict-{subnet}-{route_id}").parse().unwrap() + format!("conflict-{name}-{route_id}") + .parse() + .expect("all entries in 'FORBIDDEN_NAMES' are 10 chars long") } else { - subnet.0.clone() - }; - - Self::new( - route_id, - system_router_id, - external::RouterRouteKind::VpcSubnet, - params::RouterRouteCreate { - identity: external::IdentityMetadataCreateParams { - name, - description: format!("VPC Subnet route for '{subnet}'"), - }, - target: external::RouteTarget::Subnet(subnet.0.clone()), - destination: external::RouteDestination::Subnet(subnet.0), - }, - ) + name.0.clone() + } } } @@ -191,6 +218,30 @@ pub struct RouterRouteUpdate { pub destination: RouteDestination, } +impl RouterRouteUpdate { + /// Generate an update for the presentation of an existing `VpcSubnet` route, + /// targeting a new name. + pub fn vpc_subnet_rename( + subnet_name: Name, + time_modified: DateTime, + ) -> Self { + let name = + RouterRoute::deconflict_subnet_name(&subnet_name, Uuid::new_v4()); + + Self { + name: Some(Name(name)), + description: None, + time_modified, + target: RouteTarget(external::RouteTarget::Subnet( + subnet_name.0.clone(), + )), + destination: RouteDestination(external::RouteDestination::Subnet( + subnet_name.0, + )), + } + } +} + impl From for RouterRouteUpdate { fn from(params: params::RouterRouteUpdate) -> Self { Self { diff --git a/nexus/db-model/src/vpc_subnet.rs b/nexus/db-model/src/vpc_subnet.rs index eaa7c6e87db..26aa192dfec 100644 --- a/nexus/db-model/src/vpc_subnet.rs +++ b/nexus/db-model/src/vpc_subnet.rs @@ -109,12 +109,13 @@ impl From for views::VpcSubnet { } } -#[derive(AsChangeset)] +#[derive(AsChangeset, Clone, Deserialize, Serialize, Debug)] #[diesel(table_name = vpc_subnet)] pub struct VpcSubnetUpdate { pub name: Option, pub description: Option, pub time_modified: DateTime, + pub custom_router_id: Option>, } impl From for VpcSubnetUpdate { @@ -123,6 +124,7 @@ impl From for VpcSubnetUpdate { name: params.identity.name.map(Name), description: params.identity.description, time_modified: Utc::now(), + custom_router_id: None, } } } diff --git a/nexus/db-queries/src/db/datastore/vpc.rs b/nexus/db-queries/src/db/datastore/vpc.rs index e70e49e4df8..f1a27655735 100644 --- a/nexus/db-queries/src/db/datastore/vpc.rs +++ b/nexus/db-queries/src/db/datastore/vpc.rs @@ -50,6 +50,7 @@ use diesel::result::DatabaseErrorKind; use diesel::result::Error as DieselError; use futures::stream::{self, StreamExt}; use ipnetwork::IpNetwork; +use nexus_auth::authz::ApiResource; use nexus_db_fixed_data::vpc::SERVICES_INTERNET_GATEWAY_DEFAULT_ROUTE_V4; use nexus_db_fixed_data::vpc::SERVICES_INTERNET_GATEWAY_DEFAULT_ROUTE_V6; use nexus_db_fixed_data::vpc::SERVICES_INTERNET_GATEWAY_ID; @@ -290,7 +291,6 @@ impl DataStore { opctx: &OpContext, authz_router: &authz::VpcRouter, ) -> Result<(), Error> { - use nexus_db_fixed_data::vpc::SERVICES_VPC; use nexus_db_fixed_data::vpc_subnet::DNS_VPC_SUBNET; use nexus_db_fixed_data::vpc_subnet::DNS_VPC_SUBNET_ROUTE_ID; use nexus_db_fixed_data::vpc_subnet::NEXUS_VPC_SUBNET; @@ -319,30 +319,33 @@ impl DataStore { { continue; } - self.vpc_create_subnet(opctx, &authz_vpc, vpc_subnet.clone()) + let subnet = self + .vpc_create_subnet(opctx, &authz_vpc, vpc_subnet.clone()) .await - .map(|_| ()) + .map(Some) .map_err(InsertVpcSubnetError::into_external) .or_else(|e| match e { - Error::ObjectAlreadyExists { .. } => Ok(()), + Error::ObjectAlreadyExists { .. } => Ok(None), _ => Err(e), })?; - - let route = RouterRoute::for_subnet( - route_id, - SERVICES_VPC.system_router_id, - vpc_subnet.name().clone().into(), - ); - - self.router_create_route(opctx, &authz_router, route) + if let Some((.., subnet)) = subnet { + self.vpc_create_subnet_route( + opctx, + &authz_router, + &subnet, + route_id, + ) .await .map(|_| ()) .or_else(|e| match e { Error::ObjectAlreadyExists { .. } => Ok(()), _ => Err(e), })?; + } } + self.vpc_increment_rpw_version(opctx, authz_vpc.id()).await?; + info!(opctx.log, "created built-in services vpc subnets"); Ok(()) @@ -861,9 +864,7 @@ impl DataStore { assert_eq!(authz_vpc.id(), subnet.vpc_id); let db_subnet = self.vpc_create_subnet_raw(subnet).await?; - self.vpc_system_router_ensure_subnet_routes(opctx, authz_vpc.id()) - .await - .map_err(InsertVpcSubnetError::External)?; + Ok(( authz::VpcSubnet::new( authz_vpc.clone(), @@ -895,6 +896,22 @@ impl DataStore { db_subnet: &VpcSubnet, authz_subnet: &authz::VpcSubnet, ) -> DeleteResult { + let updated_rows = + self.vpc_delete_subnet_raw(opctx, db_subnet, authz_subnet).await?; + if updated_rows == 0 { + return Err(Error::invalid_request( + "deletion failed due to concurrent modification", + )); + } + Ok(()) + } + + pub async fn vpc_delete_subnet_raw( + &self, + opctx: &OpContext, + db_subnet: &VpcSubnet, + authz_subnet: &authz::VpcSubnet, + ) -> Result { opctx.authorize(authz::Action::Delete, authz_subnet).await?; use db::schema::network_interface; @@ -922,49 +939,66 @@ impl DataStore { // Delete the subnet, conditional on the rcgen not having changed. let now = Utc::now(); - let updated_rows = diesel::update(dsl::vpc_subnet) + diesel::update(dsl::vpc_subnet) .filter(dsl::time_deleted.is_null()) .filter(dsl::id.eq(authz_subnet.id())) .filter(dsl::rcgen.eq(db_subnet.rcgen)) .set(dsl::time_deleted.eq(now)) - .execute_async(&*self.pool_connection_authorized(opctx).await?) + .execute_async(&*conn) .await .map_err(|e| { public_error_from_diesel( e, ErrorHandler::NotFoundByResource(authz_subnet), ) - })?; - if updated_rows == 0 { - return Err(Error::invalid_request( - "deletion failed due to concurrent modification", - )); - } else { - self.vpc_system_router_ensure_subnet_routes( - opctx, - db_subnet.vpc_id, - ) - .await?; + }) + } - Ok(()) - } + /// Insert the system route for a VPC Subnet. + pub async fn vpc_create_subnet_route( + &self, + opctx: &OpContext, + authz_system_router: &authz::VpcRouter, + subnet: &VpcSubnet, + route_id: Uuid, + ) -> CreateResult<(authz::RouterRoute, RouterRoute)> { + let route = db::model::RouterRoute::new_subnet( + route_id, + authz_system_router.id(), + subnet.name().clone().into(), + subnet.id(), + ); + + let route = + self.router_create_route(opctx, authz_system_router, route).await?; + + Ok(( + authz::RouterRoute::new( + authz_system_router.clone(), + route_id, + LookupType::ById(subnet.id()), + ), + route, + )) } - pub async fn vpc_update_subnet( + /// Delete the system route for a VPC Subnet. + pub async fn vpc_delete_subnet_route( &self, opctx: &OpContext, authz_subnet: &authz::VpcSubnet, - updates: VpcSubnetUpdate, - ) -> UpdateResult { - opctx.authorize(authz::Action::Modify, authz_subnet).await?; + ) -> DeleteResult { + use db::schema::router_route::dsl as rr_dsl; - use db::schema::vpc_subnet::dsl; - let out = diesel::update(dsl::vpc_subnet) - .filter(dsl::time_deleted.is_null()) - .filter(dsl::id.eq(authz_subnet.id())) - .set(updates) - .returning(VpcSubnet::as_returning()) - .get_result_async(&*self.pool_connection_authorized(opctx).await?) + let conn = self.pool_connection_authorized(opctx).await?; + diesel::update(rr_dsl::router_route) + .filter(rr_dsl::time_deleted.is_null()) + .filter( + rr_dsl::kind.eq(RouterRouteKind(ExternalRouteKind::VpcSubnet)), + ) + .filter(rr_dsl::vpc_subnet_id.eq(Some(authz_subnet.id()))) + .set(rr_dsl::time_deleted.eq(Utc::now())) + .execute_async(&*conn) .await .map_err(|e| { public_error_from_diesel( @@ -973,84 +1007,209 @@ impl DataStore { ) })?; - self.vpc_system_router_ensure_subnet_routes(opctx, out.vpc_id).await?; - - Ok(out) + Ok(()) } - pub async fn vpc_subnet_set_custom_router( + pub async fn vpc_update_subnet( &self, opctx: &OpContext, authz_subnet: &authz::VpcSubnet, - authz_router: &authz::VpcRouter, - ) -> Result { + custom_router: Option<&authz::VpcRouter>, + mut updates: VpcSubnetUpdate, + ) -> UpdateResult { opctx.authorize(authz::Action::Modify, authz_subnet).await?; - opctx.authorize(authz::Action::Read, authz_router).await?; + if let Some(authz_router) = custom_router { + opctx.authorize(authz::Action::Read, authz_router).await?; - use db::schema::vpc_router::dsl as router_dsl; - use db::schema::vpc_subnet::dsl as subnet_dsl; + // Leave untouched in update query, then attach new. + updates.custom_router_id = None; + } else { + // Explicit removal in update query. + updates.custom_router_id = Some(None); + } - let query = VpcRouter::attach_resource( - authz_router.id(), - authz_subnet.id(), - router_dsl::vpc_router - .into_boxed() - .filter(router_dsl::kind.eq(VpcRouterKind::Custom)), - subnet_dsl::vpc_subnet.into_boxed(), - u32::MAX, - diesel::update(subnet_dsl::vpc_subnet).set(( - subnet_dsl::time_modified.eq(Utc::now()), - subnet_dsl::custom_router_id.eq(authz_router.id()), - )), - ); + let time_modified = updates.time_modified; + let err = OptionalError::new(); - query - .attach_and_get_result_async( - &*self.pool_connection_authorized(opctx).await?, - ) + #[derive(Debug)] + enum SubnetError<'a> { + SubnetModify(DieselError), + SystemRoute(DieselError), + SubnetAttachNoRouter(&'a authz::VpcRouter), + SubnetAttachNoSubnet, + SubnetAttachRouterIsSystem, + } + + let conn = self.pool_connection_authorized(opctx).await?; + self.transaction_retry_wrapper("vpc_subnet_update") + .transaction(&conn, |conn| { + let err = err.clone(); + let updates = updates.clone(); + async move { + use db::schema::vpc_subnet::dsl; + let name = updates.name.clone(); + + // Update subnet metadata, and unset subnet->custom router attachment + // if required. + let no_attach_res = match diesel::update(dsl::vpc_subnet) + .filter(dsl::time_deleted.is_null()) + .filter(dsl::id.eq(authz_subnet.id())) + .set(updates) + .returning(VpcSubnet::as_returning()) + .get_result_async(&conn) + .await + { + Ok(o) => o, + Err(e) => { + return Err(err.bail_retryable_or_else( + e, + SubnetError::SubnetModify, + )) + } + }; + + // Fix the presentation of the matching system route. + if let Some(new_name) = name { + use db::schema::router_route::dsl as rr_dsl; + if let Err(e) = diesel::update(rr_dsl::router_route) + .filter(rr_dsl::time_deleted.is_null()) + .filter(rr_dsl::kind.eq(RouterRouteKind( + ExternalRouteKind::VpcSubnet, + ))) + .filter( + rr_dsl::vpc_subnet_id + .eq(Some(authz_subnet.id())), + ) + .set(RouterRouteUpdate::vpc_subnet_rename( + new_name, + time_modified, + )) + .execute_async(&conn) + .await + { + return Err(err.bail_retryable_or_else( + e, + SubnetError::SystemRoute, + )); + } + } + + // Apply subnet->custom router attachment/detachment. + if let Some(authz_router) = custom_router { + use db::schema::vpc_router::dsl as router_dsl; + use db::schema::vpc_subnet::dsl as subnet_dsl; + + let query = VpcRouter::attach_resource( + authz_router.id(), + authz_subnet.id(), + router_dsl::vpc_router.into_boxed().filter( + router_dsl::kind.eq(VpcRouterKind::Custom), + ), + subnet_dsl::vpc_subnet.into_boxed(), + u32::MAX, + diesel::update(subnet_dsl::vpc_subnet).set(( + subnet_dsl::time_modified.eq(Utc::now()), + subnet_dsl::custom_router_id + .eq(authz_router.id()), + )), + ); + + query + .attach_and_get_result_async(&conn) + .await + .map(|(_, resource)| resource) + .map_err(|e| match e { + AttachError::CollectionNotFound => { + err.bail(SubnetError::SubnetAttachNoRouter( + authz_router, + )) + } + AttachError::ResourceNotFound => { + err.bail(SubnetError::SubnetAttachNoSubnet) + } + // The only other failure reason can be an attempt to use a system router. + AttachError::NoUpdate { .. } => err.bail( + SubnetError::SubnetAttachRouterIsSystem, + ), + AttachError::DatabaseError(e) => e, + }) + } else { + Ok(no_attach_res) + } + } + }) .await - .map(|(_, resource)| resource) - .map_err(|e| match e { - AttachError::CollectionNotFound => Error::not_found_by_id( - ResourceType::VpcRouter, - &authz_router.id(), - ), - AttachError::ResourceNotFound => Error::not_found_by_id( - ResourceType::VpcSubnet, - &authz_subnet.id(), - ), - // The only other failure reason can be an attempt to use a system router. - AttachError::NoUpdate { .. } => Error::invalid_request( - "cannot attach a system router to a VPC subnet", + .map_err(|e| match err.take() { + Some(SubnetError::SubnetModify(e)) => public_error_from_diesel( + e, + ErrorHandler::NotFoundByResource(authz_subnet), ), - AttachError::DatabaseError(e) => { + Some(SubnetError::SystemRoute(e)) => { public_error_from_diesel(e, ErrorHandler::Server) + .internal_context( + "failed to modify nexus-managed system route", + ) } + Some(SubnetError::SubnetAttachNoSubnet) => { + Error::ObjectNotFound { + type_name: ResourceType::VpcSubnet, + lookup_type: authz_subnet.lookup_type().clone(), + } + } + Some(SubnetError::SubnetAttachNoRouter(r)) => { + Error::ObjectNotFound { + type_name: ResourceType::VpcRouter, + lookup_type: r.lookup_type().clone(), + } + } + Some(SubnetError::SubnetAttachRouterIsSystem) => { + Error::invalid_request( + "cannot attach a system router to a VPC subnet", + ) + } + _ => public_error_from_diesel(e, ErrorHandler::Server), }) } - pub async fn vpc_subnet_unset_custom_router( + pub async fn vpc_subnet_set_custom_router( &self, opctx: &OpContext, authz_subnet: &authz::VpcSubnet, + authz_router: &authz::VpcRouter, ) -> Result { - opctx.authorize(authz::Action::Modify, authz_subnet).await?; - - use db::schema::vpc_subnet::dsl; + self.vpc_update_subnet( + opctx, + authz_subnet, + Some(authz_router), + VpcSubnetUpdate { + name: None, + description: None, + time_modified: Utc::now(), + // Filled by `vpc_update_subnet`. + custom_router_id: None, + }, + ) + .await + } - diesel::update(dsl::vpc_subnet) - .filter(dsl::time_deleted.is_null()) - .filter(dsl::id.eq(authz_subnet.id())) - .set(dsl::custom_router_id.eq(Option::::None)) - .returning(VpcSubnet::as_returning()) - .get_result_async(&*self.pool_connection_authorized(opctx).await?) - .await - .map_err(|e| { - public_error_from_diesel( - e, - ErrorHandler::NotFoundByResource(authz_subnet), - ) - }) + pub async fn vpc_subnet_unset_custom_router( + &self, + opctx: &OpContext, + authz_subnet: &authz::VpcSubnet, + ) -> Result { + self.vpc_update_subnet( + opctx, + authz_subnet, + None, + VpcSubnetUpdate { + name: None, + description: None, + time_modified: Utc::now(), + // Filled by `vpc_update_subnet`. + custom_router_id: None, + }, + ) + .await } pub async fn subnet_list_instance_network_interfaces( @@ -2112,154 +2271,7 @@ impl DataStore { }) } - /// Ensure the system router for a VPC has the correct set of subnet - /// routing rules, after any changes to a subnet. - pub async fn vpc_system_router_ensure_subnet_routes( - &self, - opctx: &OpContext, - vpc_id: Uuid, - ) -> Result<(), Error> { - // These rules are immutable from a user's perspective, and - // aren't something which they can meaningfully interact with, - // so uuid stability on e.g. VPC rename is not a primary concern. - // We make sure only to alter VPC subnet rules here: users may - // modify other system routes like internet gateways (which are - // `RouteKind::Default`). - let conn = self.pool_connection_authorized(opctx).await?; - self.transaction_retry_wrapper("vpc_subnet_route_reconcile") - .transaction(&conn, |conn| async move { - use db::schema::router_route::dsl; - use db::schema::vpc::dsl as vpc; - use db::schema::vpc_subnet::dsl as subnet; - - let system_router_id = vpc::vpc - .filter(vpc::id.eq(vpc_id)) - .filter(vpc::time_deleted.is_null()) - .select(vpc::system_router_id) - .limit(1) - .get_result_async(&conn) - .await?; - - let valid_subnets: Vec = subnet::vpc_subnet - .filter(subnet::vpc_id.eq(vpc_id)) - .filter(subnet::time_deleted.is_null()) - .select(VpcSubnet::as_select()) - .load_async(&conn) - .await?; - - let current_rules: Vec = dsl::router_route - .filter( - dsl::kind - .eq(RouterRouteKind(ExternalRouteKind::VpcSubnet)), - ) - .filter(dsl::time_deleted.is_null()) - .filter(dsl::vpc_router_id.eq(system_router_id)) - .select(RouterRoute::as_select()) - .load_async(&conn) - .await?; - - // Build the add/delete sets. - let expected_names: HashSet = valid_subnets - .iter() - .map(|v| v.identity.name.clone()) - .collect(); - - // This checks that we have rules which *point to* the named - // subnets, rather than working with rule names (even if these - // are set to match the subnet where possible). - // Rule names are effectively randomised when someone, e.g., - // names a subnet "default-v4"/"-v6", and this prevents us - // from repeatedly adding/deleting that route. - let mut found_names = HashSet::new(); - let mut invalid = Vec::new(); - for rule in current_rules { - let id = rule.id(); - match (rule.kind.0, rule.target.0) { - ( - ExternalRouteKind::VpcSubnet, - RouteTarget::Subnet(n), - ) if expected_names.contains(Name::ref_cast(&n)) => { - let _ = found_names.insert(n.into()); - } - _ => invalid.push(id), - } - } - - // Add/Remove routes. Retry if number is incorrect due to - // concurrent modification. - let now = Utc::now(); - let to_update = invalid.len(); - let updated_rows = diesel::update(dsl::router_route) - .filter(dsl::time_deleted.is_null()) - .filter(dsl::id.eq_any(invalid)) - .set(dsl::time_deleted.eq(now)) - .execute_async(&conn) - .await?; - - if updated_rows != to_update { - return Err(DieselError::RollbackTransaction); - } - - // Duplicate rules are caught here using the UNIQUE constraint - // on names in a router. Only nexus can alter the system router, - // so there is no risk of collision with user-specified names. - // - // Subnets named "default-v4" or "default-v6" have their rules renamed - // to include the rule UUID. - for subnet in expected_names.difference(&found_names) { - let route_id = Uuid::new_v4(); - let route = db::model::RouterRoute::for_subnet( - route_id, - system_router_id, - subnet.clone(), - ); - - match Self::router_create_route_on_connection(route, &conn) - .await - { - Err(Error::Conflict { .. }) => { - return Err(DieselError::RollbackTransaction) - } - Err(_) => return Err(DieselError::NotFound), - _ => {} - } - } - - // Verify that route set is exactly as intended, and rollback otherwise. - let current_rules: Vec = dsl::router_route - .filter( - dsl::kind - .eq(RouterRouteKind(ExternalRouteKind::VpcSubnet)), - ) - .filter(dsl::time_deleted.is_null()) - .filter(dsl::vpc_router_id.eq(system_router_id)) - .select(RouterRoute::as_select()) - .load_async(&conn) - .await?; - - if current_rules.len() != expected_names.len() { - return Err(DieselError::RollbackTransaction); - } - - for rule in current_rules { - match (rule.kind.0, rule.target.0) { - ( - ExternalRouteKind::VpcSubnet, - RouteTarget::Subnet(n), - ) if expected_names.contains(Name::ref_cast(&n)) => {} - _ => return Err(DieselError::RollbackTransaction), - } - } - - Ok(()) - }) - .await - .map_err(|e| public_error_from_diesel(e, ErrorHandler::Server))?; - - self.vpc_increment_rpw_version(opctx, vpc_id).await - } - - /// Look up a VPC by VNI. + /// Fetch a VPC's system router by the VPC's ID. pub async fn vpc_get_system_router( &self, opctx: &OpContext, @@ -2486,6 +2498,8 @@ impl DataStore { .lookup_for(authz::Action::Read) .await .internal_context("lookup router by id for rules")?; + let vpc_id = authz_vpc.id(); + let mut paginator = Paginator::new(SQL_BATCH_SIZE); let mut all_rules = vec![]; while let Some(p) = paginator.next() { @@ -2508,6 +2522,7 @@ impl DataStore { // are followed by a version bump/notify, so we will be eventually // consistent with route resolution. let mut subnet_names = HashSet::new(); + let mut subnet_ids = HashSet::new(); let mut vpc_names = HashSet::new(); let mut inetgw_names = HashSet::new(); let mut instance_names = HashSet::new(); @@ -2537,22 +2552,56 @@ impl DataStore { } _ => {} } + + if let (ExternalRouteKind::VpcSubnet, Some(id)) = + (rule.kind.0, rule.vpc_subnet_id) + { + subnet_ids.insert(id); + } } - // TODO: This would be nice to solve in fewer queries. - let subnets = stream::iter(subnet_names) - .filter_map(|name| async { + // VpcSubnet routes are control-plane managed, and have a foreign-key relationship + // to subnets they mirror. Prefer this over name resolution when possible, knowing + // that some user routes still require name resolution. + // TODO: This would be nice to solve in fewer queries. Should we just pull the + // complete set if we're a system router? We'll need it anyway. + let mut subnets_by_id = stream::iter(subnet_ids) + .filter_map(|id| async move { db::lookup::LookupPath::new(opctx, self) - .vpc_id(authz_vpc.id()) - .vpc_subnet_name(Name::ref_cast(&name)) + .vpc_subnet_id(id) .fetch() .await .ok() - .map(|(.., subnet)| (name, subnet)) + .map(|(.., subnet)| (id, subnet)) }) .collect::>() .await; + let mut subnets_by_name = subnets_by_id + .values() + .cloned() + .map(|v| (v.name().clone(), v)) + .collect::>(); + + for name in &subnet_names { + if !subnets_by_name.contains_key(name) { + continue; + } + + let Some((.., subnet)) = db::lookup::LookupPath::new(opctx, self) + .vpc_id(vpc_id) + .vpc_subnet_name(Name::ref_cast(name)) + .fetch() + .await + .ok() + else { + continue; + }; + + subnets_by_id.insert(subnet.id(), subnet.clone()); + subnets_by_name.insert(subnet.name().clone(), subnet); + } + // TODO: unused until VPC peering. let _vpcs = stream::iter(vpc_names) .filter_map(|name| async { @@ -2570,7 +2619,7 @@ impl DataStore { let inetgws = stream::iter(inetgw_names) .filter_map(|name| async { db::lookup::LookupPath::new(opctx, self) - .vpc_id(authz_vpc.id()) + .vpc_id(vpc_id) .internet_gateway_name(Name::ref_cast(&name)) .fetch() .await @@ -2611,20 +2660,40 @@ impl DataStore { // to a NO-OP rule. let mut out = HashSet::new(); for rule in all_rules { + let parent_subnet = + if let (ExternalRouteKind::VpcSubnet, Some(id)) = + (rule.kind.0, rule.vpc_subnet_id.as_ref()) + { + subnets_by_id.get(id) + } else { + None + }; + // Some dests/targets (e.g., subnet) resolve to *several* specifiers // to handle both v4 and v6. The user-facing API will prevent severe // mistakes on naked IPs/CIDRs (mixed v4/6), but we need to be smarter // around named entities here. - let (v4_dest, v6_dest) = match rule.destination.0 { - RouteDestination::Ip(ip @ IpAddr::V4(_)) => { + let (v4_dest, v6_dest) = match (rule.destination.0, parent_subnet) { + // This is a VpcSubnet route. Force a `Subnet` destination. + (_, Some(sub)) => ( + Some(sub.ipv4_block.0.into()), + Some(sub.ipv6_block.0.into()), + ), + // Else, use the named resources. These classes of rule are + // user-mutable. + (RouteDestination::Ip(ip @ IpAddr::V4(_)), _) => { (Some(IpNet::host_net(ip)), None) } - RouteDestination::Ip(ip @ IpAddr::V6(_)) => { + (RouteDestination::Ip(ip @ IpAddr::V6(_)), _) => { (None, Some(IpNet::host_net(ip))) } - RouteDestination::IpNet(ip @ IpNet::V4(_)) => (Some(ip), None), - RouteDestination::IpNet(ip @ IpNet::V6(_)) => (None, Some(ip)), - RouteDestination::Subnet(n) => subnets + (RouteDestination::IpNet(ip @ IpNet::V4(_)), _) => { + (Some(ip), None) + } + (RouteDestination::IpNet(ip @ IpNet::V6(_)), _) => { + (None, Some(ip)) + } + (RouteDestination::Subnet(n), _) => subnets_by_name .get(&n) .map(|s| { ( @@ -2635,17 +2704,24 @@ impl DataStore { .unwrap_or_default(), // TODO: VPC peering. - RouteDestination::Vpc(_) => (None, None), + (RouteDestination::Vpc(_), _) => (None, None), }; - let (v4_target, v6_target) = match &rule.target.0 { - RouteTarget::Ip(ip @ IpAddr::V4(_)) => { + let (v4_target, v6_target) = match (&rule.target.0, parent_subnet) { + // This is a VpcSubnet route. Force a `Subnet` target. + (_, Some(sub)) => ( + Some(RouterTarget::VpcSubnet(sub.ipv4_block.0.into())), + Some(RouterTarget::VpcSubnet(sub.ipv6_block.0.into())), + ), + // Else, use the named resources. These classes of rule are + // user-mutable. + (RouteTarget::Ip(ip @ IpAddr::V4(_)), _) => { (Some(RouterTarget::Ip(*ip)), None) } - RouteTarget::Ip(ip @ IpAddr::V6(_)) => { + (RouteTarget::Ip(ip @ IpAddr::V6(_)), _) => { (None, Some(RouterTarget::Ip(*ip))) } - RouteTarget::Subnet(n) => subnets + (RouteTarget::Subnet(n), _) => subnets_by_name .get(&n) .map(|s| { ( @@ -2658,7 +2734,7 @@ impl DataStore { ) }) .unwrap_or_default(), - RouteTarget::Instance(n) => instances + (RouteTarget::Instance(n), _) => instances .get(&n) .map(|i| match i.1.ip { // TODO: update for dual-stack v4/6. @@ -2670,13 +2746,13 @@ impl DataStore { } }) .unwrap_or_default(), - RouteTarget::Drop => { + (RouteTarget::Drop, _) => { (Some(RouterTarget::Drop), Some(RouterTarget::Drop)) } // Internet gateways tag matching packets with their ID, for // NAT IP selection. - RouteTarget::InternetGateway(n) => inetgws + (RouteTarget::InternetGateway(n), _) => inetgws .get(&n) .map(|igw| { ( @@ -2687,7 +2763,7 @@ impl DataStore { .unwrap_or_default(), // TODO: VPC Peering. - RouteTarget::Vpc(_) => (None, None), + (RouteTarget::Vpc(_), _) => (None, None), }; // XXX: Is there another way we should be handling destination @@ -3371,11 +3447,15 @@ mod tests { (authz_project, authz_vpc, db_vpc, authz_router, db_router) } + /// Create a new subnet, while also doing the additional steps + /// covered by the subnet create saga. + #[allow(clippy::too_many_arguments)] async fn new_subnet_ez( opctx: &OpContext, datastore: &DataStore, db_vpc: &Vpc, authz_vpc: &authz::Vpc, + authz_router: &authz::VpcRouter, name: &str, ip: [u8; 4], prefix_len: u8, @@ -3388,10 +3468,10 @@ mod tests { .map(|block| block.0) .unwrap(); - datastore + let out = datastore .vpc_create_subnet( &opctx, - &authz_vpc, + authz_vpc, db::model::VpcSubnet::new( Uuid::new_v4(), db_vpc.id(), @@ -3405,7 +3485,43 @@ mod tests { ), ) .await - .unwrap() + .unwrap(); + + datastore + .vpc_create_subnet_route( + &opctx, + authz_router, + &out.1, + Uuid::new_v4(), + ) + .await + .unwrap(); + + datastore + .vpc_increment_rpw_version(&opctx, authz_vpc.id()) + .await + .unwrap(); + + out + } + + /// Remove an existing subnet, while also doing the additional steps + /// covered by the subnet delete saga. + async fn del_subnet_ez( + opctx: &OpContext, + datastore: &DataStore, + authz_subnet: &authz::VpcSubnet, + db_subnet: &db::model::VpcSubnet, + ) { + datastore + .vpc_delete_subnet(opctx, db_subnet, authz_subnet) + .await + .unwrap(); + datastore.vpc_delete_subnet_route(opctx, authz_subnet).await.unwrap(); + datastore + .vpc_increment_rpw_version(&opctx, db_subnet.vpc_id) + .await + .unwrap(); } // Test to verify that subnet CRUD operations are correctly @@ -3419,7 +3535,7 @@ mod tests { let db = TestDatabase::new_with_datastore(log).await; let (opctx, datastore) = (db.opctx(), db.datastore()); - let (_, authz_vpc, db_vpc, _, db_router) = + let (_, authz_vpc, db_vpc, authz_router, db_router) = create_initial_vpc(log, &opctx, &datastore).await; // InternetGateway route creation is handled by the saga proper, @@ -3438,6 +3554,7 @@ mod tests { &datastore, &db_vpc, &authz_vpc, + &authz_router, "s0", [172, 30, 0, 0], 22, @@ -3458,6 +3575,7 @@ mod tests { &datastore, &db_vpc, &authz_vpc, + &authz_router, "s1", [172, 31, 0, 0], 22, @@ -3477,17 +3595,24 @@ mod tests { .vpc_update_subnet( &opctx, &authz_sub0, + None, VpcSubnetUpdate { name: Some( "a-new-name".parse::().unwrap().into(), ), description: None, time_modified: Utc::now(), + custom_router_id: None, }, ) .await .unwrap(); + datastore + .vpc_increment_rpw_version(&opctx, authz_vpc.id()) + .await + .unwrap(); + verify_all_subnet_routes_in_router( &opctx, &datastore, @@ -3497,7 +3622,7 @@ mod tests { .await; // Delete one, and routes should stay in sync. - datastore.vpc_delete_subnet(&opctx, &sub0, &authz_sub0).await.unwrap(); + del_subnet_ez(&opctx, &datastore, &authz_sub0, &sub0).await; verify_all_subnet_routes_in_router( &opctx, @@ -3512,17 +3637,24 @@ mod tests { .vpc_update_subnet( &opctx, &authz_sub1, + None, VpcSubnetUpdate { name: Some( "default-v4".parse::().unwrap().into(), ), description: None, time_modified: Utc::now(), + custom_router_id: None, }, ) .await .unwrap(); + datastore + .vpc_increment_rpw_version(&opctx, authz_vpc.id()) + .await + .unwrap(); + verify_all_subnet_routes_in_router( &opctx, &datastore, @@ -3537,6 +3669,7 @@ mod tests { &datastore, &db_vpc, &authz_vpc, + &authz_router, "default-v6", [172, 30, 0, 0], 22, @@ -3654,6 +3787,7 @@ mod tests { &datastore, &db_vpc, &authz_vpc, + &authz_router, "s0", [172, 30, 0, 0], 22, diff --git a/nexus/src/app/sagas/mod.rs b/nexus/src/app/sagas/mod.rs index d8ba6abbdd4..f114dee432d 100644 --- a/nexus/src/app/sagas/mod.rs +++ b/nexus/src/app/sagas/mod.rs @@ -50,6 +50,9 @@ pub mod test_saga; pub mod volume_delete; pub mod volume_remove_rop; pub mod vpc_create; +pub mod vpc_subnet_create; +pub mod vpc_subnet_delete; +pub mod vpc_subnet_update; pub mod common_storage; @@ -167,6 +170,9 @@ fn make_action_registry() -> ActionRegistry { volume_delete::SagaVolumeDelete, volume_remove_rop::SagaVolumeRemoveROP, vpc_create::SagaVpcCreate, + vpc_subnet_create::SagaVpcSubnetCreate, + vpc_subnet_delete::SagaVpcSubnetDelete, + vpc_subnet_update::SagaVpcSubnetUpdate, image_delete::SagaImageDelete, region_replacement_start::SagaRegionReplacementStart, region_replacement_drive::SagaRegionReplacementDrive, diff --git a/nexus/src/app/sagas/vpc_create.rs b/nexus/src/app/sagas/vpc_create.rs index 6e1cbfa9abe..a223cdec867 100644 --- a/nexus/src/app/sagas/vpc_create.rs +++ b/nexus/src/app/sagas/vpc_create.rs @@ -12,6 +12,7 @@ use nexus_db_model::InternetGatewayIpPool; use nexus_db_queries::db::queries::vpc_subnet::InsertVpcSubnetError; use nexus_db_queries::{authn, authz, db}; use nexus_defaults as defaults; +use nexus_types::identity::Resource; use omicron_common::api::external; use omicron_common::api::external::IdentityMetadataCreateParams; use omicron_common::api::external::LookupType; @@ -59,6 +60,10 @@ declare_saga_actions! { + svc_create_subnet - svc_create_subnet_undo } + VPC_CREATE_SUBNET_ROUTE -> "route" { + + svc_create_subnet_route + - svc_create_subnet_route_undo + } VPC_UPDATE_FIREWALL -> "firewall" { + svc_update_firewall - svc_update_firewall_undo @@ -95,6 +100,11 @@ pub fn create_dag( "GenerateDefaultV6RouteId", ACTION_GENERATE_ID.as_ref(), )); + builder.append(Node::action( + "subnet_route_id", + "GenerateSubnetRouteId", + ACTION_GENERATE_ID.as_ref(), + )); builder.append(Node::action( "default_subnet_id", "GenerateDefaultSubnetId", @@ -110,6 +120,7 @@ pub fn create_dag( builder.append(vpc_create_v4_route_action()); builder.append(vpc_create_v6_route_action()); builder.append(vpc_create_subnet_action()); + builder.append(vpc_create_subnet_route_action()); builder.append(vpc_update_firewall_action()); builder.append(vpc_create_gateway_action()); builder.append(vpc_notify_sleds_action()); @@ -416,10 +427,59 @@ async fn svc_create_subnet_undo( let (authz_subnet, db_subnet) = sagactx.lookup::<(authz::VpcSubnet, db::model::VpcSubnet)>("subnet")?; + let res = osagactx + .datastore() + .vpc_delete_subnet_raw(&opctx, &db_subnet, &authz_subnet) + .await; + + match res { + Ok(_) | Err(external::Error::ObjectNotFound { .. }) => Ok(()), + Err(e) => Err(e.into()), + } +} + +async fn svc_create_subnet_route( + sagactx: NexusActionContext, +) -> Result { + let osagactx = sagactx.user_data(); + let params = sagactx.saga_params::()?; + let opctx = crate::context::op_context_for_saga_action( + &sagactx, + ¶ms.serialized_authn, + ); + + let route_id = sagactx.lookup::("subnet_route_id")?; + let (.., db_subnet) = + sagactx.lookup::<(authz::VpcSubnet, db::model::VpcSubnet)>("subnet")?; + let authz_system_router = sagactx.lookup::("router")?; + osagactx .datastore() - .vpc_delete_subnet(&opctx, &db_subnet, &authz_subnet) - .await?; + .vpc_create_subnet_route( + &opctx, + &authz_system_router, + &db_subnet, + route_id, + ) + .await + .map_err(ActionError::action_failed) + .map(|(auth, ..)| auth) +} + +async fn svc_create_subnet_route_undo( + sagactx: NexusActionContext, +) -> Result<(), anyhow::Error> { + let osagactx = sagactx.user_data(); + let params = sagactx.saga_params::()?; + let opctx = crate::context::op_context_for_saga_action( + &sagactx, + ¶ms.serialized_authn, + ); + + let authz_route = sagactx.lookup::("route")?; + + osagactx.datastore().router_delete_route(&opctx, &authz_route).await?; + Ok(()) } @@ -576,6 +636,12 @@ async fn svc_notify_sleds( .await .map_err(ActionError::action_failed)?; + osagactx + .datastore() + .vpc_increment_rpw_version(&opctx, db_vpc.id()) + .await + .map_err(ActionError::action_failed)?; + Ok(()) } diff --git a/nexus/src/app/sagas/vpc_subnet_create.rs b/nexus/src/app/sagas/vpc_subnet_create.rs new file mode 100644 index 00000000000..360c882aada --- /dev/null +++ b/nexus/src/app/sagas/vpc_subnet_create.rs @@ -0,0 +1,610 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +use super::ActionRegistry; +use super::NexusActionContext; +use super::NexusSaga; +use super::ACTION_GENERATE_ID; +use crate::app::sagas::declare_saga_actions; +use crate::external_api::params; +use nexus_db_queries::db::lookup::LookupPath; +use nexus_db_queries::db::queries::vpc_subnet::InsertVpcSubnetError; +use nexus_db_queries::{authn, authz, db}; +use omicron_common::api::external; +use oxnet::IpNet; +use oxnet::Ipv6Net; +use serde::Deserialize; +use serde::Serialize; +use steno::ActionError; +use steno::Node; +use uuid::Uuid; + +// vpc subnet create saga: input parameters + +#[derive(Debug, Deserialize, Serialize)] +pub(crate) struct Params { + pub serialized_authn: authn::saga::Serialized, + pub subnet_create: params::VpcSubnetCreate, + /// We create at most one IPv6 block in the subnet, but have a retry loop + /// in case of collisions when randomly generating a block. Our random + /// choices are fixed ahead of saga start for idempotency. + /// + /// This field must contain at least one entry, or we'll fail with a 500. + pub potential_ipv6_blocks: Vec, + pub authz_vpc: authz::Vpc, + pub authz_system_router: authz::VpcRouter, + pub custom_router: Option, +} + +// vpc subnet create saga: actions + +declare_saga_actions! { + vpc_subnet_create; + VPC_SUBNET_CREATE_SUBNET -> "subnet" { + + svsc_create_subnet + - svsc_create_subnet_undo + } + VPC_SUBNET_CREATE_SYS_ROUTE -> "route" { + + svsc_create_route + - svsc_create_route_undo + } + VPC_SUBNET_CREATE_LINK_CUSTOM -> "output" { + + svsc_link_custom + - svsc_link_custom_undo + } + VPC_NOTIFY_RPW -> "notified" { + + svsc_notify_rpw + } +} + +// vpc subnet create saga: definition + +#[derive(Debug)] +pub(crate) struct SagaVpcSubnetCreate; +impl NexusSaga for SagaVpcSubnetCreate { + const NAME: &'static str = "vpc-subnet-create"; + type Params = Params; + + fn register_actions(registry: &mut ActionRegistry) { + vpc_subnet_create_register_actions(registry); + } + + fn make_saga_dag( + _params: &Self::Params, + mut builder: steno::DagBuilder, + ) -> Result { + builder.append(Node::action( + "subnet_id", + "GenerateVpcSubnetId", + ACTION_GENERATE_ID.as_ref(), + )); + builder.append(Node::action( + "route_id", + "GenerateRouteId", + ACTION_GENERATE_ID.as_ref(), + )); + + builder.append(vpc_subnet_create_subnet_action()); + builder.append(vpc_subnet_create_sys_route_action()); + builder.append(vpc_subnet_create_link_custom_action()); + builder.append(vpc_notify_rpw_action()); + + Ok(builder.build()?) + } +} + +// vpc subnet create saga: action implementations + +async fn svsc_create_subnet( + sagactx: NexusActionContext, +) -> Result<(authz::VpcSubnet, db::model::VpcSubnet), ActionError> { + let osagactx = sagactx.user_data(); + let params = sagactx.saga_params::()?; + let opctx = crate::context::op_context_for_saga_action( + &sagactx, + ¶ms.serialized_authn, + ); + let log = sagactx.user_data().log(); + + let subnet_id = sagactx.lookup::("subnet_id")?; + let vpc_id = params.authz_vpc.id(); + + let num_retries = params.potential_ipv6_blocks.len(); + let retryable = num_retries > 1; + + let mut result = None; + for ipv6_block in params.potential_ipv6_blocks { + let subnet = db::model::VpcSubnet::new( + subnet_id, + vpc_id, + params.subnet_create.identity.clone(), + params.subnet_create.ipv4_block, + ipv6_block, + ); + + result = Some( + osagactx + .datastore() + .vpc_create_subnet(&opctx, ¶ms.authz_vpc, subnet) + .await, + ); + + if matches!(result, Some(Ok(_))) { + break; + } + + match &result { + Some(Ok(_)) => break, + // Allow NUM_RETRIES retries, after the first attempt. + // + // Note that we only catch IPv6 overlaps. The client + // always specifies the IPv4 range, so we fail the + // request if that overlaps with an existing range. + Some(Err(InsertVpcSubnetError::OverlappingIpRange(IpNet::V6( + _, + )))) if retryable => debug!( + log, + "autogenerated random IPv6 range overlap"; + "subnet_id" => ?subnet_id, + "ipv6_block" => %ipv6_block + ), + _ => {} + } + } + + (match result { + None => Err(external::Error::internal_error( + "Attempted to create VPC subnet without any IPv6 allocation", + )), + Some(Err(InsertVpcSubnetError::OverlappingIpRange(IpNet::V6(_)))) + if retryable => + { + // TODO-monitoring TODO-debugging + // + // We should maintain a counter for this occurrence, and + // export that via `oximeter`, so that we can see these + // failures through the timeseries database. The main + // goal here is for us to notice that this is happening + // before it becomes a major issue for customers. + error!( + log, + "failed to generate unique random IPv6 address \ + range in {} retries", + num_retries; + "vpc_id" => ?vpc_id, + "subnet_id" => ?subnet_id, + ); + Err(external::Error::internal_error( + "Unable to allocate unique IPv6 address range \ + for VPC Subnet", + )) + } + // Overlapping IPv4/explicit v6 range, which is a client error. + Some(Err(e @ InsertVpcSubnetError::OverlappingIpRange(_))) => { + Err(e.into_external()) + } + Some(Err(InsertVpcSubnetError::External(e))) => Err(e), + Some(Ok(v)) => Ok(v), + }) + .map_err(ActionError::action_failed) +} + +async fn svsc_create_subnet_undo( + sagactx: NexusActionContext, +) -> Result<(), anyhow::Error> { + let osagactx = sagactx.user_data(); + let params = sagactx.saga_params::()?; + let opctx = crate::context::op_context_for_saga_action( + &sagactx, + ¶ms.serialized_authn, + ); + + let (authz_subnet, db_subnet) = + sagactx.lookup::<(authz::VpcSubnet, db::model::VpcSubnet)>("subnet")?; + + let res = osagactx + .datastore() + .vpc_delete_subnet_raw(&opctx, &db_subnet, &authz_subnet) + .await; + + match res { + Ok(_) | Err(external::Error::ObjectNotFound { .. }) => { + let _ = osagactx + .datastore() + .vpc_increment_rpw_version(&opctx, params.authz_vpc.id()) + .await; + Ok(()) + } + Err(e) => Err(e.into()), + } +} + +async fn svsc_create_route( + sagactx: NexusActionContext, +) -> Result { + let osagactx = sagactx.user_data(); + let params = sagactx.saga_params::()?; + let opctx = crate::context::op_context_for_saga_action( + &sagactx, + ¶ms.serialized_authn, + ); + + let route_id = sagactx.lookup::("route_id")?; + let (.., db_subnet) = + sagactx.lookup::<(authz::VpcSubnet, db::model::VpcSubnet)>("subnet")?; + + let out = osagactx + .datastore() + .vpc_create_subnet_route( + &opctx, + ¶ms.authz_system_router, + &db_subnet, + route_id, + ) + .await; + + match out { + Ok((auth, ..)) => Ok(auth), + Err(external::Error::ObjectAlreadyExists { .. }) => { + LookupPath::new(&opctx, osagactx.datastore()) + .router_route_id(route_id) + .lookup_for(authz::Action::Read) + .await + .map_err(ActionError::action_failed) + .map(|(.., v)| v) + } + Err(e) => Err(ActionError::action_failed(e)), + } +} + +async fn svsc_create_route_undo( + sagactx: NexusActionContext, +) -> Result<(), anyhow::Error> { + let osagactx = sagactx.user_data(); + let params = sagactx.saga_params::()?; + let opctx = crate::context::op_context_for_saga_action( + &sagactx, + ¶ms.serialized_authn, + ); + + let authz_route = sagactx.lookup::("route")?; + + match osagactx.datastore().router_delete_route(&opctx, &authz_route).await { + Ok(_) | Err(external::Error::ObjectNotFound { .. }) => Ok(()), + Err(e) => Err(e.into()), + } +} + +async fn svsc_link_custom( + sagactx: NexusActionContext, +) -> Result { + let osagactx = sagactx.user_data(); + let params = sagactx.saga_params::()?; + let opctx = crate::context::op_context_for_saga_action( + &sagactx, + ¶ms.serialized_authn, + ); + let (authz_subnet, db_subnet) = + sagactx.lookup::<(authz::VpcSubnet, db::model::VpcSubnet)>("subnet")?; + + if let Some(custom_router) = params.custom_router { + osagactx + .datastore() + .vpc_subnet_set_custom_router(&opctx, &authz_subnet, &custom_router) + .await + .map_err(ActionError::action_failed) + } else { + Ok(db_subnet) + } +} + +async fn svsc_link_custom_undo( + sagactx: NexusActionContext, +) -> Result<(), anyhow::Error> { + let osagactx = sagactx.user_data(); + let params = sagactx.saga_params::()?; + let opctx = crate::context::op_context_for_saga_action( + &sagactx, + ¶ms.serialized_authn, + ); + let (authz_subnet, ..) = + sagactx.lookup::<(authz::VpcSubnet, db::model::VpcSubnet)>("subnet")?; + + if params.custom_router.is_some() { + let _ = osagactx + .datastore() + .vpc_subnet_unset_custom_router(&opctx, &authz_subnet) + .await; + } + + Ok(()) +} + +async fn svsc_notify_rpw( + sagactx: NexusActionContext, +) -> Result<(), ActionError> { + let osagactx = sagactx.user_data(); + let params = sagactx.saga_params::()?; + let opctx = crate::context::op_context_for_saga_action( + &sagactx, + ¶ms.serialized_authn, + ); + + osagactx + .datastore() + .vpc_increment_rpw_version(&opctx, params.authz_vpc.id()) + .await + .map_err(ActionError::action_failed) +} + +#[cfg(test)] +pub(crate) mod test { + use crate::app::saga::create_saga_dag; + use crate::app::sagas::test_helpers; + use crate::{ + app::sagas::vpc_subnet_create::Params, + app::sagas::vpc_subnet_create::SagaVpcSubnetCreate, + external_api::params, + }; + use async_bb8_diesel::AsyncRunQueryDsl; + use diesel::{ExpressionMethods, QueryDsl, SelectableHelper}; + use dropshot::test_util::ClientTestContext; + use nexus_db_model::RouterRouteKind; + use nexus_db_queries::db; + use nexus_db_queries::{ + authn::saga::Serialized, authz, context::OpContext, + db::datastore::DataStore, db::fixed_data::vpc::SERVICES_VPC_ID, + db::lookup::LookupPath, + }; + use nexus_test_utils::resource_helpers::create_default_ip_pool; + use nexus_test_utils::resource_helpers::create_project; + use nexus_test_utils_macros::nexus_test; + use nexus_types::external_api::params::VpcSelector; + use omicron_common::api::external::NameOrId; + use omicron_common::api::external::{ + self, IdentityMetadataCreateParams, Ipv6NetExt, + }; + use uuid::Uuid; + + type ControlPlaneTestContext = + nexus_test_utils::ControlPlaneTestContext; + + const PROJECT_NAME: &str = "springfield-squidport"; + + async fn create_org_and_project(client: &ClientTestContext) -> Uuid { + create_default_ip_pool(&client).await; + let project = create_project(client, PROJECT_NAME).await; + project.identity.id + } + + // Helper for creating VPC subnet create parameters + fn new_test_params( + opctx: &OpContext, + authz_vpc: authz::Vpc, + db_vpc: db::model::Vpc, + authz_system_router: authz::VpcRouter, + ) -> Params { + let ipv6_block = db_vpc + .ipv6_prefix + .random_subnet(oxnet::Ipv6Net::VPC_SUBNET_IPV6_PREFIX_LENGTH) + .map(|block| block.0) + .unwrap(); + + Params { + serialized_authn: Serialized::for_opctx(opctx), + subnet_create: params::VpcSubnetCreate { + identity: IdentityMetadataCreateParams { + name: "my-subnet".parse().unwrap(), + description: "My New Subnet.".to_string(), + }, + ipv4_block: "192.168.0.0/24".parse().unwrap(), + ipv6_block: None, + custom_router: None, + }, + potential_ipv6_blocks: vec![ipv6_block], + authz_vpc, + authz_system_router, + custom_router: None, + } + } + + fn test_opctx(cptestctx: &ControlPlaneTestContext) -> OpContext { + OpContext::for_tests( + cptestctx.logctx.log.new(o!()), + cptestctx.server.server_context().nexus.datastore().clone(), + ) + } + + async fn get_vpc_state( + cptestctx: &ControlPlaneTestContext, + project_id: Uuid, + ) -> (authz::Vpc, db::model::Vpc, authz::VpcRouter) { + let nexus = &cptestctx.server.server_context().nexus; + let opctx = test_opctx(&cptestctx); + let datastore = nexus.datastore(); + let (.., authz_vpc, db_vpc) = nexus + .vpc_lookup( + &opctx, + VpcSelector { + vpc: NameOrId::Name("default".parse().unwrap()), + project: Some(project_id.into()), + }, + ) + .unwrap() + .fetch() + .await + .unwrap(); + let (.., authz_system_router) = LookupPath::new(&opctx, datastore) + .vpc_router_id(db_vpc.system_router_id) + .lookup_for(authz::Action::CreateChild) + .await + .unwrap(); + + (authz_vpc, db_vpc, authz_system_router) + } + + pub(crate) async fn verify_clean_slate( + datastore: &DataStore, + vpc_id: Uuid, + ) { + assert!(one_vpc_route_exists(datastore).await); + assert!(one_subnet_exists(datastore, vpc_id).await); + } + + async fn one_vpc_route_exists(datastore: &DataStore) -> bool { + use nexus_db_queries::db::model::RouterRoute; + use nexus_db_queries::db::schema::router_route::dsl; + use nexus_db_queries::db::schema::vpc_router::dsl as vpc_router_dsl; + + dsl::router_route + .filter(dsl::time_deleted.is_null()) + // ignore built-in services VPC + .filter( + dsl::vpc_router_id.ne_all( + vpc_router_dsl::vpc_router + .select(vpc_router_dsl::id) + .filter(vpc_router_dsl::vpc_id.eq(*SERVICES_VPC_ID)) + .filter(vpc_router_dsl::time_deleted.is_null()), + ), + ) + .filter( + dsl::kind + .eq(RouterRouteKind(external::RouterRouteKind::VpcSubnet)), + ) + .select(RouterRoute::as_select()) + .load_async(&*datastore.pool_connection_for_tests().await.unwrap()) + .await + .unwrap() + .len() + == 1 + } + + async fn one_subnet_exists(datastore: &DataStore, vpc_id: Uuid) -> bool { + use nexus_db_queries::db::model::VpcSubnet; + use nexus_db_queries::db::schema::vpc_subnet::dsl; + + dsl::vpc_subnet + .filter(dsl::time_deleted.is_null()) + .filter(dsl::vpc_id.eq(vpc_id)) + .select(VpcSubnet::as_select()) + .load_async(&*datastore.pool_connection_for_tests().await.unwrap()) + .await + .unwrap() + .len() + == 1 + } + + #[nexus_test(server = crate::Server)] + async fn test_saga_basic_usage_succeeds( + cptestctx: &ControlPlaneTestContext, + ) { + let client = &cptestctx.external_client; + let nexus = &cptestctx.server.server_context().nexus; + let project_id = create_org_and_project(&client).await; + let opctx = test_opctx(&cptestctx); + + let (authz_vpc, db_vpc, authz_system_router) = + get_vpc_state(&cptestctx, project_id).await; + verify_clean_slate(nexus.datastore(), authz_vpc.id()).await; + let params = + new_test_params(&opctx, authz_vpc, db_vpc, authz_system_router); + nexus.sagas.saga_execute::(params).await.unwrap(); + } + + #[nexus_test(server = crate::Server)] + async fn test_action_failure_can_unwind( + cptestctx: &ControlPlaneTestContext, + ) { + let log = &cptestctx.logctx.log; + + let client = &cptestctx.external_client; + let nexus = &cptestctx.server.server_context().nexus; + let project_id = create_org_and_project(&client).await; + let (authz_vpc, ..) = get_vpc_state(&cptestctx, project_id).await; + let vpc_id = authz_vpc.id(); + + let opctx = test_opctx(&cptestctx); + test_helpers::action_failure_can_unwind::( + nexus, + || { + Box::pin(async { + let (authz_vpc, db_vpc, authz_system_router) = + get_vpc_state(&cptestctx, project_id).await; + new_test_params( + &opctx, + authz_vpc, + db_vpc, + authz_system_router, + ) + }) + }, + || { + Box::pin(async { + verify_clean_slate(nexus.datastore(), vpc_id).await; + }) + }, + log, + ) + .await; + } + + #[nexus_test(server = crate::Server)] + async fn test_action_failure_can_unwind_idempotently( + cptestctx: &ControlPlaneTestContext, + ) { + let log = &cptestctx.logctx.log; + + let client = &cptestctx.external_client; + let nexus = &cptestctx.server.server_context().nexus; + let project_id = create_org_and_project(&client).await; + let (authz_vpc, ..) = get_vpc_state(&cptestctx, project_id).await; + let vpc_id = authz_vpc.id(); + + let opctx = test_opctx(&cptestctx); + test_helpers::action_failure_can_unwind_idempotently::< + SagaVpcSubnetCreate, + _, + _, + >( + nexus, + || { + Box::pin(async { + let (authz_vpc, db_vpc, authz_system_router) = + get_vpc_state(&cptestctx, project_id).await; + new_test_params( + &opctx, + authz_vpc, + db_vpc, + authz_system_router, + ) + }) + }, + || { + Box::pin(async { + verify_clean_slate(nexus.datastore(), vpc_id).await; + }) + }, + log, + ) + .await; + } + + #[nexus_test(server = crate::Server)] + async fn test_actions_succeed_idempotently( + cptestctx: &ControlPlaneTestContext, + ) { + let client = &cptestctx.external_client; + let nexus = &cptestctx.server.server_context().nexus; + let project_id = create_org_and_project(&client).await; + let opctx = test_opctx(&cptestctx); + + let (authz_vpc, db_vpc, authz_system_router) = + get_vpc_state(&cptestctx, project_id).await; + verify_clean_slate(nexus.datastore(), authz_vpc.id()).await; + let params = + new_test_params(&opctx, authz_vpc, db_vpc, authz_system_router); + let dag = create_saga_dag::(params).unwrap(); + test_helpers::actions_succeed_idempotently(nexus, dag).await; + } +} diff --git a/nexus/src/app/sagas/vpc_subnet_delete.rs b/nexus/src/app/sagas/vpc_subnet_delete.rs new file mode 100644 index 00000000000..7ed3f9cb989 --- /dev/null +++ b/nexus/src/app/sagas/vpc_subnet_delete.rs @@ -0,0 +1,208 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +use super::ActionRegistry; +use super::NexusActionContext; +use super::NexusSaga; +use crate::app::sagas::declare_saga_actions; +use nexus_db_queries::{authn, authz, db}; +use omicron_common::api::external; +use serde::Deserialize; +use serde::Serialize; +use steno::ActionError; + +// vpc subnet delete saga: input parameters + +#[derive(Debug, Deserialize, Serialize)] +pub(crate) struct Params { + pub serialized_authn: authn::saga::Serialized, + pub authz_vpc: authz::Vpc, + pub authz_subnet: authz::VpcSubnet, + pub db_subnet: db::model::VpcSubnet, +} + +// vpc subnet delete saga: actions + +declare_saga_actions! { + vpc_subnet_delete; + VPC_SUBNET_DELETE_SUBNET -> "no_result_0" { + + svsd_delete_subnet + } + VPC_SUBNET_DELETE_SYS_ROUTE -> "no_result_1" { + + svsd_delete_route + } + VPC_NOTIFY_RPW -> "no_result_2" { + + svsd_notify_rpw + } +} + +// vpc subnet delete saga: definition + +#[derive(Debug)] +pub(crate) struct SagaVpcSubnetDelete; +impl NexusSaga for SagaVpcSubnetDelete { + const NAME: &'static str = "vpc-subnet-delete"; + type Params = Params; + + fn register_actions(registry: &mut ActionRegistry) { + vpc_subnet_delete_register_actions(registry); + } + + fn make_saga_dag( + _params: &Self::Params, + mut builder: steno::DagBuilder, + ) -> Result { + builder.append(vpc_subnet_delete_subnet_action()); + builder.append(vpc_subnet_delete_sys_route_action()); + builder.append(vpc_notify_rpw_action()); + + Ok(builder.build()?) + } +} + +// vpc subnet delete saga: action implementations + +async fn svsd_delete_subnet( + sagactx: NexusActionContext, +) -> Result<(), ActionError> { + let osagactx = sagactx.user_data(); + let params = sagactx.saga_params::()?; + let opctx = crate::context::op_context_for_saga_action( + &sagactx, + ¶ms.serialized_authn, + ); + + let res = osagactx + .datastore() + .vpc_delete_subnet_raw(&opctx, ¶ms.db_subnet, ¶ms.authz_subnet) + .await; + + match res { + Ok(_) | Err(external::Error::ObjectNotFound { .. }) => Ok(()), + Err(e) => Err(ActionError::action_failed(e)), + } +} + +async fn svsd_delete_route( + sagactx: NexusActionContext, +) -> Result<(), ActionError> { + let osagactx = sagactx.user_data(); + let params = sagactx.saga_params::()?; + let opctx = crate::context::op_context_for_saga_action( + &sagactx, + ¶ms.serialized_authn, + ); + + osagactx + .datastore() + .vpc_delete_subnet_route(&opctx, ¶ms.authz_subnet) + .await + .map_err(ActionError::action_failed) +} + +async fn svsd_notify_rpw( + sagactx: NexusActionContext, +) -> Result<(), ActionError> { + let osagactx = sagactx.user_data(); + let params = sagactx.saga_params::()?; + let opctx = crate::context::op_context_for_saga_action( + &sagactx, + ¶ms.serialized_authn, + ); + + osagactx + .datastore() + .vpc_increment_rpw_version(&opctx, params.authz_vpc.id()) + .await + .map_err(ActionError::action_failed) +} + +#[cfg(test)] +pub(crate) mod test { + use crate::app::saga::create_saga_dag; + use crate::app::sagas::test_helpers; + use crate::{ + app::sagas::vpc_subnet_delete::Params, + app::sagas::vpc_subnet_delete::SagaVpcSubnetDelete, + external_api::params, + }; + use dropshot::test_util::ClientTestContext; + use nexus_db_queries::{authn::saga::Serialized, context::OpContext}; + use nexus_test_utils::resource_helpers::create_default_ip_pool; + use nexus_test_utils::resource_helpers::create_project; + use nexus_test_utils_macros::nexus_test; + use omicron_common::api::external::NameOrId; + use uuid::Uuid; + + type ControlPlaneTestContext = + nexus_test_utils::ControlPlaneTestContext; + + const PROJECT_NAME: &str = "springfield-squidport"; + + async fn create_org_and_project(client: &ClientTestContext) -> Uuid { + create_default_ip_pool(&client).await; + let project = create_project(client, PROJECT_NAME).await; + project.identity.id + } + + fn test_opctx(cptestctx: &ControlPlaneTestContext) -> OpContext { + OpContext::for_tests( + cptestctx.logctx.log.new(o!()), + cptestctx.server.server_context().nexus.datastore().clone(), + ) + } + + async fn new_test_params( + cptestctx: &ControlPlaneTestContext, + project_id: Uuid, + ) -> Params { + let nexus = &cptestctx.server.server_context().nexus; + let opctx = test_opctx(&cptestctx); + let (.., authz_vpc, authz_subnet, db_subnet) = nexus + .vpc_subnet_lookup( + &opctx, + params::SubnetSelector { + project: Some(project_id.into()), + vpc: Some(NameOrId::Name("default".parse().unwrap())), + subnet: NameOrId::Name("default".parse().unwrap()), + }, + ) + .unwrap() + .fetch() + .await + .unwrap(); + + Params { + serialized_authn: Serialized::for_opctx(&opctx), + authz_vpc, + authz_subnet, + db_subnet, + } + } + + #[nexus_test(server = crate::Server)] + async fn test_saga_basic_usage_succeeds( + cptestctx: &ControlPlaneTestContext, + ) { + let client = &cptestctx.external_client; + let nexus = &cptestctx.server.server_context().nexus; + let project_id = create_org_and_project(&client).await; + + let params = new_test_params(cptestctx, project_id).await; + nexus.sagas.saga_execute::(params).await.unwrap(); + } + + #[nexus_test(server = crate::Server)] + async fn test_actions_succeed_idempotently( + cptestctx: &ControlPlaneTestContext, + ) { + let client = &cptestctx.external_client; + let nexus = &cptestctx.server.server_context().nexus; + let project_id = create_org_and_project(&client).await; + + let params = new_test_params(cptestctx, project_id).await; + let dag = create_saga_dag::(params).unwrap(); + test_helpers::actions_succeed_idempotently(nexus, dag).await; + } +} diff --git a/nexus/src/app/sagas/vpc_subnet_update.rs b/nexus/src/app/sagas/vpc_subnet_update.rs new file mode 100644 index 00000000000..31136799fd6 --- /dev/null +++ b/nexus/src/app/sagas/vpc_subnet_update.rs @@ -0,0 +1,218 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +use super::ActionRegistry; +use super::NexusActionContext; +use super::NexusSaga; +use crate::app::sagas::declare_saga_actions; +use nexus_db_model::VpcSubnet; +use nexus_db_queries::{authn, authz, db}; +use serde::Deserialize; +use serde::Serialize; +use steno::ActionError; + +// vpc subnet update saga: input parameters + +#[derive(Debug, Deserialize, Serialize)] +pub(crate) struct Params { + pub serialized_authn: authn::saga::Serialized, + pub authz_vpc: authz::Vpc, + pub authz_subnet: authz::VpcSubnet, + pub custom_router: Option, + pub update: db::model::VpcSubnetUpdate, +} + +// vpc subnet update saga: actions + +declare_saga_actions! { + vpc_subnet_update; + VPC_SUBNET_UPDATE -> "output" { + + svsu_do_update + } + VPC_NOTIFY_RPW -> "no_result" { + + svsu_notify_rpw + } +} + +// vpc subnet update saga: definition + +#[derive(Debug)] +pub(crate) struct SagaVpcSubnetUpdate; +impl NexusSaga for SagaVpcSubnetUpdate { + const NAME: &'static str = "vpc-subnet-update"; + type Params = Params; + + fn register_actions(registry: &mut ActionRegistry) { + vpc_subnet_update_register_actions(registry); + } + + fn make_saga_dag( + _params: &Self::Params, + mut builder: steno::DagBuilder, + ) -> Result { + builder.append(vpc_subnet_update_action()); + builder.append(vpc_notify_rpw_action()); + + Ok(builder.build()?) + } +} + +// vpc subnet update saga: action implementations + +async fn svsu_do_update( + sagactx: NexusActionContext, +) -> Result { + let osagactx = sagactx.user_data(); + let Params { + serialized_authn, authz_subnet, custom_router, update, .. + } = sagactx.saga_params::()?; + let opctx = + crate::context::op_context_for_saga_action(&sagactx, &serialized_authn); + + osagactx + .datastore() + .vpc_update_subnet( + &opctx, + &authz_subnet, + custom_router.as_ref(), + update, + ) + .await + .map_err(ActionError::action_failed) +} + +async fn svsu_notify_rpw( + sagactx: NexusActionContext, +) -> Result<(), ActionError> { + let osagactx = sagactx.user_data(); + let params = sagactx.saga_params::()?; + let opctx = crate::context::op_context_for_saga_action( + &sagactx, + ¶ms.serialized_authn, + ); + + osagactx + .datastore() + .vpc_increment_rpw_version(&opctx, params.authz_vpc.id()) + .await + .map_err(ActionError::action_failed) +} + +#[cfg(test)] +pub(crate) mod test { + use crate::app::saga::create_saga_dag; + use crate::app::sagas::test_helpers; + use crate::{ + app::sagas::vpc_subnet_update::Params, + app::sagas::vpc_subnet_update::SagaVpcSubnetUpdate, + external_api::params, + }; + use chrono::Utc; + use dropshot::test_util::ClientTestContext; + use nexus_db_queries::db; + use nexus_db_queries::{authn::saga::Serialized, context::OpContext}; + use nexus_test_utils::resource_helpers::create_default_ip_pool; + use nexus_test_utils::resource_helpers::create_project; + use nexus_test_utils::resource_helpers::create_router; + use nexus_test_utils_macros::nexus_test; + use omicron_common::api::external::NameOrId; + use uuid::Uuid; + + type ControlPlaneTestContext = + nexus_test_utils::ControlPlaneTestContext; + + const PROJECT_NAME: &str = "springfield-squidport"; + const ROUTER_NAME: &str = "test-router"; + + async fn create_org_and_project( + client: &ClientTestContext, + ) -> (Uuid, Uuid) { + create_default_ip_pool(&client).await; + let project = create_project(client, PROJECT_NAME).await; + let router = + create_router(client, PROJECT_NAME, "default", ROUTER_NAME).await; + (project.identity.id, router.identity.id) + } + + fn test_opctx(cptestctx: &ControlPlaneTestContext) -> OpContext { + OpContext::for_tests( + cptestctx.logctx.log.new(o!()), + cptestctx.server.server_context().nexus.datastore().clone(), + ) + } + + async fn new_test_params( + cptestctx: &ControlPlaneTestContext, + project_id: Uuid, + router_id: Uuid, + ) -> Params { + let nexus = &cptestctx.server.server_context().nexus; + let opctx = test_opctx(&cptestctx); + let (.., authz_vpc, authz_subnet, _) = nexus + .vpc_subnet_lookup( + &opctx, + params::SubnetSelector { + project: Some(project_id.into()), + vpc: Some(NameOrId::Name("default".parse().unwrap())), + subnet: NameOrId::Name("default".parse().unwrap()), + }, + ) + .unwrap() + .fetch() + .await + .unwrap(); + + let (.., custom_router, _) = nexus + .vpc_router_lookup( + &opctx, + params::RouterSelector { + project: None, + vpc: None, + router: NameOrId::Id(router_id), + }, + ) + .unwrap() + .fetch() + .await + .unwrap(); + + Params { + serialized_authn: Serialized::for_opctx(&opctx), + authz_vpc, + authz_subnet, + custom_router: Some(custom_router), + update: db::model::VpcSubnetUpdate { + name: Some(db::model::Name("defaulter".parse().unwrap())), + description: None, + time_modified: Utc::now(), + custom_router_id: None, + }, + } + } + + #[nexus_test(server = crate::Server)] + async fn test_saga_basic_usage_succeeds( + cptestctx: &ControlPlaneTestContext, + ) { + let client = &cptestctx.external_client; + let nexus = &cptestctx.server.server_context().nexus; + let (project_id, router_id) = create_org_and_project(&client).await; + + let params = new_test_params(cptestctx, project_id, router_id).await; + nexus.sagas.saga_execute::(params).await.unwrap(); + } + + #[nexus_test(server = crate::Server)] + async fn test_actions_succeed_idempotently( + cptestctx: &ControlPlaneTestContext, + ) { + let client = &cptestctx.external_client; + let nexus = &cptestctx.server.server_context().nexus; + let (project_id, router_id) = create_org_and_project(&client).await; + + let params = new_test_params(cptestctx, project_id, router_id).await; + let dag = create_saga_dag::(params).unwrap(); + test_helpers::actions_succeed_idempotently(nexus, dag).await; + } +} diff --git a/nexus/src/app/vpc_router.rs b/nexus/src/app/vpc_router.rs index f7f27765f26..53961341cad 100644 --- a/nexus/src/app/vpc_router.rs +++ b/nexus/src/app/vpc_router.rs @@ -67,6 +67,45 @@ impl super::Nexus { } } + /// Lookup a (custom) router for attaching to a VPC subnet, when + /// we have already determined which VPC the subnet exists within. + pub(crate) async fn vpc_router_lookup_for_attach( + &self, + opctx: &OpContext, + router: &NameOrId, + authz_vpc: &authz::Vpc, + ) -> LookupResult { + let (.., vpc, rtr) = (match router { + key @ NameOrId::Name(_) => self.vpc_router_lookup( + opctx, + params::RouterSelector { + project: None, + vpc: Some(NameOrId::Id(authz_vpc.id())), + router: key.clone(), + }, + )?, + key @ NameOrId::Id(_) => self.vpc_router_lookup( + opctx, + params::RouterSelector { + project: None, + vpc: None, + router: key.clone(), + }, + )?, + }) + .lookup_for(authz::Action::Read) + .await?; + + if vpc.id() != authz_vpc.id() { + return Err(Error::invalid_request( + "a router can only be attached to a subnet when both \ + belong to the same VPC", + )); + } + + Ok(rtr) + } + pub(crate) async fn vpc_create_router( &self, opctx: &OpContext, diff --git a/nexus/src/app/vpc_subnet.rs b/nexus/src/app/vpc_subnet.rs index 39b9844799d..224ac25aa20 100644 --- a/nexus/src/app/vpc_subnet.rs +++ b/nexus/src/app/vpc_subnet.rs @@ -4,28 +4,27 @@ //! VPC Subnets and their network interfaces +use super::sagas; use crate::external_api::params; +use nexus_auth::authn; use nexus_config::MIN_VPC_IPV4_SUBNET_PREFIX; use nexus_db_queries::authz; use nexus_db_queries::context::OpContext; use nexus_db_queries::db; -use nexus_db_queries::db::identity::Resource; use nexus_db_queries::db::lookup; use nexus_db_queries::db::lookup::LookupPath; use nexus_db_queries::db::model::VpcSubnet; -use nexus_db_queries::db::queries::vpc_subnet::InsertVpcSubnetError; use omicron_common::api::external; use omicron_common::api::external::http_pagination::PaginatedBy; use omicron_common::api::external::CreateResult; use omicron_common::api::external::DeleteResult; use omicron_common::api::external::Error; +use omicron_common::api::external::InternalContext; use omicron_common::api::external::Ipv6NetExt; use omicron_common::api::external::ListResultVec; use omicron_common::api::external::LookupResult; use omicron_common::api::external::NameOrId; use omicron_common::api::external::UpdateResult; -use oxnet::IpNet; -use uuid::Uuid; impl super::Nexus { pub fn vpc_subnet_lookup<'a>( @@ -73,6 +72,17 @@ impl super::Nexus { params: ¶ms::VpcSubnetCreate, ) -> CreateResult { let (.., authz_vpc, db_vpc) = vpc_lookup.fetch().await?; + let (.., authz_system_router) = + LookupPath::new(opctx, self.datastore()) + .vpc_router_id(db_vpc.system_router_id) + .lookup_for(authz::Action::CreateChild) + .await?; + let custom_router = match ¶ms.custom_router { + Some(k) => Some( + self.vpc_router_lookup_for_attach(opctx, k, &authz_vpc).await?, + ), + None => None, + }; // Validate IPv4 range if !params.ipv4_block.prefix().is_private() { @@ -85,17 +95,13 @@ impl super::Nexus { > self.tunables.max_vpc_ipv4_subnet_prefix { return Err(external::Error::invalid_request(&format!( - concat!( - "VPC Subnet IPv4 address ranges must have prefix ", - "length between {} and {}, inclusive" - ), + "VPC Subnet IPv4 address ranges must have prefix \ + length between {} and {}, inclusive", MIN_VPC_IPV4_SUBNET_PREFIX, self.tunables.max_vpc_ipv4_subnet_prefix, ))); } - // Allocate an ID and insert the record. - // // If the client provided an IPv6 range, we try to insert that or fail // with a conflict error. // @@ -108,13 +114,21 @@ impl super::Nexus { // TODO-robustness: We'd really prefer to allocate deterministically. // See for // details. - let subnet_id = Uuid::new_v4(); - let mut out = match params.ipv6_block { - None => { - const NUM_RETRIES: usize = 2; - let mut retry = 0; - let result = loop { - let ipv6_block = db_vpc + let potential_ipv6_blocks = if let Some(ipv6_block) = params.ipv6_block + { + if !ipv6_block.is_vpc_subnet(&db_vpc.ipv6_prefix) { + return Err(external::Error::invalid_request(&format!( + "VPC Subnet IPv6 address range '{}' is not valid for \ + VPC with IPv6 prefix '{}'", + ipv6_block, db_vpc.ipv6_prefix.0, + ))); + } + vec![ipv6_block] + } else { + const NUM_RETRIES: usize = 2; + (0..=NUM_RETRIES) + .map(|_| { + db_vpc .ipv6_prefix .random_subnet( oxnet::Ipv6Net::VPC_SUBNET_IPV6_PREFIX_LENGTH, @@ -124,113 +138,31 @@ impl super::Nexus { external::Error::internal_error( "Failed to create random IPv6 subnet", ) - })?; - let subnet = db::model::VpcSubnet::new( - subnet_id, - authz_vpc.id(), - params.identity.clone(), - params.ipv4_block, - ipv6_block, - ); - let result = self - .db_datastore - .vpc_create_subnet(opctx, &authz_vpc, subnet) - .await; - match result { - // Allow NUM_RETRIES retries, after the first attempt. - // - // Note that we only catch IPv6 overlaps. The client - // always specifies the IPv4 range, so we fail the - // request if that overlaps with an existing range. - Err(InsertVpcSubnetError::OverlappingIpRange( - IpNet::V6(_), - )) if retry <= NUM_RETRIES => { - debug!( - self.log, - "autogenerated random IPv6 range overlap"; - "subnet_id" => ?subnet_id, - "ipv6_block" => %ipv6_block - ); - retry += 1; - continue; - } - other => break other, - } - }; - match result { - Err(InsertVpcSubnetError::OverlappingIpRange( - IpNet::V6(_), - )) => { - // TODO-monitoring TODO-debugging - // - // We should maintain a counter for this occurrence, and - // export that via `oximeter`, so that we can see these - // failures through the timeseries database. The main - // goal here is for us to notice that this is happening - // before it becomes a major issue for customers. - let vpc_id = authz_vpc.id(); - error!( - self.log, - "failed to generate unique random IPv6 address \ - range in {} retries", - NUM_RETRIES; - "vpc_id" => ?vpc_id, - "subnet_id" => ?subnet_id, - ); - Err(external::Error::internal_error( - "Unable to allocate unique IPv6 address range \ - for VPC Subnet", - )) - } - Err(InsertVpcSubnetError::OverlappingIpRange(_)) => { - // Overlapping IPv4 ranges, which is always a client error. - Err(result.unwrap_err().into_external()) - } - Err(InsertVpcSubnetError::External(e)) => Err(e), - Ok((.., subnet)) => Ok(subnet), - } - } - Some(ipv6_block) => { - if !ipv6_block.is_vpc_subnet(&db_vpc.ipv6_prefix) { - return Err(external::Error::invalid_request(&format!( - concat!( - "VPC Subnet IPv6 address range '{}' is not valid for ", - "VPC with IPv6 prefix '{}'", - ), - ipv6_block, db_vpc.ipv6_prefix.0, - ))); - } - let subnet = db::model::VpcSubnet::new( - subnet_id, - db_vpc.id(), - params.identity.clone(), - params.ipv4_block, - ipv6_block, - ); - self.db_datastore - .vpc_create_subnet(opctx, &authz_vpc, subnet) - .await - .map(|(.., subnet)| subnet) - .map_err(InsertVpcSubnetError::into_external) - } - }?; + }) + }) + .collect::, _>>()? + }; - // XX: rollback the creation if this fails? - if let Some(custom_router) = ¶ms.custom_router { - let (.., authz_subnet) = LookupPath::new(opctx, &self.db_datastore) - .vpc_subnet_id(out.id()) - .lookup_for(authz::Action::Modify) - .await?; + let saga_params = sagas::vpc_subnet_create::Params { + serialized_authn: authn::saga::Serialized::for_opctx(opctx), + subnet_create: params.clone(), + potential_ipv6_blocks, + custom_router, + authz_vpc, + authz_system_router, + }; - out = self - .vpc_subnet_update_custom_router( - opctx, - &authz_vpc, - &authz_subnet, - Some(custom_router), - ) - .await?; - } + let saga_outputs = self + .sagas + .saga_execute::( + saga_params, + ) + .await?; + + let out = saga_outputs + .lookup_node_output::("output") + .map_err(|e| Error::internal_error(&format!("{:#}", &e))) + .internal_context("looking up output from vpc create saga")?; self.vpc_needed_notify_sleds(); @@ -257,102 +189,62 @@ impl super::Nexus { let (.., authz_vpc, authz_subnet) = vpc_subnet_lookup.lookup_for(authz::Action::Modify).await?; - // Updating the custom router is a separate action. - self.vpc_subnet_update_custom_router( - opctx, - &authz_vpc, - &authz_subnet, - params.custom_router.as_ref(), - ) - .await?; + let custom_router = match ¶ms.custom_router { + Some(k) => Some( + self.vpc_router_lookup_for_attach(opctx, k, &authz_vpc).await?, + ), + None => None, + }; - let out = self - .db_datastore - .vpc_update_subnet(&opctx, &authz_subnet, params.clone().into()) + let saga_params = sagas::vpc_subnet_update::Params { + serialized_authn: authn::saga::Serialized::for_opctx(opctx), + authz_vpc, + authz_subnet, + custom_router, + update: params.clone().into(), + }; + + let saga_outputs = self + .sagas + .saga_execute::( + saga_params, + ) .await?; + let out = saga_outputs + .lookup_node_output::("output") + .map_err(|e| Error::internal_error(&format!("{:#}", &e))) + .internal_context("looking up output from vpc update saga")?; + self.vpc_needed_notify_sleds(); Ok(out) } - async fn vpc_subnet_update_custom_router( - &self, - opctx: &OpContext, - authz_vpc: &authz::Vpc, - authz_subnet: &authz::VpcSubnet, - custom_router: Option<&NameOrId>, - ) -> UpdateResult { - // Resolve the VPC router, if specified. - let router_lookup = match custom_router { - Some(key @ NameOrId::Name(_)) => self - .vpc_router_lookup( - opctx, - params::RouterSelector { - project: None, - vpc: Some(NameOrId::Id(authz_vpc.id())), - router: key.clone(), - }, - ) - .map(Some), - Some(key @ NameOrId::Id(_)) => self - .vpc_router_lookup( - opctx, - params::RouterSelector { - project: None, - vpc: None, - router: key.clone(), - }, - ) - .map(Some), - None => Ok(None), - }?; - - let router_lookup = if let Some(l) = router_lookup { - let (.., rtr_authz_vpc, authz_router) = - l.lookup_for(authz::Action::Read).await?; - - if authz_vpc.id() != rtr_authz_vpc.id() { - return Err(Error::invalid_request( - "router and subnet must belong to the same VPC", - )); - } - - Some(authz_router) - } else { - None - }; - - if let Some(authz_router) = router_lookup { - self.db_datastore - .vpc_subnet_set_custom_router( - opctx, - &authz_subnet, - &authz_router, - ) - .await - } else { - self.db_datastore - .vpc_subnet_unset_custom_router(opctx, &authz_subnet) - .await - } - } - pub(crate) async fn vpc_delete_subnet( &self, opctx: &OpContext, vpc_subnet_lookup: &lookup::VpcSubnet<'_>, ) -> DeleteResult { - let (.., authz_subnet, db_subnet) = + let (.., authz_vpc, authz_subnet, db_subnet) = vpc_subnet_lookup.fetch_for(authz::Action::Delete).await?; - let out = self - .db_datastore - .vpc_delete_subnet(opctx, &db_subnet, &authz_subnet) + + let saga_params = sagas::vpc_subnet_delete::Params { + serialized_authn: authn::saga::Serialized::for_opctx(opctx), + authz_vpc, + authz_subnet, + db_subnet, + }; + + self.sagas + .saga_execute::( + saga_params, + ) .await?; self.vpc_needed_notify_sleds(); - Ok(out) + Ok(()) } pub(crate) async fn subnet_list_instance_network_interfaces( diff --git a/nexus/tests/integration_tests/vpc_routers.rs b/nexus/tests/integration_tests/vpc_routers.rs index 71ef0e13e06..c364bc26bf1 100644 --- a/nexus/tests/integration_tests/vpc_routers.rs +++ b/nexus/tests/integration_tests/vpc_routers.rs @@ -413,7 +413,10 @@ async fn test_vpc_routers_attach_to_subnet( StatusCode::BAD_REQUEST, ) .await; - assert_eq!(err.message, "router and subnet must belong to the same VPC"); + assert_eq!( + err.message, + "a router can only be attached to a subnet when both belong to the same VPC" + ); // Detach (and double detach) should succeed without issue. let subnet3 = set_custom_router(client, subnet3_name, VPC_NAME, None).await; diff --git a/schema/crdb/dbinit.sql b/schema/crdb/dbinit.sql index 1ee7b985aff..08fe84241a9 100644 --- a/schema/crdb/dbinit.sql +++ b/schema/crdb/dbinit.sql @@ -1839,7 +1839,22 @@ CREATE TABLE IF NOT EXISTS omicron.public.router_route ( vpc_router_id UUID NOT NULL, kind omicron.public.router_route_kind NOT NULL, target STRING(128) NOT NULL, - destination STRING(128) NOT NULL + destination STRING(128) NOT NULL, + + /* FK to the `vpc_subnet` table. See constraints below */ + vpc_subnet_id UUID, + + /* + * Only nullable if this is rule is not, in-fact, virtual and tightly coupled to a + * linked item. Today, these are 'vpc_subnet' rules and their parent subnets. + * 'vpc_peering' routes may also fall into this category in future. + * + * User-created/modifiable routes must have this field as NULL. + */ + CONSTRAINT non_null_vpc_subnet CHECK ( + (kind = 'vpc_subnet' AND vpc_subnet_id IS NOT NULL) OR + (kind != 'vpc_subnet' AND vpc_subnet_id IS NULL) + ) ); CREATE UNIQUE INDEX IF NOT EXISTS lookup_route_by_router ON omicron.public.router_route ( @@ -1848,6 +1863,12 @@ CREATE UNIQUE INDEX IF NOT EXISTS lookup_route_by_router ON omicron.public.route ) WHERE time_deleted IS NULL; +-- Enforce uniqueness of 'vpc_subnet' routes on parent (and help add/delete). +CREATE UNIQUE INDEX IF NOT EXISTS lookup_subnet_route_by_id ON omicron.public.router_route ( + vpc_subnet_id +) WHERE + time_deleted IS NULL AND kind = 'vpc_subnet'; + CREATE TABLE IF NOT EXISTS omicron.public.internet_gateway ( id UUID PRIMARY KEY, name STRING(63) NOT NULL, @@ -4810,7 +4831,7 @@ INSERT INTO omicron.public.db_metadata ( version, target_version ) VALUES - (TRUE, NOW(), NOW(), '122.0.0', NULL) + (TRUE, NOW(), NOW(), '123.0.0', NULL) ON CONFLICT DO NOTHING; COMMIT; diff --git a/schema/crdb/vpc-subnet-contention/up01.sql b/schema/crdb/vpc-subnet-contention/up01.sql new file mode 100644 index 00000000000..1553ca730d1 --- /dev/null +++ b/schema/crdb/vpc-subnet-contention/up01.sql @@ -0,0 +1,3 @@ +-- Add an FK to `vpc_subnet` for `vpc_subnet` routes. +ALTER TABLE omicron.public.router_route +ADD COLUMN IF NOT EXISTS vpc_subnet_id UUID; diff --git a/schema/crdb/vpc-subnet-contention/up02.sql b/schema/crdb/vpc-subnet-contention/up02.sql new file mode 100644 index 00000000000..f05a01443a4 --- /dev/null +++ b/schema/crdb/vpc-subnet-contention/up02.sql @@ -0,0 +1,82 @@ +set local disallow_full_table_scans = off; + +-- Remove all existing VPC Subnet routes. +-- These are fully managed by nexus, so no user state is at +-- risk of being lost. +DELETE FROM omicron.public.router_route +WHERE router_route.kind = 'vpc_subnet'; + +-- Insert subnet routes for every defined VPC subnet. +-- Do this first for the majority of routes... +INSERT INTO omicron.public.router_route + ( + id, name, + description, + time_created, time_modified, + vpc_router_id, kind, + target, destination, + vpc_subnet_id + ) +SELECT + gen_random_uuid(), vpc_subnet.name, + 'System-managed VPC Subnet route.', + now(), now(), + omicron.public.vpc_router.id, 'vpc_subnet', + 'subnet:' || vpc_subnet.name, 'subnet:' || vpc_subnet.name, + vpc_subnet.id +FROM + (omicron.public.vpc_subnet JOIN omicron.public.vpc + ON vpc_subnet.vpc_id = vpc.id) JOIN omicron.public.vpc_router + ON (vpc_router.vpc_id = vpc.id AND vpc_router.id = vpc.system_router_id) +WHERE + vpc_router.kind = 'system' AND + vpc_subnet.name != 'default-v4' AND vpc_subnet.name != 'default-v6' +ON CONFLICT DO NOTHING; + +-- ...and then revisit any data which has unfortunately +-- titled their subnets 'default-v4' or 'default-v6'. +INSERT INTO omicron.public.router_route + ( + id, + name, + description, + time_created, time_modified, + vpc_router_id, kind, + target, destination, + vpc_subnet_id + ) +SELECT + gen_random_uuid(), + 'conflict-' || vpc_subnet.name || '-' || gen_random_uuid(), + 'System-managed VPC Subnet route.', + now(), now(), + omicron.public.vpc_router.id, 'vpc_subnet', + 'subnet:' || vpc_subnet.name, 'subnet:' || vpc_subnet.name, + vpc_subnet.id +FROM + (omicron.public.vpc_subnet JOIN omicron.public.vpc + ON vpc_subnet.vpc_id = vpc.id) JOIN omicron.public.vpc_router + ON (vpc_router.vpc_id = vpc.id AND vpc_router.id = vpc.system_router_id) +WHERE + vpc_router.kind = 'system' AND + (vpc_subnet.name = 'default-v4' OR vpc_subnet.name = 'default-v6') +ON CONFLICT DO NOTHING; + +-- Replace IDs of fixed_data VPC Subnet routes for the services VPC. +WITH known_ids (new_id, new_name) AS ( + VALUES + ( + '001de000-c470-4000-8000-000000000004', 'external-dns' + ), + ( + '001de000-c470-4000-8000-000000000005', 'nexus' + ), + ( + '001de000-c470-4000-8000-000000000006', 'boundary-ntp' + ) +) +UPDATE omicron.public.router_route +SET + id = CAST(new_id AS UUID) +FROM known_ids +WHERE vpc_router_id = '001de000-074c-4000-8000-000000000001' AND new_name = router_route.name; diff --git a/schema/crdb/vpc-subnet-contention/up03.sql b/schema/crdb/vpc-subnet-contention/up03.sql new file mode 100644 index 00000000000..21b6079aae7 --- /dev/null +++ b/schema/crdb/vpc-subnet-contention/up03.sql @@ -0,0 +1,6 @@ +-- Ensure 'vpc_subnet's are the only rules with FKs for now. +ALTER TABLE omicron.public.router_route +ADD CONSTRAINT IF NOT EXISTS non_null_vpc_subnet CHECK ( + (kind = 'vpc_subnet' AND vpc_subnet_id IS NOT NULL) OR + (kind != 'vpc_subnet' AND vpc_subnet_id IS NULL) +); diff --git a/schema/crdb/vpc-subnet-contention/up04.sql b/schema/crdb/vpc-subnet-contention/up04.sql new file mode 100644 index 00000000000..f6f205b53d1 --- /dev/null +++ b/schema/crdb/vpc-subnet-contention/up04.sql @@ -0,0 +1,5 @@ +-- Enforce uniqueness of 'vpc_subnet' routes on parent (and help add/delete). +CREATE UNIQUE INDEX IF NOT EXISTS lookup_subnet_route_by_id ON omicron.public.router_route ( + vpc_subnet_id +) WHERE + time_deleted IS NULL AND kind = 'vpc_subnet'; From cba92e1d5880a35ab0b55c71a089b02791d4ab81 Mon Sep 17 00:00:00 2001 From: Laura Abbott Date: Thu, 6 Feb 2025 08:44:56 -0500 Subject: [PATCH 12/43] Add bootleby bart manifest (#7481) This needs to be a separate manifest for the moment due to tooling --- tools/permslip_staging | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/permslip_staging b/tools/permslip_staging index d33a83c8278..520b8ebd371 100644 --- a/tools/permslip_staging +++ b/tools/permslip_staging @@ -3,3 +3,4 @@ d3675e0f2d93b902b80f60871ce8ce461f8f4d001c2a3600eb75a2effe4e75cc manifest-oxide- 22e0b2a801c9e0aef955f97eecbe21a5f7953779cc2e6494b3c76c27666397a3 manifest-psc-v1.0.33.toml c347ae1ba8e86d9e09605db378bc1a8a6477ebfa3f621065cebf979866111d0c manifest-sidecar-v1.0.35.toml 14c20540fe785dea65ef03446d5c4665a5f3d9106eb176691b35646faa54f61f manifest-bootleby-v1.3.3.toml +aa02101b3e6badd440e82d1bbcae8f79a92a3dd0f3a46b7a942f2269da36954a manifest-bootleby-bart-v1.3.3.toml From bbcadc5e983017b94feb0a19371cbcc44e305aa7 Mon Sep 17 00:00:00 2001 From: David Crespo Date: Thu, 6 Feb 2025 09:54:45 -0600 Subject: [PATCH 13/43] Bump web console (group misconfig error) (#7491) https://github.com/oxidecomputer/console/compare/288f1c1b...517353ee * [517353ee](https://github.com/oxidecomputer/console/commit/517353ee) bump vite and vitest (vitest CVE) * [a6319fc8](https://github.com/oxidecomputer/console/commit/a6319fc8) oxidecomputer/console#2671 * [5bd61e67](https://github.com/oxidecomputer/console/commit/5bd61e67) oxidecomputer/console#2674 * [4646ad47](https://github.com/oxidecomputer/console/commit/4646ad47) minor: console.log -> console.info in api-diff * [7723212c](https://github.com/oxidecomputer/console/commit/7723212c) log before and after file paths in api-diff * [7cde843f](https://github.com/oxidecomputer/console/commit/7cde843f) minor: deleted temp dir problem in bump-omicron.ts --- tools/console_version | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/console_version b/tools/console_version index 8869949321a..f8f88205af5 100644 --- a/tools/console_version +++ b/tools/console_version @@ -1,2 +1,2 @@ -COMMIT="288f1c1be15e51eff77cca0d5d6f117401155603" -SHA2="07b51ac8103db11c9b167b8f245fb0991973ce1f8d6eaafa7eeb7b1e1ffe9b25" +COMMIT="517353ee1353bbe42f7b4c8a1d002bcfb26d11a0" +SHA2="0813b84fe4357df46fa67a3d97f290776ac6c7336a36fe225f9b6ec18583f1cc" From efe232813131e84d700e8cd3b4d9a099c4185b2d Mon Sep 17 00:00:00 2001 From: John Gallagher Date: Thu, 6 Feb 2025 12:58:25 -0500 Subject: [PATCH 14/43] [omdb] Move `omdb db reconfigurator-save` to `omdb reconfigurator export` (#7484) This is purely a rename, creating a new `omdb` subcommand for reconfigurator. PR 1 of 3 moving toward adding `omdb db reconfigurator archive`. --- dev-tools/omdb/src/bin/omdb/db.rs | 77 +++++----------- dev-tools/omdb/src/bin/omdb/main.rs | 6 ++ dev-tools/omdb/src/bin/omdb/reconfigurator.rs | 92 +++++++++++++++++++ dev-tools/omdb/tests/successes.out | 22 ++--- dev-tools/omdb/tests/test_all_output.rs | 4 +- dev-tools/omdb/tests/usage_errors.out | 4 +- 6 files changed, 135 insertions(+), 70 deletions(-) create mode 100644 dev-tools/omdb/src/bin/omdb/reconfigurator.rs diff --git a/dev-tools/omdb/src/bin/omdb/db.rs b/dev-tools/omdb/src/bin/omdb/db.rs index bfd7c594a3b..1124f86de3b 100644 --- a/dev-tools/omdb/src/bin/omdb/db.rs +++ b/dev-tools/omdb/src/bin/omdb/db.rs @@ -27,7 +27,6 @@ use anyhow::Context; use async_bb8_diesel::AsyncConnection; use async_bb8_diesel::AsyncRunQueryDsl; use async_bb8_diesel::AsyncSimpleConnection; -use camino::Utf8PathBuf; use chrono::DateTime; use chrono::SecondsFormat; use chrono::Utc; @@ -144,6 +143,7 @@ use std::collections::BTreeSet; use std::collections::HashMap; use std::collections::HashSet; use std::fmt::Display; +use std::future::Future; use std::num::NonZeroU32; use std::sync::Arc; use strum::IntoEnumIterator; @@ -269,6 +269,23 @@ impl DbUrlOptions { check_schema_version(&datastore).await; Ok(datastore) } + + pub async fn with_datastore( + &self, + omdb: &Omdb, + log: &slog::Logger, + f: F, + ) -> anyhow::Result + where + F: FnOnce(OpContext, Arc) -> Fut, + Fut: Future>, + { + let datastore = self.connect(omdb, log).await?; + let opctx = OpContext::for_tests(log.clone(), datastore.clone()); + let result = f(opctx, datastore.clone()).await; + datastore.terminate().await; + result + } } #[derive(Debug, Args, Clone)] @@ -307,8 +324,6 @@ enum DbCommands { Inventory(InventoryArgs), /// Print information about physical disks PhysicalDisks(PhysicalDisksArgs), - /// Save the current Reconfigurator inputs to a file - ReconfiguratorSave(ReconfiguratorSaveArgs), /// Print information about regions Region(RegionArgs), /// Query for information about region replacements, optionally manually @@ -546,12 +561,6 @@ struct PhysicalDisksArgs { filter: Option, } -#[derive(Debug, Args, Clone)] -struct ReconfiguratorSaveArgs { - /// where to save the output - output_file: Utf8PathBuf, -} - #[derive(Debug, Args, Clone)] struct SledsArgs { /// Show sleds that match the given filter @@ -892,12 +901,9 @@ impl DbArgs { omdb: &Omdb, log: &slog::Logger, ) -> Result<(), anyhow::Error> { - let datastore = self.db_url_opts.connect(omdb, log).await?; - let opctx = OpContext::for_tests(log.clone(), datastore.clone()); - let res = { - let command = self.command.clone(); - let fetch_opts = self.fetch_opts.clone(); - let datastore = datastore.clone(); + let command = self.command.clone(); + let fetch_opts = self.fetch_opts.clone(); + self.db_url_opts.with_datastore(omdb, log, |opctx, datastore| { async move { match &command { DbCommands::Rack(RackArgs { command: RackCommands::List }) => { @@ -944,14 +950,6 @@ impl DbArgs { ) .await } - DbCommands::ReconfiguratorSave(reconfig_save_args) => { - cmd_db_reconfigurator_save( - &opctx, - &datastore, - reconfig_save_args, - ) - .await - } DbCommands::Region(RegionArgs { command: RegionCommands::ListRegionsMissingPorts, }) => cmd_db_region_missing_porst(&opctx, &datastore).await, @@ -1147,9 +1145,7 @@ impl DbArgs { } } } - }.await; - datastore.terminate().await; - res + }).await } } @@ -5926,35 +5922,6 @@ impl LongStringFormatter { } } -// Reconfigurator - -/// Packages up database state that's used as input to the Reconfigurator -/// planner into a file so that it can be loaded into `reconfigurator-cli` -async fn cmd_db_reconfigurator_save( - opctx: &OpContext, - datastore: &DataStore, - reconfig_save_args: &ReconfiguratorSaveArgs, -) -> Result<(), anyhow::Error> { - // See Nexus::blueprint_planning_context(). - eprint!("assembling reconfigurator state ... "); - let state = nexus_reconfigurator_preparation::reconfigurator_state_load( - opctx, datastore, - ) - .await?; - eprintln!("done"); - - let output_path = &reconfig_save_args.output_file; - let file = std::fs::OpenOptions::new() - .create_new(true) - .write(true) - .open(&output_path) - .with_context(|| format!("open {:?}", output_path))?; - serde_json::to_writer_pretty(&file, &state) - .with_context(|| format!("write {:?}", output_path))?; - eprintln!("wrote {}", output_path); - Ok(()) -} - // Migrations async fn cmd_db_migrations_list( diff --git a/dev-tools/omdb/src/bin/omdb/main.rs b/dev-tools/omdb/src/bin/omdb/main.rs index f5c5d3f9072..4048091e2b2 100644 --- a/dev-tools/omdb/src/bin/omdb/main.rs +++ b/dev-tools/omdb/src/bin/omdb/main.rs @@ -54,6 +54,7 @@ mod mgs; mod nexus; mod oximeter; mod oxql; +mod reconfigurator; mod sled_agent; #[tokio::main] @@ -72,6 +73,9 @@ async fn main() -> Result<(), anyhow::Error> { OmdbCommands::Nexus(nexus) => nexus.run_cmd(&args, &log).await, OmdbCommands::Oximeter(oximeter) => oximeter.run_cmd(&args, &log).await, OmdbCommands::Oxql(oxql) => oxql.run_cmd(&args, &log).await, + OmdbCommands::Reconfigurator(reconfig) => { + reconfig.run_cmd(&args, &log).await + } OmdbCommands::SledAgent(sled) => sled.run_cmd(&args, &log).await, OmdbCommands::CrucibleAgent(crucible) => crucible.run_cmd(&args).await, } @@ -286,6 +290,8 @@ enum OmdbCommands { Oximeter(oximeter::OximeterArgs), /// Enter the Oximeter Query Language shell for interactive querying. Oxql(oxql::OxqlArgs), + /// Interact with the Reconfigurator system + Reconfigurator(reconfigurator::ReconfiguratorArgs), /// Debug a specific Sled SledAgent(sled_agent::SledAgentArgs), } diff --git a/dev-tools/omdb/src/bin/omdb/reconfigurator.rs b/dev-tools/omdb/src/bin/omdb/reconfigurator.rs new file mode 100644 index 00000000000..6a7b6235cae --- /dev/null +++ b/dev-tools/omdb/src/bin/omdb/reconfigurator.rs @@ -0,0 +1,92 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +//! omdb commands that interact with Reconfigurator + +use crate::db::DbUrlOptions; +use crate::Omdb; +use anyhow::Context as _; +use camino::Utf8PathBuf; +use clap::Args; +use clap::Subcommand; +use nexus_db_queries::context::OpContext; +use nexus_db_queries::db::DataStore; +use slog::Logger; + +/// Arguments to the "omdb reconfigurator" subcommand +#[derive(Debug, Args)] +pub struct ReconfiguratorArgs { + /// URL of the database SQL interface + #[clap(flatten)] + db_url_opts: DbUrlOptions, + + #[command(subcommand)] + command: ReconfiguratorCommands, +} + +/// Subcommands for the "omdb reconfigurator" subcommand +#[allow(clippy::large_enum_variant)] +#[derive(Debug, Subcommand)] +enum ReconfiguratorCommands { + /// Save the current Reconfigurator state to a file + Export(ExportArgs), +} + +#[derive(Debug, Args, Clone)] +struct ExportArgs { + /// where to save the output + output_file: Utf8PathBuf, +} + +impl ReconfiguratorArgs { + /// Run a `omdb reconfigurator` subcommand. + pub(crate) async fn run_cmd( + &self, + omdb: &Omdb, + log: &Logger, + ) -> anyhow::Result<()> { + match &self.command { + ReconfiguratorCommands::Export(export_args) => { + self.db_url_opts + .with_datastore(omdb, log, |opctx, datastore| async move { + cmd_reconfigurator_export( + &opctx, + &datastore, + export_args, + ) + .await + }) + .await?; + } + } + Ok(()) + } +} + +/// Packages up database state that's used as input to the Reconfigurator +/// planner into a file so that it can be loaded into `reconfigurator-cli` +async fn cmd_reconfigurator_export( + opctx: &OpContext, + datastore: &DataStore, + export_args: &ExportArgs, +) -> anyhow::Result<()> { + // See Nexus::blueprint_planning_context(). + eprint!("assembling reconfigurator state ... "); + let state = nexus_reconfigurator_preparation::reconfigurator_state_load( + opctx, datastore, + ) + .await?; + eprintln!("done"); + + let output_path = &export_args.output_file; + let file = std::fs::OpenOptions::new() + .create_new(true) + .write(true) + .open(&output_path) + .with_context(|| format!("open {:?}", output_path))?; + serde_json::to_writer_pretty(&file, &state) + .with_context(|| format!("write {:?}", output_path))?; + eprintln!("wrote {}", output_path); + Ok(()) +} diff --git a/dev-tools/omdb/tests/successes.out b/dev-tools/omdb/tests/successes.out index 617d159a00e..511f78ab212 100644 --- a/dev-tools/omdb/tests/successes.out +++ b/dev-tools/omdb/tests/successes.out @@ -58,17 +58,6 @@ stderr: note: using database URL postgresql://root@[::1]:REDACTED_PORT/omicron?sslmode=disable note: database schema version matches expected () ============================================= -EXECUTING COMMAND: omdb ["db", "reconfigurator-save", ""] -termination: Exited(0) ---------------------------------------------- -stdout: ---------------------------------------------- -stderr: -note: using database URL postgresql://root@[::1]:REDACTED_PORT/omicron?sslmode=disable -note: database schema version matches expected () -assembling reconfigurator state ... done -wrote -============================================= EXECUTING COMMAND: omdb ["db", "sleds"] termination: Exited(0) --------------------------------------------- @@ -1561,3 +1550,14 @@ to: blueprint ............. stderr: note: using Nexus URL http://127.0.0.1:REDACTED_PORT/ ============================================= +EXECUTING COMMAND: omdb ["reconfigurator", "export", ""] +termination: Exited(0) +--------------------------------------------- +stdout: +--------------------------------------------- +stderr: +note: using database URL postgresql://root@[::1]:REDACTED_PORT/omicron?sslmode=disable +note: database schema version matches expected () +assembling reconfigurator state ... done +wrote +============================================= diff --git a/dev-tools/omdb/tests/test_all_output.rs b/dev-tools/omdb/tests/test_all_output.rs index c975fc36d8a..dfb319e1ccd 100644 --- a/dev-tools/omdb/tests/test_all_output.rs +++ b/dev-tools/omdb/tests/test_all_output.rs @@ -135,7 +135,7 @@ async fn test_omdb_success_cases(cptestctx: &ControlPlaneTestContext) { let tmpdir = camino_tempfile::tempdir() .expect("failed to create temporary directory"); - let tmppath = tmpdir.path().join("reconfigurator-save.out"); + let tmppath = tmpdir.path().join("reconfigurator-export.out"); let initial_blueprint_id = cptestctx.initial_blueprint_id.to_string(); // Get the CockroachDB metadata from the blueprint so we can redact it @@ -160,7 +160,6 @@ async fn test_omdb_success_cases(cptestctx: &ControlPlaneTestContext) { &["db", "dns", "diff", "external", "2"], &["db", "dns", "names", "external", "2"], &["db", "instances"], - &["db", "reconfigurator-save", tmppath.as_str()], &["db", "sleds"], &["db", "sleds", "-F", "discretionary"], &["mgs", "inventory"], @@ -199,6 +198,7 @@ async fn test_omdb_success_cases(cptestctx: &ControlPlaneTestContext) { &initial_blueprint_id, "current-target", ], + &["reconfigurator", "export", tmppath.as_str()], // We can't easily test the sled agent output because that's only // provided by a real sled agent, which is not available in the // ControlPlaneTestContext. diff --git a/dev-tools/omdb/tests/usage_errors.out b/dev-tools/omdb/tests/usage_errors.out index f238d1dac18..5160c65c26d 100644 --- a/dev-tools/omdb/tests/usage_errors.out +++ b/dev-tools/omdb/tests/usage_errors.out @@ -15,6 +15,7 @@ Commands: nexus Debug a specific Nexus instance oximeter Query oximeter collector state oxql Enter the Oximeter Query Language shell for interactive querying + reconfigurator Interact with the Reconfigurator system sled-agent Debug a specific Sled help Print this message or the help of the given subcommand(s) @@ -47,6 +48,7 @@ Commands: nexus Debug a specific Nexus instance oximeter Query oximeter collector state oxql Enter the Oximeter Query Language shell for interactive querying + reconfigurator Interact with the Reconfigurator system sled-agent Debug a specific Sled help Print this message or the help of the given subcommand(s) @@ -116,7 +118,6 @@ Commands: dns Print information about internal and external DNS inventory Print information about collected hardware/software inventory physical-disks Print information about physical disks - reconfigurator-save Save the current Reconfigurator inputs to a file region Print information about regions region-replacement Query for information about region replacements, optionally manually triggering one @@ -167,7 +168,6 @@ Commands: dns Print information about internal and external DNS inventory Print information about collected hardware/software inventory physical-disks Print information about physical disks - reconfigurator-save Save the current Reconfigurator inputs to a file region Print information about regions region-replacement Query for information about region replacements, optionally manually triggering one From da66012a2c91721bbae66da42202895d779dc0a4 Mon Sep 17 00:00:00 2001 From: John Gallagher Date: Thu, 6 Feb 2025 15:02:01 -0500 Subject: [PATCH 15/43] [reconfigurator] Add target blueprint to reconfigurator state (#7485) This PR adds the target blueprint as an optional field in `UnstableReconfiguratorState`. I don't love that it's optional, because on any real deployed system, there is guaranteed to be a target blueprint. However, `UnstableReconfiguratorState` is also used by `reconfigurator-cli`, and it has various ways for a system state in memory to have no target blueprint. E.g., it has a test where it starts from an empty state, adds a sled, then writes out an `UnstableReconfiguratorState` that contains that sled but no blueprints at all (and therefore no target blueprint). I'm not sure how much fidelity reconfigurator-cli's simulated system should be required to follow, but it seemed like a nontrivial lift to require it to always have a blueprint, hence making the field optional. Maybe it could use a different serialization struct, but that seems not ideal in other ways. Very open to ideas! Builds on #7484. PR 2 of 3 moving toward adding `omdb db reconfigurator archive`. --- dev-tools/reconfigurator-cli/src/main.rs | 36 +++++++++++++------ .../tests/output/cmd-example-stdout | 12 +++---- .../tests/output/cmd-stdout | 2 +- nexus/reconfigurator/preparation/src/lib.rs | 6 ++++ nexus/reconfigurator/simulation/src/state.rs | 1 + nexus/reconfigurator/simulation/src/system.rs | 20 ++++++++++- nexus/types/src/deployment.rs | 10 +++++- 7 files changed, 68 insertions(+), 19 deletions(-) diff --git a/dev-tools/reconfigurator-cli/src/main.rs b/dev-tools/reconfigurator-cli/src/main.rs index 2a7ee43b686..450c041f257 100644 --- a/dev-tools/reconfigurator-cli/src/main.rs +++ b/dev-tools/reconfigurator-cli/src/main.rs @@ -730,6 +730,10 @@ fn cmd_blueprint_list( #[derive(Tabled)] #[tabled(rename_all = "SCREAMING_SNAKE_CASE")] struct BlueprintRow { + #[tabled(rename = "T")] + is_target: &'static str, + #[tabled(rename = "ENA")] + enabled: &'static str, id: BlueprintUuid, parent: Cow<'static, str>, time_created: String, @@ -737,18 +741,30 @@ fn cmd_blueprint_list( let state = sim.current_state(); + let target_blueprint = state.system().target_blueprint(); let mut rows = state.system().all_blueprints().collect::>(); rows.sort_unstable_by_key(|blueprint| blueprint.time_created); - let rows = rows.into_iter().map(|blueprint| BlueprintRow { - id: blueprint.id, - parent: blueprint - .parent_blueprint_id - .map(|s| Cow::Owned(s.to_string())) - .unwrap_or(Cow::Borrowed("")), - time_created: humantime::format_rfc3339_millis( - blueprint.time_created.into(), - ) - .to_string(), + let rows = rows.into_iter().map(|blueprint| { + let (is_target, enabled) = match target_blueprint { + Some(t) if t.target_id == blueprint.id => { + let enabled = if t.enabled { "yes" } else { "no" }; + ("*", enabled) + } + _ => ("", ""), + }; + BlueprintRow { + is_target, + enabled, + id: blueprint.id, + parent: blueprint + .parent_blueprint_id + .map(|s| Cow::Owned(s.to_string())) + .unwrap_or(Cow::Borrowed("")), + time_created: humantime::format_rfc3339_millis( + blueprint.time_created.into(), + ) + .to_string(), + } }); let table = tabled::Table::new(rows) .with(tabled::settings::Style::empty()) diff --git a/dev-tools/reconfigurator-cli/tests/output/cmd-example-stdout b/dev-tools/reconfigurator-cli/tests/output/cmd-example-stdout index 00636a83800..4d84b9a5bcc 100644 --- a/dev-tools/reconfigurator-cli/tests/output/cmd-example-stdout +++ b/dev-tools/reconfigurator-cli/tests/output/cmd-example-stdout @@ -30,9 +30,9 @@ ID NERRORS TIME_DONE 9e187896-7809-46d0-9210-d75be1b3c4d4 0 > blueprint-list -ID PARENT TIME_CREATED -02697f74-b14a-4418-90f0-c28b2a3a6aa9 -ade5749d-bdf3-4fab-a8ae-00bea01b3a5a 02697f74-b14a-4418-90f0-c28b2a3a6aa9 +T ENA ID PARENT TIME_CREATED + 02697f74-b14a-4418-90f0-c28b2a3a6aa9 +* yes ade5749d-bdf3-4fab-a8ae-00bea01b3a5a 02697f74-b14a-4418-90f0-c28b2a3a6aa9 > @@ -225,9 +225,9 @@ ID NERRORS TIME_DONE 9e187896-7809-46d0-9210-d75be1b3c4d4 0 > blueprint-list -ID PARENT TIME_CREATED -02697f74-b14a-4418-90f0-c28b2a3a6aa9 -ade5749d-bdf3-4fab-a8ae-00bea01b3a5a 02697f74-b14a-4418-90f0-c28b2a3a6aa9 +T ENA ID PARENT TIME_CREATED + 02697f74-b14a-4418-90f0-c28b2a3a6aa9 +* yes ade5749d-bdf3-4fab-a8ae-00bea01b3a5a 02697f74-b14a-4418-90f0-c28b2a3a6aa9 > diff --git a/dev-tools/reconfigurator-cli/tests/output/cmd-stdout b/dev-tools/reconfigurator-cli/tests/output/cmd-stdout index 2ded40b6111..cd05cd4979d 100644 --- a/dev-tools/reconfigurator-cli/tests/output/cmd-stdout +++ b/dev-tools/reconfigurator-cli/tests/output/cmd-stdout @@ -6,7 +6,7 @@ ID NZPOOLS SUBNET ID NERRORS TIME_DONE > blueprint-list -ID PARENT TIME_CREATED +T ENA ID PARENT TIME_CREATED > diff --git a/nexus/reconfigurator/preparation/src/lib.rs b/nexus/reconfigurator/preparation/src/lib.rs index 95d2c6a5739..52df1e9ecd4 100644 --- a/nexus/reconfigurator/preparation/src/lib.rs +++ b/nexus/reconfigurator/preparation/src/lib.rs @@ -318,6 +318,11 @@ pub async fn reconfigurator_state_load( .collect::>() .await; + let target_blueprint = datastore + .blueprint_target_get_current(opctx) + .await + .context("failed to read current target blueprint")?; + let mut blueprint_ids = Vec::new(); let mut paginator = Paginator::new(SQL_BATCH_SIZE); while let Some(p) = paginator.next() { @@ -403,6 +408,7 @@ pub async fn reconfigurator_state_load( Ok(UnstableReconfiguratorState { planning_input, collections, + target_blueprint: Some(target_blueprint), blueprints, internal_dns, external_dns, diff --git a/nexus/reconfigurator/simulation/src/state.rs b/nexus/reconfigurator/simulation/src/state.rs index e514e888a0f..8e406113ae6 100644 --- a/nexus/reconfigurator/simulation/src/state.rs +++ b/nexus/reconfigurator/simulation/src/state.rs @@ -136,6 +136,7 @@ impl SimState { Ok(UnstableReconfiguratorState { planning_input, collections: self.system.all_collections().cloned().collect(), + target_blueprint: self.system().target_blueprint(), blueprints: self.system.all_blueprints().cloned().collect(), internal_dns: self .system diff --git a/nexus/reconfigurator/simulation/src/system.rs b/nexus/reconfigurator/simulation/src/system.rs index 32d06d7585b..3d0bbcd5f09 100644 --- a/nexus/reconfigurator/simulation/src/system.rs +++ b/nexus/reconfigurator/simulation/src/system.rs @@ -13,7 +13,9 @@ use nexus_reconfigurator_planning::{ system::{SledHwInventory, SystemDescription}, }; use nexus_types::{ - deployment::{Blueprint, SledFilter, UnstableReconfiguratorState}, + deployment::{ + Blueprint, BlueprintTarget, SledFilter, UnstableReconfiguratorState, + }, internal_api::params::{DnsConfigParams, DnsConfigZone}, inventory::Collection, }; @@ -77,6 +79,9 @@ pub struct SimSystem { /// Stored with `Arc` to allow cheap cloning. blueprints: IndexMap>, + /// Current target blueprint. + target_blueprint: Option, + /// Internal DNS configurations. /// /// Stored with `Arc` to allow cheap cloning. @@ -94,6 +99,7 @@ impl SimSystem { description: SystemDescription::new(), collections: IndexMap::new(), blueprints: IndexMap::new(), + target_blueprint: None, internal_dns: BTreeMap::new(), external_dns: BTreeMap::new(), } @@ -103,6 +109,7 @@ impl SimSystem { !self.description.has_sleds() && self.collections.is_empty() && self.blueprints.is_empty() + && self.target_blueprint.is_none() && self.internal_dns.is_empty() && self.external_dns.is_empty() } @@ -138,6 +145,10 @@ impl SimSystem { } } + pub fn target_blueprint(&self) -> Option { + self.target_blueprint + } + pub fn all_blueprints(&self) -> impl ExactSizeIterator { self.blueprints.values().map(|b| &**b) } @@ -529,6 +540,11 @@ impl SimSystemBuilderInner { example.initial_blueprint.id, Arc::new(example.initial_blueprint), ); + self.system.target_blueprint = Some(BlueprintTarget { + target_id: blueprint.id, + enabled: true, + time_made_target: blueprint.time_created, + }); self.system.blueprints.insert(blueprint.id, Arc::new(blueprint)); } @@ -622,6 +638,8 @@ impl SimSystemBuilderInner { } } + self.system.target_blueprint = state.target_blueprint; + for blueprint in state.blueprints { let blueprint_id = blueprint.id; match self.add_blueprint_inner(Arc::new(blueprint)) { diff --git a/nexus/types/src/deployment.rs b/nexus/types/src/deployment.rs index 64981ab7026..a11435c8bec 100644 --- a/nexus/types/src/deployment.rs +++ b/nexus/types/src/deployment.rs @@ -1103,7 +1103,9 @@ pub struct BlueprintMetadata { } /// Describes what blueprint, if any, the system is currently working toward -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, JsonSchema)] +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema, +)] pub struct BlueprintTarget { /// id of the blueprint that the system is trying to make real pub target_id: BlueprintUuid, @@ -1157,6 +1159,12 @@ impl From<&crate::inventory::Dataset> for CollectionDatasetIdentifier { pub struct UnstableReconfiguratorState { pub planning_input: PlanningInput, pub collections: Vec, + // When collected from a deployed system, `target_blueprint` will always be + // `Some(_)`. `UnstableReconfiguratorState` is also used by + // `reconfigurator-cli`, which allows construction of states that do not + // represent a fully-deployed system (and maybe no blueprints at all, hence + // no target blueprint). + pub target_blueprint: Option, pub blueprints: Vec, pub internal_dns: BTreeMap, pub external_dns: BTreeMap, From 66b84230897f3d9524642a850508e4a11f27313b Mon Sep 17 00:00:00 2001 From: James MacMahon Date: Thu, 6 Feb 2025 15:14:29 -0500 Subject: [PATCH 16/43] omdb db volume lock-holder (#7492) Add a command so omdb can query what is locking a volume. --- dev-tools/omdb/src/bin/omdb/db.rs | 112 +++++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 2 deletions(-) diff --git a/dev-tools/omdb/src/bin/omdb/db.rs b/dev-tools/omdb/src/bin/omdb/db.rs index 1124f86de3b..4b7cd81275e 100644 --- a/dev-tools/omdb/src/bin/omdb/db.rs +++ b/dev-tools/omdb/src/bin/omdb/db.rs @@ -93,6 +93,7 @@ use nexus_db_model::UpstairsRepairNotification; use nexus_db_model::UpstairsRepairProgress; use nexus_db_model::Vmm; use nexus_db_model::Volume; +use nexus_db_model::VolumeRepair; use nexus_db_model::VpcSubnet; use nexus_db_model::Zpool; use nexus_db_queries::context::OpContext; @@ -836,6 +837,8 @@ enum VolumeCommands { Info(VolumeInfoArgs), /// Summarize current volumes List, + /// What is holding the lock? + LockHolder(VolumeLockHolderArgs), } #[derive(Debug, Args, Clone)] @@ -844,6 +847,12 @@ struct VolumeInfoArgs { uuid: Uuid, } +#[derive(Debug, Args, Clone)] +struct VolumeLockHolderArgs { + /// The UUID of the volume + uuid: Uuid, +} + #[derive(Debug, Args, Clone)] struct VmmArgs { #[command(subcommand)] @@ -1129,11 +1138,14 @@ impl DbArgs { command: ValidateCommands::ValidateRegionSnapshots, }) => cmd_db_validate_region_snapshots(&datastore).await, DbCommands::Volumes(VolumeArgs { - command: VolumeCommands::Info(uuid), - }) => cmd_db_volume_info(&datastore, uuid).await, + command: VolumeCommands::Info(args), + }) => cmd_db_volume_info(&datastore, args).await, DbCommands::Volumes(VolumeArgs { command: VolumeCommands::List, }) => cmd_db_volume_list(&datastore, &fetch_opts).await, + DbCommands::Volumes(VolumeArgs { + command: VolumeCommands::LockHolder(args), + }) => cmd_db_volume_lock_holder(&datastore, args).await, DbCommands::Vmm(VmmArgs { command: VmmCommands::Info(args) }) => { cmd_db_vmm_info(&opctx, &datastore, &fetch_opts, &args) @@ -2325,6 +2337,102 @@ fn print_vcr(vcr: VolumeConstructionRequest, pad: usize) { } } +/// What is holding the volume lock? +async fn cmd_db_volume_lock_holder( + datastore: &DataStore, + args: &VolumeLockHolderArgs, +) -> Result<(), anyhow::Error> { + #[derive(Tabled)] + #[tabled(rename_all = "SCREAMING_SNAKE_CASE")] + struct HolderRow { + volume_id: String, + lock_id: String, + holder_type: String, + } + + let mut rows = vec![]; + + let volume_id = VolumeUuid::from_untyped_uuid(args.uuid); + + let maybe_volume_repair_record = datastore + .pool_connection_for_tests() + .await? + .transaction_async(|conn| async move { + use db::schema::volume_repair::dsl; + + conn.batch_execute_async(ALLOW_FULL_TABLE_SCAN_SQL).await?; + + dsl::volume_repair + .filter(dsl::volume_id.eq(to_db_typed_uuid(volume_id))) + .select(VolumeRepair::as_select()) + .first_async(&conn) + .await + }) + .await + .optional()?; + + if let Some(volume_repair_record) = maybe_volume_repair_record { + let conn = datastore.pool_connection_for_tests().await?; + + let is_region_replacement = { + use db::schema::region_replacement::dsl; + + dsl::region_replacement + .filter(dsl::id.eq(volume_repair_record.repair_id)) + .select(RegionReplacement::as_select()) + .load_async(&*conn) + .await + .optional()? + .is_some() + }; + + let is_region_snapshot_replacement = { + use db::schema::region_snapshot_replacement::dsl; + + dsl::region_snapshot_replacement + .filter(dsl::id.eq(volume_repair_record.repair_id)) + .select(RegionSnapshotReplacement::as_select()) + .load_async(&*conn) + .await + .optional()? + .is_some() + }; + + let holder_type = if is_region_replacement { + String::from("region replacement") + } else if is_region_snapshot_replacement { + String::from("region snapshot replacement") + } else { + // It's possible that the `snapshot_create` saga has taken the lock, + // but there's no way to know what that lock id is as it is randomly + // generated during the saga. + // + // TODO with a better interface for querying sagas, one could: + // + // - scan for all the currently running `snapshot_create` sagas + // - deserialize the output (if it's there) of the "lock_id" nodes + // - match against that + // + String::from("unknown (could be snapshot?)") + }; + + rows.push(HolderRow { + volume_id: volume_id.to_string(), + lock_id: volume_repair_record.repair_id.to_string(), + holder_type, + }); + } + + let table = tabled::Table::new(rows) + .with(tabled::settings::Style::empty()) + .with(tabled::settings::Padding::new(0, 1, 0, 0)) + .to_string(); + + println!("{}", table); + + Ok(()) +} + /// List all regions still missing ports async fn cmd_db_region_missing_porst( opctx: &OpContext, From 42d86cd27b28625a4b8b5b174402e3ef36b7edbc Mon Sep 17 00:00:00 2001 From: John Gallagher Date: Thu, 6 Feb 2025 16:27:59 -0500 Subject: [PATCH 17/43] [reconfigurator] Rework planner/builder expungement logic (#7495) The high-level summary of this change is that it moves the logic for handling expunged sleds out of `BlueprintBuilder::expunge_zones_for_sled()` (which is now gone entirely) and into a new method on the planner (`do_plan_expunge_for_commissioned_sled()`, naming suggestions welcome). This fixes two problems; one stylistic, and one semantic: 1. `BlueprintBuilder::expunge_zones_for_sled()` was maybe the worst offender for "is this a builder API or a planner API", because a big chunk of its logic was actually delegated back to `zone_needs_expungement()`, a helper function defined in the planner. The builder now has more explicit and direct methods to expunge specific things, and it's the planner that decides based on the planning input which things to expunge. 2. `BlueprintBuilder::expunge_zones_for_sled()` only handled expunging _zones_. When a sled was expunged, at no point did the planner expunge the disks or datasets on that sled. We haven't been bitten by this yet because the builder currently omits expunged sleds from `blueprint_disks` and `blueprint_datasets` entirely, but that's a major roadblock in the path to joining the maps together (which is a prereq for fixing #7309 by merging sled-agent endpoints together). `do_plan_expunge_for_commissioned_sled()` expunges disks, datasets, and zones. For now we still omit the expunged sleds from `blueprint_disks` and `blueprint_datasets`, but when we stop doing that we'll at least have set the dispositions correctly. --- .../planning/src/blueprint_builder/builder.rs | 330 ++++++++++-------- .../planning/src/blueprint_editor.rs | 1 + .../src/blueprint_editor/sled_editor.rs | 68 +++- .../blueprint_editor/sled_editor/datasets.rs | 35 +- .../src/blueprint_editor/sled_editor/disks.rs | 7 +- .../src/blueprint_editor/sled_editor/zones.rs | 8 +- nexus/reconfigurator/planning/src/planner.rs | 165 ++++----- .../planner_decommissions_sleds_bp2.txt | 2 +- .../output/planner_nonprovisionable_bp2.txt | 2 +- 9 files changed, 361 insertions(+), 257 deletions(-) diff --git a/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs b/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs index f910a60f58f..b62750a6509 100644 --- a/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs +++ b/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs @@ -6,6 +6,7 @@ use crate::blueprint_editor::BlueprintResourceAllocator; use crate::blueprint_editor::BlueprintResourceAllocatorInputError; +use crate::blueprint_editor::DiskExpungeDetails; use crate::blueprint_editor::EditedSled; use crate::blueprint_editor::ExternalNetworkingChoice; use crate::blueprint_editor::ExternalNetworkingError; @@ -14,7 +15,6 @@ use crate::blueprint_editor::InternalDnsError; use crate::blueprint_editor::SledEditError; use crate::blueprint_editor::SledEditor; use crate::planner::rng::PlannerRng; -use crate::planner::zone_needs_expungement; use crate::planner::ZoneExpungeReason; use anyhow::anyhow; use anyhow::bail; @@ -26,6 +26,8 @@ use nexus_sled_agent_shared::inventory::ZoneKind; use nexus_types::deployment::blueprint_zone_type; use nexus_types::deployment::id_map::IdMap; use nexus_types::deployment::Blueprint; +use nexus_types::deployment::BlueprintDatasetDisposition; +use nexus_types::deployment::BlueprintDatasetFilter; use nexus_types::deployment::BlueprintDatasetsConfig; use nexus_types::deployment::BlueprintPhysicalDiskConfig; use nexus_types::deployment::BlueprintPhysicalDiskDisposition; @@ -42,7 +44,6 @@ use nexus_types::deployment::OmicronZoneExternalFloatingAddr; use nexus_types::deployment::OmicronZoneExternalFloatingIp; use nexus_types::deployment::OmicronZoneExternalSnatIp; use nexus_types::deployment::PlanningInput; -use nexus_types::deployment::SledDetails; use nexus_types::deployment::SledFilter; use nexus_types::deployment::SledResources; use nexus_types::deployment::ZpoolFilter; @@ -60,6 +61,7 @@ use omicron_common::api::internal::shared::NetworkInterface; use omicron_common::api::internal::shared::NetworkInterfaceKind; use omicron_uuid_kinds::GenericUuid; use omicron_uuid_kinds::OmicronZoneUuid; +use omicron_uuid_kinds::PhysicalDiskUuid; use omicron_uuid_kinds::SledUuid; use omicron_uuid_kinds::ZpoolUuid; use once_cell::unsync::OnceCell; @@ -271,6 +273,16 @@ pub(crate) enum Operation { reason: ZoneExpungeReason, count: usize, }, + DiskExpunged { + sled_id: SledUuid, + details: DiskExpungeDetails, + }, + SledExpunged { + sled_id: SledUuid, + num_disks_expunged: usize, + num_datasets_expunged: usize, + num_zones_expunged: usize, + }, } impl fmt::Display for Operation { @@ -293,15 +305,6 @@ impl fmt::Display for Operation { } Self::ZoneExpunged { sled_id, reason, count } => { let reason = match reason { - ZoneExpungeReason::DiskExpunged => { - "zone using expunged disk" - } - ZoneExpungeReason::SledDecommissioned => { - "sled state is decomissioned" - } - ZoneExpungeReason::SledExpunged => { - "sled policy is expunged" - } ZoneExpungeReason::ClickhouseClusterDisabled => { "clickhouse cluster disabled via policy" } @@ -314,6 +317,30 @@ impl fmt::Display for Operation { "sled {sled_id}: expunged {count} zones because: {reason}" ) } + Self::DiskExpunged { sled_id, details } => { + write!( + f, + "sled {sled_id}: expunged disk {} with \ + {} associated datasets and {} associated zones", + details.disk_id, + details.num_datasets_expunged, + details.num_zones_expunged, + ) + } + Self::SledExpunged { + sled_id, + num_disks_expunged, + num_datasets_expunged, + num_zones_expunged, + } => { + write!( + f, + "sled {sled_id} expunged \ + (expunged {num_disks_expunged} disks, \ + {num_datasets_expunged} datasets, \ + {num_zones_expunged} zones)" + ) + } } } } @@ -832,158 +859,181 @@ impl<'a> BlueprintBuilder<'a> { self.operations.push(operation); } - /// Expunges all zones requiring expungement from a sled. - /// - /// Returns a list of zone IDs expunged (excluding zones that were already - /// expunged). If the list is empty, then the operation was a no-op. - pub(crate) fn expunge_zones_for_sled( + /// Expunges a disk from a sled. + pub(crate) fn expunge_disk( &mut self, sled_id: SledUuid, - sled_details: &SledDetails, - ) -> Result, Error> { - let log = self.log.new(o!( - "sled_id" => sled_id.to_string(), - )); - + disk_id: PhysicalDiskUuid, + ) -> Result<(), Error> { let editor = self.sled_editors.get_mut(&sled_id).ok_or_else(|| { Error::Planner(anyhow!( - "tried to expunge zones for unknown sled {sled_id}" + "tried to expunge disk for unknown sled {sled_id}" )) })?; + let details = editor + .expunge_disk(&disk_id) + .map_err(|err| Error::SledEditError { sled_id, err })?; + if details.did_expunge_disk { + self.record_operation(Operation::DiskExpunged { sled_id, details }); + } + Ok(()) + } - // Do any zones need to be marked expunged? - let mut zones_to_expunge = BTreeMap::new(); - - for zone_config in editor.zones(BlueprintZoneFilter::All) { - let zone_id = zone_config.id; - let log = log.new(o!( - "zone_id" => zone_id.to_string() - )); + /// Expunge everything on a sled. + pub(crate) fn expunge_sled( + &mut self, + sled_id: SledUuid, + ) -> Result<(), Error> { + let editor = self.sled_editors.get_mut(&sled_id).ok_or_else(|| { + Error::Planner(anyhow!("tried to expunge unknown sled {sled_id}")) + })?; - let Some(reason) = - zone_needs_expungement(sled_details, zone_config, &self.input) - else { - continue; - }; + // We don't have an explicit "sled disposition" in the blueprint, but we + // can expunge all the disks, datasets, and zones on the sled. It is + // sufficient to just expunge the disks: expunging all disks will + // expunge all datasets and zones that depend on those disks, which + // should include all datasets and zones on the sled. (We'll + // double-check this below and fail if this is wrong.) + let mut num_disks_expunged = 0; + let mut num_datasets_expunged = 0; + let mut num_zones_expunged = 0; + + let mut disks_to_expunge = Vec::new(); + for disk in editor.disks(DiskFilter::All) { + match disk.disposition { + BlueprintPhysicalDiskDisposition::InService => { + disks_to_expunge.push(disk.id); + } + BlueprintPhysicalDiskDisposition::Expunged => (), + } + } + for disk_id in disks_to_expunge { + let details = editor + .expunge_disk(&disk_id) + .map_err(|err| Error::SledEditError { sled_id, err })?; + if details.did_expunge_disk { + num_disks_expunged += 1; + } + num_datasets_expunged += details.num_datasets_expunged; + num_zones_expunged += details.num_zones_expunged; + } - // TODO-john we lost the check for "are we expunging a zone we - // modified in this planner iteration" - do we need that? - let is_expunged = match zone_config.disposition { + // Expunging a disk expunges any datasets and zones that depend on it, + // so expunging all in-service disks should have also expunged all + // datasets and zones. Double-check that that's true. + for zone in editor.zones(BlueprintZoneFilter::All) { + match zone.disposition { + BlueprintZoneDisposition::Expunged => (), BlueprintZoneDisposition::InService - | BlueprintZoneDisposition::Quiesced => false, - BlueprintZoneDisposition::Expunged => true, - }; + | BlueprintZoneDisposition::Quiesced => todo!("fixme-1"), + } + } + for dataset in editor.datasets(BlueprintDatasetFilter::All) { + match dataset.disposition { + BlueprintDatasetDisposition::Expunged => (), + BlueprintDatasetDisposition::InService => todo!("fixme-2"), + } + } - if !is_expunged { - match reason { - ZoneExpungeReason::DiskExpunged => { - info!( - &log, - "expunged disk with non-expunged zone was found" - ); - } - ZoneExpungeReason::SledDecommissioned => { - // A sled marked as decommissioned should have no - // resources allocated to it. If it does, it's an - // illegal state, possibly introduced by a bug elsewhere - // in the system -- we need to produce a loud warning - // (i.e. an ERROR-level log message) on this, while - // still removing the zones. - error!( - &log, - "sled has state Decommissioned, yet has zone \ - allocated to it; will expunge it" - ); - } - ZoneExpungeReason::SledExpunged => { - // This is the expected situation. - info!( - &log, - "expunged sled with non-expunged zone found" - ); - } - ZoneExpungeReason::ClickhouseClusterDisabled => { - info!( - &log, - "clickhouse cluster disabled via policy, \ - expunging related zone" - ); - } - ZoneExpungeReason::ClickhouseSingleNodeDisabled => { - info!( - &log, - "clickhouse single-node disabled via policy, \ - expunging related zone" - ); - } - } + // If we didn't expunge anything, this sled was presumably expunged in a + // prior planning run. Only note the operation if we did anything. + if num_disks_expunged > 0 + || num_datasets_expunged > 0 + || num_zones_expunged > 0 + { + self.record_operation(Operation::SledExpunged { + sled_id, + num_disks_expunged, + num_datasets_expunged, + num_zones_expunged, + }); + } + + Ok(()) + } + + pub(crate) fn expunge_all_multinode_clickhouse( + &mut self, + sled_id: SledUuid, + reason: ZoneExpungeReason, + ) -> Result<(), Error> { + let editor = self.sled_editors.get_mut(&sled_id).ok_or_else(|| { + Error::Planner(anyhow!( + "tried to expunge multinode clickhouse zones for unknown \ + sled {sled_id}" + )) + })?; + + let mut zones_to_expunge = Vec::new(); - zones_to_expunge.insert(zone_id, reason); + for zone in editor.zones(BlueprintZoneFilter::ShouldBeRunning) { + if zone.zone_type.is_clickhouse_keeper() + || zone.zone_type.is_clickhouse_server() + { + zones_to_expunge.push(zone.id); } } - if zones_to_expunge.is_empty() { - debug!( - log, - "sled has no zones that need expungement; skipping"; - ); - return Ok(zones_to_expunge); + let mut nexpunged = 0; + for zone_id in zones_to_expunge { + if editor + .expunge_zone(&zone_id) + .map_err(|err| Error::SledEditError { sled_id, err })? + { + nexpunged += 1; + } } - // Now expunge all the zones that need it. - for zone_id in zones_to_expunge.keys() { - editor - .expunge_zone(&zone_id) - .map_err(|err| Error::SledEditError { sled_id, err })?; + if nexpunged > 0 { + self.record_operation(Operation::ZoneExpunged { + sled_id, + reason, + count: nexpunged, + }); } - // Finally, add comments describing what happened. - // - // Group the zones by their reason for expungement. - let mut count_disk_expunged = 0; - let mut count_sled_decommissioned = 0; - let mut count_sled_expunged = 0; - let mut count_clickhouse_cluster_disabled = 0; - let mut count_clickhouse_single_node_disabled = 0; - for reason in zones_to_expunge.values() { - match reason { - ZoneExpungeReason::DiskExpunged => count_disk_expunged += 1, - ZoneExpungeReason::SledDecommissioned => { - count_sled_decommissioned += 1; - } - ZoneExpungeReason::SledExpunged => count_sled_expunged += 1, - ZoneExpungeReason::ClickhouseClusterDisabled => { - count_clickhouse_cluster_disabled += 1 - } - ZoneExpungeReason::ClickhouseSingleNodeDisabled => { - count_clickhouse_single_node_disabled += 1 - } - }; + Ok(()) + } + + pub(crate) fn expunge_all_singlenode_clickhouse( + &mut self, + sled_id: SledUuid, + reason: ZoneExpungeReason, + ) -> Result<(), Error> { + let editor = self.sled_editors.get_mut(&sled_id).ok_or_else(|| { + Error::Planner(anyhow!( + "tried to expunge singlenode clickhouse zones for unknown \ + sled {sled_id}" + )) + })?; + + let mut zones_to_expunge = Vec::new(); + + for zone in editor.zones(BlueprintZoneFilter::ShouldBeRunning) { + if zone.zone_type.is_clickhouse() { + zones_to_expunge.push(zone.id); + } } - let count_and_reason = [ - (count_disk_expunged, ZoneExpungeReason::DiskExpunged), - (count_sled_decommissioned, ZoneExpungeReason::SledDecommissioned), - (count_sled_expunged, ZoneExpungeReason::SledExpunged), - ( - count_clickhouse_cluster_disabled, - ZoneExpungeReason::ClickhouseClusterDisabled, - ), - ( - count_clickhouse_single_node_disabled, - ZoneExpungeReason::ClickhouseSingleNodeDisabled, - ), - ]; - for (count, reason) in count_and_reason { - if count > 0 { - self.record_operation(Operation::ZoneExpunged { - sled_id, - reason, - count, - }); + + let mut nexpunged = 0; + for zone_id in zones_to_expunge { + if editor + .expunge_zone(&zone_id) + .map_err(|err| Error::SledEditError { sled_id, err })? + { + nexpunged += 1; } } - Ok(zones_to_expunge) + if nexpunged > 0 { + self.record_operation(Operation::ZoneExpunged { + sled_id, + reason, + count: nexpunged, + }); + } + + Ok(()) } /// Ensures that the blueprint contains disks for a sled which already diff --git a/nexus/reconfigurator/planning/src/blueprint_editor.rs b/nexus/reconfigurator/planning/src/blueprint_editor.rs index 7af22ce2f74..9fff90d28d1 100644 --- a/nexus/reconfigurator/planning/src/blueprint_editor.rs +++ b/nexus/reconfigurator/planning/src/blueprint_editor.rs @@ -25,5 +25,6 @@ pub use sled_editor::ZonesEditError; pub(crate) use allocators::BlueprintResourceAllocator; pub(crate) use allocators::ExternalNetworkingChoice; pub(crate) use allocators::ExternalSnatNetworkingChoice; +pub(crate) use sled_editor::DiskExpungeDetails; pub(crate) use sled_editor::EditedSled; pub(crate) use sled_editor::SledEditor; diff --git a/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor.rs b/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor.rs index 1a734f7efbe..2cad6113bb8 100644 --- a/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor.rs +++ b/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor.rs @@ -10,6 +10,8 @@ use illumos_utils::zpool::ZpoolName; use itertools::Either; use nexus_sled_agent_shared::inventory::ZoneKind; use nexus_types::deployment::blueprint_zone_type; +use nexus_types::deployment::BlueprintDatasetConfig; +use nexus_types::deployment::BlueprintDatasetFilter; use nexus_types::deployment::BlueprintDatasetsConfig; use nexus_types::deployment::BlueprintPhysicalDiskConfig; use nexus_types::deployment::BlueprintPhysicalDisksConfig; @@ -68,6 +70,14 @@ pub enum SledInputError { MultipleDatasetsOfKind(#[from] MultipleDatasetsOfKind), } +#[derive(Debug, Clone, Eq, PartialEq)] +pub struct DiskExpungeDetails { + pub disk_id: PhysicalDiskUuid, + pub did_expunge_disk: bool, + pub num_datasets_expunged: usize, + pub num_zones_expunged: usize, +} + #[derive(Debug, thiserror::Error)] pub enum SledEditError { #[error("editing a decommissioned sled is not allowed")] @@ -236,6 +246,24 @@ impl SledEditor { } } + pub fn datasets( + &self, + filter: BlueprintDatasetFilter, + ) -> impl Iterator { + match &self.0 { + InnerSledEditor::Active(editor) => { + Either::Left(editor.datasets(filter)) + } + InnerSledEditor::Decommissioned(edited) => Either::Right( + edited + .datasets + .datasets + .iter() + .filter(move |disk| disk.disposition.matches(filter)), + ), + } + } + pub fn zones( &self, filter: BlueprintZoneFilter, @@ -277,7 +305,7 @@ impl SledEditor { pub fn expunge_disk( &mut self, disk_id: &PhysicalDiskUuid, - ) -> Result<(), SledEditError> { + ) -> Result { self.as_active_mut()?.expunge_disk(disk_id) } @@ -292,7 +320,7 @@ impl SledEditor { pub fn expunge_zone( &mut self, zone_id: &OmicronZoneUuid, - ) -> Result<(), SledEditError> { + ) -> Result { self.as_active_mut()?.expunge_zone(zone_id) } @@ -437,6 +465,13 @@ impl ActiveSledEditor { self.disks.disks(filter) } + pub fn datasets( + &self, + filter: BlueprintDatasetFilter, + ) -> impl Iterator { + self.datasets.datasets(filter) + } + pub fn zones( &self, filter: BlueprintZoneFilter, @@ -465,15 +500,28 @@ impl ActiveSledEditor { pub fn expunge_disk( &mut self, disk_id: &PhysicalDiskUuid, - ) -> Result<(), SledEditError> { - let zpool_id = self.disks.expunge(disk_id)?; + ) -> Result { + let (did_expunge_disk, zpool_id) = self.disks.expunge(disk_id)?; // When we expunge a disk, we must also expunge any datasets on it, and // any zones that relied on those datasets. - self.datasets.expunge_all_on_zpool(&zpool_id); - self.zones.expunge_all_on_zpool(&zpool_id); + let num_datasets_expunged = + self.datasets.expunge_all_on_zpool(&zpool_id); + let num_zones_expunged = self.zones.expunge_all_on_zpool(&zpool_id); + + if !did_expunge_disk { + // If we didn't expunge the disk, it was already expunged, so there + // shouldn't have been any datasets or zones to expunge. + debug_assert_eq!(num_datasets_expunged, 0); + debug_assert_eq!(num_zones_expunged, 0); + } - Ok(()) + Ok(DiskExpungeDetails { + disk_id: *disk_id, + did_expunge_disk, + num_datasets_expunged, + num_zones_expunged, + }) } pub fn add_zone( @@ -499,7 +547,7 @@ impl ActiveSledEditor { pub fn expunge_zone( &mut self, zone_id: &OmicronZoneUuid, - ) -> Result<(), SledEditError> { + ) -> Result { let (did_expunge, config) = self.zones.expunge(zone_id)?; // If we didn't actually expunge the zone in this edit, we don't @@ -513,7 +561,7 @@ impl ActiveSledEditor { // explicitly instead of only recording its zpool; once we fix that we // should be able to remove this check. if !did_expunge { - return Ok(()); + return Ok(did_expunge); } if let Some(dataset) = config.filesystem_dataset() { @@ -524,7 +572,7 @@ impl ActiveSledEditor { .expunge(&dataset.dataset.pool_name.id(), &dataset.kind)?; } - Ok(()) + Ok(did_expunge) } /// Backwards compatibility / test helper: If we're given a blueprint that diff --git a/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/datasets.rs b/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/datasets.rs index ab9f222ae04..a8e05ef5242 100644 --- a/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/datasets.rs +++ b/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/datasets.rs @@ -8,6 +8,7 @@ use illumos_utils::zpool::ZpoolName; use nexus_types::deployment::id_map::{self, IdMap}; use nexus_types::deployment::BlueprintDatasetConfig; use nexus_types::deployment::BlueprintDatasetDisposition; +use nexus_types::deployment::BlueprintDatasetFilter; use nexus_types::deployment::BlueprintDatasetsConfig; use omicron_common::api::external::ByteCount; use omicron_common::api::external::Generation; @@ -19,12 +20,8 @@ use omicron_uuid_kinds::DatasetUuid; use omicron_uuid_kinds::ZpoolUuid; use std::collections::btree_map::Entry; use std::collections::BTreeMap; -use std::collections::BTreeSet; use std::net::SocketAddrV6; -#[cfg(test)] -use nexus_types::deployment::BlueprintDatasetFilter; - #[derive(Debug, thiserror::Error)] #[error( "invalid blueprint input: multiple datasets with kind {kind:?} \ @@ -125,11 +122,6 @@ pub(super) struct DatasetsEditor { // Cache of _in service only_ datasets, identified by (zpool, kind). in_service_by_zpool_and_kind: BTreeMap>, - // Cache of _expunged_ dataset IDs. This serves as a list of IDs from - // `preexisting_dataset_ids` to ignore, as we shouldn't reuse old IDs if - // they belong to expunged datasets. We should be able to remove this when - // we remove `preexisting_dataset_ids`. - expunged_datasets: BTreeSet, counts: EditCounts, } @@ -138,7 +130,6 @@ impl DatasetsEditor { config: BlueprintDatasetsConfig, ) -> Result { let mut in_service_by_zpool_and_kind = BTreeMap::new(); - let mut expunged_datasets = BTreeSet::new(); for dataset in config.datasets.iter() { match dataset.disposition { BlueprintDatasetDisposition::InService => { @@ -160,15 +151,12 @@ impl DatasetsEditor { } } } - BlueprintDatasetDisposition::Expunged => { - expunged_datasets.insert(dataset.id); - } + BlueprintDatasetDisposition::Expunged => (), } } Ok(Self { config, in_service_by_zpool_and_kind, - expunged_datasets, counts: EditCounts::zeroes(), }) } @@ -180,7 +168,6 @@ impl DatasetsEditor { datasets: IdMap::new(), }, in_service_by_zpool_and_kind: BTreeMap::new(), - expunged_datasets: BTreeSet::new(), counts: EditCounts::zeroes(), } } @@ -197,7 +184,6 @@ impl DatasetsEditor { self.counts } - #[cfg(test)] pub fn datasets( &self, filter: BlueprintDatasetFilter, @@ -210,7 +196,7 @@ impl DatasetsEditor { // Private method; panics if given an ID that isn't present in // `self.config.datasets`. Callers must ensure the ID is valid. - fn expunge_by_known_valid_id(&mut self, id: DatasetUuid) { + fn expunge_by_known_valid_id(&mut self, id: DatasetUuid) -> bool { let mut dataset = self .config .datasets @@ -220,12 +206,13 @@ impl DatasetsEditor { BlueprintDatasetDisposition::InService => { dataset.disposition = BlueprintDatasetDisposition::Expunged; self.counts.expunged += 1; + true } BlueprintDatasetDisposition::Expunged => { // already expunged; nothing to do + false } } - self.expunged_datasets.insert(dataset.id); } /// Expunge a dataset identified by its zpool + kind combo. @@ -252,15 +239,20 @@ impl DatasetsEditor { Ok(()) } - pub fn expunge_all_on_zpool(&mut self, zpool: &ZpoolUuid) { + pub fn expunge_all_on_zpool(&mut self, zpool: &ZpoolUuid) -> usize { let Some(by_kind) = self.in_service_by_zpool_and_kind.remove(zpool) else { - return; + return 0; }; + let mut nexpunged = 0; for id in by_kind.into_values() { - self.expunge_by_known_valid_id(id); + if self.expunge_by_known_valid_id(id) { + nexpunged += 1; + } } + + nexpunged } pub fn ensure_in_service( @@ -340,7 +332,6 @@ impl DatasetsEditor { mod tests { use super::*; use crate::planner::PlannerRng; - use nexus_types::deployment::BlueprintDatasetFilter; use omicron_uuid_kinds::GenericUuid; use omicron_uuid_kinds::SledUuid; use proptest::prelude::*; diff --git a/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/disks.rs b/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/disks.rs index f7c0dcba367..84cce288a79 100644 --- a/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/disks.rs +++ b/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/disks.rs @@ -96,22 +96,25 @@ impl DisksEditor { pub fn expunge( &mut self, disk_id: &PhysicalDiskUuid, - ) -> Result { + ) -> Result<(bool, ZpoolUuid), DisksEditError> { let config = self.disks.get_mut(disk_id).ok_or_else(|| { DisksEditError::ExpungeNonexistentDisk { id: *disk_id } })?; + let did_expunge: bool; match config.disposition { BlueprintPhysicalDiskDisposition::InService => { config.disposition = BlueprintPhysicalDiskDisposition::Expunged; self.counts.expunged += 1; + did_expunge = true; } BlueprintPhysicalDiskDisposition::Expunged => { // expunge is idempotent; do nothing + did_expunge = false; } } - Ok(config.pool_id) + Ok((did_expunge, config.pool_id)) } } diff --git a/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/zones.rs b/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/zones.rs index f48007d0457..fb504d2e2b6 100644 --- a/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/zones.rs +++ b/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/zones.rs @@ -155,7 +155,8 @@ impl ZonesEditor { } } - pub fn expunge_all_on_zpool(&mut self, zpool: &ZpoolUuid) { + pub fn expunge_all_on_zpool(&mut self, zpool: &ZpoolUuid) -> usize { + let mut nexpunged = 0; for mut config in self.zones.iter_mut() { // Expunge this zone if its filesystem or durable dataset are on // this zpool. (If it has both, they should be on the _same_ zpool, @@ -170,9 +171,12 @@ impl ZonesEditor { .durable_zpool() .map_or(false, |pool| pool.id() == *zpool); if fs_is_on_zpool || dd_is_on_zpool { - Self::expunge_impl(&mut config, &mut self.counts); + if Self::expunge_impl(&mut config, &mut self.counts) { + nexpunged += 1; + } } } + nexpunged } } diff --git a/nexus/reconfigurator/planning/src/planner.rs b/nexus/reconfigurator/planning/src/planner.rs index f687a25801b..524ffaaa974 100644 --- a/nexus/reconfigurator/planning/src/planner.rs +++ b/nexus/reconfigurator/planning/src/planner.rs @@ -11,19 +11,22 @@ use crate::blueprint_builder::Ensure; use crate::blueprint_builder::EnsureMultiple; use crate::blueprint_builder::Error; use crate::blueprint_builder::Operation; +use crate::blueprint_editor::DisksEditError; +use crate::blueprint_editor::SledEditError; use crate::planner::omicron_zone_placement::PlacementError; use nexus_sled_agent_shared::inventory::ZoneKind; use nexus_types::deployment::Blueprint; -use nexus_types::deployment::BlueprintZoneConfig; use nexus_types::deployment::BlueprintZoneDisposition; use nexus_types::deployment::BlueprintZoneFilter; use nexus_types::deployment::CockroachDbClusterVersion; use nexus_types::deployment::CockroachDbPreserveDowngrade; use nexus_types::deployment::CockroachDbSettings; +use nexus_types::deployment::DiskFilter; use nexus_types::deployment::PlanningInput; use nexus_types::deployment::SledDetails; use nexus_types::deployment::SledFilter; use nexus_types::deployment::ZpoolFilter; +use nexus_types::external_api::views::PhysicalDiskPolicy; use nexus_types::external_api::views::SledPolicy; use nexus_types::external_api::views::SledState; use nexus_types::inventory::Collection; @@ -177,9 +180,7 @@ impl<'a> Planner<'a> { self.input.all_sleds(SledFilter::Commissioned) { commissioned_sled_ids.insert(sled_id); - - // Perform the expungement, for any zones that might need it. - self.blueprint.expunge_zones_for_sled(sled_id, sled_details)?; + self.do_plan_expunge_for_commissioned_sled(sled_id, sled_details)?; } // Check for any decommissioned sleds (i.e., sleds for which our @@ -210,6 +211,87 @@ impl<'a> Planner<'a> { Ok(()) } + fn do_plan_expunge_for_commissioned_sled( + &mut self, + sled_id: SledUuid, + sled_details: &SledDetails, + ) -> Result<(), Error> { + match sled_details.policy { + SledPolicy::InService { .. } => { + // Sled is still in service, but have any of its disks been + // expunged? If so, expunge them in the blueprint (which + // whill chain to expunging any datasets and zones that were + // using them). + // + // We don't use a more specific disk filter here because we + // want to look at _only_ the policy: if the operator has + // said a disk should be expunged, we'll expunge it from the + // blueprint regardless of its overall state. + for (_, disk) in sled_details + .resources + .all_disks(DiskFilter::All) + .filter(|(_, disk)| match disk.policy { + PhysicalDiskPolicy::InService => false, + PhysicalDiskPolicy::Expunged => true, + }) + { + match self.blueprint.expunge_disk(sled_id, disk.disk_id) { + Ok(()) => (), + Err(Error::SledEditError { + err: + SledEditError::EditDisks( + DisksEditError::ExpungeNonexistentDisk { + .. + }, + ), + .. + }) => { + // While it should be rare, it's possible there's an + // expunged disk present in the planning input that + // isn't in the blueprint at all (e.g., a disk could + // have been added and then expunged since our + // parent blueprint was created). We don't want to + // fail in this case, but will issue a warning. + warn!( + self.log, + "planning input contained expunged disk not \ + present in parent blueprint"; + "sled_id" => %sled_id, + "disk" => ?disk, + ); + } + Err(err) => return Err(err), + } + } + + // Expunge any multinode clickhouse zones if the policy says + // they shouldn't exist. + if !self.input.clickhouse_cluster_enabled() { + self.blueprint.expunge_all_multinode_clickhouse( + sled_id, + ZoneExpungeReason::ClickhouseClusterDisabled, + )?; + } + + // Similarly, expunge any singlenode clickhouse if the policy + // says they should exist. + if !self.input.clickhouse_single_node_enabled() { + self.blueprint.expunge_all_singlenode_clickhouse( + sled_id, + ZoneExpungeReason::ClickhouseSingleNodeDisabled, + )?; + } + } + // Has the sled been expunged? If so, expunge everything on this + // sled from the blueprint. + SledPolicy::Expunged => { + self.blueprint.expunge_sled(sled_id)?; + } + } + + Ok(()) + } + fn do_plan_add(&mut self) -> Result<(), Error> { // Internal DNS is a prerequisite for bringing up all other zones. At // this point, we assume that internal DNS (as a service) is already @@ -697,87 +779,12 @@ impl<'a> Planner<'a> { } } -/// Returns `Some(reason)` if the sled needs its zones to be expunged, -/// based on the policy and state. -fn sled_needs_all_zones_expunged( - state: SledState, - policy: SledPolicy, -) -> Option { - match state { - SledState::Active => {} - SledState::Decommissioned => { - // A decommissioned sled that still has resources attached to it is - // an illegal state, but representable. If we see a sled in this - // state, we should still expunge all zones in it, but parent code - // should warn on it. - return Some(ZoneExpungeReason::SledDecommissioned); - } - } - - match policy { - SledPolicy::InService { .. } => None, - SledPolicy::Expunged => Some(ZoneExpungeReason::SledExpunged), - } -} - -pub(crate) fn zone_needs_expungement( - sled_details: &SledDetails, - zone_config: &BlueprintZoneConfig, - input: &PlanningInput, -) -> Option { - // Should we expunge the zone because the sled is gone? - if let Some(reason) = - sled_needs_all_zones_expunged(sled_details.state, sled_details.policy) - { - return Some(reason); - } - - // Should we expunge the zone because durable storage is gone? - if let Some(durable_storage_zpool) = zone_config.zone_type.durable_zpool() { - let zpool_id = durable_storage_zpool.id(); - if !sled_details.resources.zpool_is_provisionable(&zpool_id) { - return Some(ZoneExpungeReason::DiskExpunged); - } - }; - - // Should we expunge the zone because transient storage is gone? - if let Some(ref filesystem_zpool) = zone_config.filesystem_pool { - let zpool_id = filesystem_zpool.id(); - if !sled_details.resources.zpool_is_provisionable(&zpool_id) { - return Some(ZoneExpungeReason::DiskExpunged); - } - }; - - // Should we expunge the zone because clickhouse clusters are no longer - // enabled via policy? - if !input.clickhouse_cluster_enabled() { - if zone_config.zone_type.is_clickhouse_keeper() - || zone_config.zone_type.is_clickhouse_server() - { - return Some(ZoneExpungeReason::ClickhouseClusterDisabled); - } - } - - // Should we expunge the zone because single-node clickhouse is no longer - // enabled via policy? - if !input.clickhouse_single_node_enabled() { - if zone_config.zone_type.is_clickhouse() { - return Some(ZoneExpungeReason::ClickhouseSingleNodeDisabled); - } - } - - None -} - /// The reason a sled's zones need to be expunged. /// /// This is used only for introspection and logging -- it's not part of the /// logical flow. #[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] pub(crate) enum ZoneExpungeReason { - DiskExpunged, - SledDecommissioned, - SledExpunged, ClickhouseClusterDisabled, ClickhouseSingleNodeDisabled, } diff --git a/nexus/reconfigurator/planning/tests/output/planner_decommissions_sleds_bp2.txt b/nexus/reconfigurator/planning/tests/output/planner_decommissions_sleds_bp2.txt index 0fb9e45ef10..64fa1b68c1d 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_decommissions_sleds_bp2.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_decommissions_sleds_bp2.txt @@ -114,7 +114,7 @@ WARNING: Zones exist without physical disks! METADATA: created by::::::::::: test_blueprint2 created at::::::::::: 1970-01-01T00:00:00.000Z - comment:::::::::::::: sled a1b477db-b629-48eb-911d-1ccdafca75b9: expunged 15 zones because: sled policy is expunged + comment:::::::::::::: sled a1b477db-b629-48eb-911d-1ccdafca75b9 expunged (expunged 10 disks, 47 datasets, 15 zones) internal DNS version: 1 external DNS version: 1 diff --git a/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_bp2.txt b/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_bp2.txt index 71a5c03184d..7959301ca15 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_bp2.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_bp2.txt @@ -175,7 +175,7 @@ WARNING: Zones exist without physical disks! METADATA: created by::::::::::: test_blueprint2 created at::::::::::: 1970-01-01T00:00:00.000Z - comment:::::::::::::: sled 48d95fef-bc9f-4f50-9a53-1e075836291d: expunged 14 zones because: sled policy is expunged + comment:::::::::::::: sled 48d95fef-bc9f-4f50-9a53-1e075836291d expunged (expunged 10 disks, 45 datasets, 14 zones) internal DNS version: 1 external DNS version: 1 From 9d36d3545986de59440a556318412bfd3ad3d055 Mon Sep 17 00:00:00 2001 From: David Crespo Date: Thu, 6 Feb 2025 16:29:10 -0600 Subject: [PATCH 18/43] Bump web console (utilization fix) (#7496) https://github.com/oxidecomputer/console/compare/517353ee...93c5abc9 * [93c5abc9](https://github.com/oxidecomputer/console/commit/93c5abc9) oxidecomputer/console#2678 --- tools/console_version | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/console_version b/tools/console_version index f8f88205af5..bc90999eee2 100644 --- a/tools/console_version +++ b/tools/console_version @@ -1,2 +1,2 @@ -COMMIT="517353ee1353bbe42f7b4c8a1d002bcfb26d11a0" -SHA2="0813b84fe4357df46fa67a3d97f290776ac6c7336a36fe225f9b6ec18583f1cc" +COMMIT="93c5abc92b386145d0019246c449f09a9abdc375" +SHA2="9e4e49583c9b5477ec6016774d91d8821ee7738e4ad452591a7c3f99bee4217a" From eec841ca39c868c70c796a9bc74ca924b227cc5b Mon Sep 17 00:00:00 2001 From: John Gallagher Date: Thu, 6 Feb 2025 18:00:57 -0500 Subject: [PATCH 19/43] [omdb] Add `omdb reconfigurator archive` to prune old blueprints (#7486) This gives us the tools to address #7278 (once our update runbooks are changed to use this command). Builds on #7485. This is PR 3 of 3 to add this new subcommand). --- dev-tools/omdb/src/bin/omdb/db.rs | 5 +- dev-tools/omdb/src/bin/omdb/reconfigurator.rs | 124 ++++++++++++++++-- dev-tools/omdb/tests/test_all_output.rs | 3 + dev-tools/omdb/tests/usage_errors.out | 54 ++++++++ 4 files changed, 172 insertions(+), 14 deletions(-) diff --git a/dev-tools/omdb/src/bin/omdb/db.rs b/dev-tools/omdb/src/bin/omdb/db.rs index 4b7cd81275e..f0bbf2a67ba 100644 --- a/dev-tools/omdb/src/bin/omdb/db.rs +++ b/dev-tools/omdb/src/bin/omdb/db.rs @@ -910,11 +910,10 @@ impl DbArgs { omdb: &Omdb, log: &slog::Logger, ) -> Result<(), anyhow::Error> { - let command = self.command.clone(); - let fetch_opts = self.fetch_opts.clone(); + let fetch_opts = &self.fetch_opts; self.db_url_opts.with_datastore(omdb, log, |opctx, datastore| { async move { - match &command { + match &self.command { DbCommands::Rack(RackArgs { command: RackCommands::List }) => { cmd_db_rack_list(&opctx, &datastore, &fetch_opts).await } diff --git a/dev-tools/omdb/src/bin/omdb/reconfigurator.rs b/dev-tools/omdb/src/bin/omdb/reconfigurator.rs index 6a7b6235cae..1af0c790b7e 100644 --- a/dev-tools/omdb/src/bin/omdb/reconfigurator.rs +++ b/dev-tools/omdb/src/bin/omdb/reconfigurator.rs @@ -4,14 +4,20 @@ //! omdb commands that interact with Reconfigurator +use crate::check_allow_destructive::DestructiveOperationToken; use crate::db::DbUrlOptions; use crate::Omdb; use anyhow::Context as _; use camino::Utf8PathBuf; use clap::Args; use clap::Subcommand; +use nexus_db_queries::authz; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::DataStore; +use nexus_types::deployment::UnstableReconfiguratorState; +use omicron_common::api::external::Error; +use omicron_common::api::external::LookupType; +use omicron_uuid_kinds::GenericUuid; use slog::Logger; /// Arguments to the "omdb reconfigurator" subcommand @@ -31,6 +37,9 @@ pub struct ReconfiguratorArgs { enum ReconfiguratorCommands { /// Save the current Reconfigurator state to a file Export(ExportArgs), + /// Save the current Reconfigurator state to a file and remove historical + /// artifacts from the live system (e.g., non-target blueprints) + Archive(ExportArgs), } #[derive(Debug, Args, Clone)] @@ -46,21 +55,31 @@ impl ReconfiguratorArgs { omdb: &Omdb, log: &Logger, ) -> anyhow::Result<()> { - match &self.command { - ReconfiguratorCommands::Export(export_args) => { - self.db_url_opts - .with_datastore(omdb, log, |opctx, datastore| async move { - cmd_reconfigurator_export( + self.db_url_opts + .with_datastore(omdb, log, |opctx, datastore| async move { + match &self.command { + ReconfiguratorCommands::Export(export_args) => { + let _state = cmd_reconfigurator_export( &opctx, &datastore, export_args, ) + .await?; + Ok(()) + } + ReconfiguratorCommands::Archive(archive_args) => { + let token = omdb.check_allow_destructive()?; + cmd_reconfigurator_archive( + &opctx, + &datastore, + archive_args, + token, + ) .await - }) - .await?; - } - } - Ok(()) + } + } + }) + .await } } @@ -70,7 +89,7 @@ async fn cmd_reconfigurator_export( opctx: &OpContext, datastore: &DataStore, export_args: &ExportArgs, -) -> anyhow::Result<()> { +) -> anyhow::Result { // See Nexus::blueprint_planning_context(). eprint!("assembling reconfigurator state ... "); let state = nexus_reconfigurator_preparation::reconfigurator_state_load( @@ -88,5 +107,88 @@ async fn cmd_reconfigurator_export( serde_json::to_writer_pretty(&file, &state) .with_context(|| format!("write {:?}", output_path))?; eprintln!("wrote {}", output_path); + Ok(state) +} + +async fn cmd_reconfigurator_archive( + opctx: &OpContext, + datastore: &DataStore, + archive_args: &ExportArgs, + _destruction_token: DestructiveOperationToken, +) -> anyhow::Result<()> { + // First, ensure we can successfully export all our state. + let saved_state = + cmd_reconfigurator_export(opctx, datastore, archive_args).await?; + + // Now, delete every blueprint in `saved_state` except the current target. + // There are two TOCTOU issues here, both of which we can live with: + // + // 1. New blueprints might have been created since we loaded the state to + // save; these won't be deleted. This is fine, and is the same as if new + // blueprints were created after we finished this archive operation. + // 2. The target blueprint might have changed since we loaded the state, and + // might now point to a different blueprint that is in `saved_state`. + // We'll try to delete it below, but that will fail since the current + // target blueprint can't be deleted. The operator will need to run the + // archive process again and save _both_ state files, since we might have + // successfully archived some blueprints before hitting this error. We + // attempt to notice this and log a message for the operator in this + // case. + let target_blueprint_id = saved_state + .target_blueprint + .context( + "system has no current target blueprint: \ + cannot remove non-target blueprints", + )? + .target_id; + + let mut ndeleted = 0; + + eprintln!("removing non-target blueprints ..."); + for blueprint in &saved_state.blueprints { + if blueprint.id == target_blueprint_id { + continue; + } + + let authz_blueprint = authz::Blueprint::new( + authz::FLEET, + blueprint.id.into_untyped_uuid(), + LookupType::ById(blueprint.id.into_untyped_uuid()), + ); + let err = match datastore + .blueprint_delete(opctx, &authz_blueprint) + .await + { + Ok(()) => { + eprintln!(" successfully deleted blueprint {}", blueprint.id); + ndeleted += 1; + continue; + } + Err(err @ Error::Conflict { .. }) => { + if ndeleted > 0 { + eprintln!( + " failed to delete blueprint {}; has this blueprint \ + become the target? If so, rerun this command but \ + keep both archive output files ({ndeleted} \ + blueprints were deleted prior to this failure)", + blueprint.id + ); + } + err + } + Err(err) => err, + }; + return Err(err).with_context(|| { + format!("failed to delete blueprint {}", blueprint.id) + }); + } + + if ndeleted == 0 { + eprintln!("done (no non-target blueprints existed)"); + } else { + let plural = if ndeleted == 1 { "" } else { "s" }; + eprintln!("done ({ndeleted} blueprint{plural} deleted)",); + } + Ok(()) } diff --git a/dev-tools/omdb/tests/test_all_output.rs b/dev-tools/omdb/tests/test_all_output.rs index dfb319e1ccd..148b8eb1452 100644 --- a/dev-tools/omdb/tests/test_all_output.rs +++ b/dev-tools/omdb/tests/test_all_output.rs @@ -105,6 +105,9 @@ async fn test_omdb_usage_errors() { &["oxql", "--help"], // Mispelled argument &["oxql", "--summarizes"], + &["reconfigurator"], + &["reconfigurator", "export"], + &["reconfigurator", "archive"], ]; for args in invocations { diff --git a/dev-tools/omdb/tests/usage_errors.out b/dev-tools/omdb/tests/usage_errors.out index 5160c65c26d..15474230f4e 100644 --- a/dev-tools/omdb/tests/usage_errors.out +++ b/dev-tools/omdb/tests/usage_errors.out @@ -822,3 +822,57 @@ Usage: omdb oxql <--clickhouse-url |--summaries|--elapsed> For more information, try '--help'. ============================================= +EXECUTING COMMAND: omdb ["reconfigurator"] +termination: Exited(2) +--------------------------------------------- +stdout: +--------------------------------------------- +stderr: +Interact with the Reconfigurator system + +Usage: omdb reconfigurator [OPTIONS] + +Commands: + export Save the current Reconfigurator state to a file + archive Save the current Reconfigurator state to a file and remove historical artifacts from the + live system (e.g., non-target blueprints) + help Print this message or the help of the given subcommand(s) + +Options: + --log-level log level filter [env: LOG_LEVEL=] [default: warn] + --color Color output [default: auto] [possible values: auto, always, never] + -h, --help Print help + +Connection Options: + --db-url URL of the database SQL interface [env: OMDB_DB_URL=] + --dns-server [env: OMDB_DNS_SERVER=] + +Safety Options: + -w, --destructive Allow potentially-destructive subcommands +============================================= +EXECUTING COMMAND: omdb ["reconfigurator", "export"] +termination: Exited(2) +--------------------------------------------- +stdout: +--------------------------------------------- +stderr: +error: the following required arguments were not provided: + + +Usage: omdb reconfigurator export + +For more information, try '--help'. +============================================= +EXECUTING COMMAND: omdb ["reconfigurator", "archive"] +termination: Exited(2) +--------------------------------------------- +stdout: +--------------------------------------------- +stderr: +error: the following required arguments were not provided: + + +Usage: omdb reconfigurator archive + +For more information, try '--help'. +============================================= From 6dbd67387aa103e6071ad686e9145f5086fcfaef Mon Sep 17 00:00:00 2001 From: Benjamin Naecker Date: Thu, 6 Feb 2025 15:32:07 -0800 Subject: [PATCH 20/43] Update dendrite (#7483) - Update pinned Dendrite version. - Handle new API types around transceiver datapath via Progenitor's `replace` directive, like the in-repo Dendrite client crate. --- Cargo.lock | 26 ++++++++++++ Cargo.toml | 2 + clients/dpd-client/Cargo.toml | 14 +++--- clients/dpd-client/build.rs | 78 +++++++++++++++++++++++----------- package-manifest.toml | 12 +++--- tools/dendrite_openapi_version | 4 +- tools/dendrite_stub_checksums | 6 +-- 7 files changed, 101 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f23a6e8bbad..bf4a6d3d058 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2636,6 +2636,8 @@ dependencies = [ "serde_json", "slog", "toml 0.8.19", + "transceiver-decode", + "typify 0.3.0", "uuid", ] @@ -12381,6 +12383,30 @@ dependencies = [ "once_cell", ] +[[package]] +name = "transceiver-decode" +version = "0.1.0" +source = "git+https://github.com/oxidecomputer/transceiver-control#9ff89d72aec7848552b595e44e1fdb508f82ddfa" +dependencies = [ + "schemars", + "serde", + "static_assertions", + "thiserror 2.0.11", + "transceiver-messages", +] + +[[package]] +name = "transceiver-messages" +version = "0.1.1" +source = "git+https://github.com/oxidecomputer/transceiver-control#9ff89d72aec7848552b595e44e1fdb508f82ddfa" +dependencies = [ + "bitflags 2.6.0", + "clap", + "hubpack", + "serde", + "thiserror 2.0.11", +] + [[package]] name = "try-lock" version = "0.2.5" diff --git a/Cargo.toml b/Cargo.toml index fbebc842622..69831097204 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -670,11 +670,13 @@ tokio-util = { version = "0.7.12", features = ["io", "io-util"] } toml = "0.8.19" toml_edit = "0.22.22" tough = { version = "0.19.0", features = [ "http" ] } +transceiver-decode = { git = "https://github.com/oxidecomputer/transceiver-control", features = [ "api-traits" ] } trybuild = "1.0.101" tufaceous = { path = "tufaceous" } tufaceous-lib = { path = "tufaceous-lib" } tui-tree-widget = "0.22.0" typed-rng = { path = "typed-rng" } +typify = "0.3.0" unicode-width = "0.1.13" update-common = { path = "update-common" } update-engine = { path = "update-engine" } diff --git a/clients/dpd-client/Cargo.toml b/clients/dpd-client/Cargo.toml index 04240ea5bb9..b496a075ffd 100644 --- a/clients/dpd-client/Cargo.toml +++ b/clients/dpd-client/Cargo.toml @@ -8,18 +8,19 @@ license = "MPL-2.0" workspace = true [dependencies] +chrono.workspace = true futures.workspace = true +http.workspace = true +omicron-workspace-hack.workspace = true progenitor-client.workspace = true +rand.workspace = true +regress.workspace = true reqwest = { workspace = true, features = ["json", "stream", "rustls-tls"] } +schemars.workspace = true serde.workspace = true slog.workspace = true -regress.workspace = true +transceiver-decode.workspace = true uuid.workspace = true -chrono.workspace = true -http.workspace = true -schemars.workspace = true -rand.workspace = true -omicron-workspace-hack.workspace = true [build-dependencies] anyhow.workspace = true @@ -29,3 +30,4 @@ quote.workspace = true rustfmt-wrapper.workspace = true serde_json.workspace = true toml.workspace = true +typify.workspace = true diff --git a/clients/dpd-client/build.rs b/clients/dpd-client/build.rs index 3f14fe7cc73..49bd68502c6 100644 --- a/clients/dpd-client/build.rs +++ b/clients/dpd-client/build.rs @@ -2,7 +2,7 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. -// Copyright 2024 Oxide Computer Company +// Copyright 2025 Oxide Computer Company // // TODO: remove // This code is only required at the moment because the source repo @@ -20,10 +20,32 @@ use quote::quote; use std::env; use std::fs; use std::path::Path; +use typify::TypeSpaceImpl; const DENDRITE_ASIC_PACKAGE: PackageName = PackageName::new_const("dendrite-asic"); +// List of types we replace with the existing type of the same name from the +// `transceiver_decode` crate. +const REPLACEMENTS: &[&'static str] = &[ + "ActiveCableMediaInterfaceId", + "ApplicationDescriptor", + "BaseTMediaInterfaceId", + "CmisDatapath", + "CmisDatapathState", + "CmisLaneStatus", + "ConnectorType", + "ExtendedSpecificationComplianceCode", + "HostElectricalInterfaceId", + "Identifier", + "MediaType", + "MmfMediaInterfaceId", + "PassiveCopperMediaInterfaceId", + "Sff8636Datapath", + "SffComplianceCode", + "SmfMediaInterfaceId", +]; + fn main() -> Result<()> { // Find the current dendrite repo commit from our package manifest. let manifest = fs::read_to_string("../../package-manifest.toml") @@ -75,29 +97,37 @@ fn main() -> Result<()> { })? }; - let code = progenitor::Generator::new( - progenitor::GenerationSettings::new() - .with_inner_type(quote!{ ClientState }) - .with_pre_hook(quote! { - |state: &crate::ClientState, request: &reqwest::Request| { - slog::debug!(state.log, "client request"; - "method" => %request.method(), - "uri" => %request.url(), - "body" => ?&request.body(), - ); - } - }) - .with_post_hook(quote! { - |state: &crate::ClientState, result: &Result<_, _>| { - slog::debug!(state.log, "client response"; "result" => ?result); - } - }) - .with_derive("PartialEq") - ) - .generate_tokens(&spec) - .with_context(|| { - format!("failed to generate progenitor client from {local_path}") - })?; + let mut settings = progenitor::GenerationSettings::new(); + settings + .with_inner_type(quote! { ClientState }) + .with_pre_hook(quote! { + |state: &crate::ClientState, request: &reqwest::Request| { + slog::debug!(state.log, "client request"; + "method" => %request.method(), + "uri" => %request.url(), + "body" => ?&request.body(), + ); + } + }) + .with_post_hook(quote! { + |state: &crate::ClientState, result: &Result<_, _>| { + slog::debug!(state.log, "client response"; "result" => ?result); + } + }) + .with_derive("PartialEq"); + for repl in REPLACEMENTS { + settings.with_replacement( + repl, + format!("::transceiver_decode::{repl}"), + std::iter::once(TypeSpaceImpl::Display), + ); + } + + let code = progenitor::Generator::new(&settings) + .generate_tokens(&spec) + .with_context(|| { + format!("failed to generate progenitor client from {local_path}") + })?; let content = rustfmt_wrapper::rustfmt(code).with_context(|| { format!("rustfmt failed on progenitor code from {local_path}") diff --git a/package-manifest.toml b/package-manifest.toml index 2afe01b8d7c..fc416faf28d 100644 --- a/package-manifest.toml +++ b/package-manifest.toml @@ -720,8 +720,8 @@ only_for_targets.image = "standard" # the other `source.*` keys. source.type = "prebuilt" source.repo = "dendrite" -source.commit = "11bcc3e0f5d28dc7aed150f4df1174844e4dfbef" -source.sha256 = "98c0778ee7645bab82fc71188378ff1ad80bc24619c03a645dafca158dd63bfd" +source.commit = "caf4bee7f1647b4f971199a5268885337ff1691a" +source.sha256 = "0b6f1960e3475036c39b0df14015d968f96dfd198295f7e58ffdc8e2e8618afb" output.type = "zone" output.intermediate_only = true @@ -747,8 +747,8 @@ only_for_targets.image = "standard" # the other `source.*` keys. source.type = "prebuilt" source.repo = "dendrite" -source.commit = "11bcc3e0f5d28dc7aed150f4df1174844e4dfbef" -source.sha256 = "e1f356866490e8cada9e53c25c4ef9965af0a29632868948edcacb13e248648d" +source.commit = "caf4bee7f1647b4f971199a5268885337ff1691a" +source.sha256 = "a966c3c609b35e136b4807530218fb8e7a0a72673e604c47adc9bb4582d5cadf" output.type = "zone" output.intermediate_only = true @@ -767,8 +767,8 @@ only_for_targets.image = "standard" # the other `source.*` keys. source.type = "prebuilt" source.repo = "dendrite" -source.commit = "11bcc3e0f5d28dc7aed150f4df1174844e4dfbef" -source.sha256 = "6a4b51d71d132f8877c15c5a3882bad715a85d11d4a45c1aec9b5f4cb2ea8a6e" +source.commit = "caf4bee7f1647b4f971199a5268885337ff1691a" +source.sha256 = "06d63410222134ece052d15732c709e3a43853563b88398176ef04e66b004b12" output.type = "zone" output.intermediate_only = true diff --git a/tools/dendrite_openapi_version b/tools/dendrite_openapi_version index c28f3631a82..b2b6a40644e 100755 --- a/tools/dendrite_openapi_version +++ b/tools/dendrite_openapi_version @@ -1,2 +1,2 @@ -COMMIT="11bcc3e0f5d28dc7aed150f4df1174844e4dfbef" -SHA2="c381b2ac42fbd68b9230e111cb96beecf90abde10cdc15f02c88d61781c8adb8" +COMMIT="caf4bee7f1647b4f971199a5268885337ff1691a" +SHA2="b5addf1b3a00055312e995909f5a1918bbb26ef6b206b6006b6c1bea2146471d" diff --git a/tools/dendrite_stub_checksums b/tools/dendrite_stub_checksums index 171c6b524f3..39337d3b340 100644 --- a/tools/dendrite_stub_checksums +++ b/tools/dendrite_stub_checksums @@ -1,3 +1,3 @@ -CIDL_SHA256_ILLUMOS="98c0778ee7645bab82fc71188378ff1ad80bc24619c03a645dafca158dd63bfd" -CIDL_SHA256_LINUX_DPD="af090bd0e1c9638570d9208273991bf0ee9ea0488e2b589160294990aadbe1fb" -CIDL_SHA256_LINUX_SWADM="e33015e4965bc22f79453a45078a66f969f0993f4d4691a529dfdf442a52e6e2" +CIDL_SHA256_ILLUMOS="0b6f1960e3475036c39b0df14015d968f96dfd198295f7e58ffdc8e2e8618afb" +CIDL_SHA256_LINUX_DPD="15f4c6844fff6c4051fb6c8455b0f5e28006c39b329babdb0a1e239dec822f05" +CIDL_SHA256_LINUX_SWADM="971c2c36cd04f87e323310834d948d6415f92195c076db497c5f46ee1c6f26f2" From 046c87f7610a8d7156df7ef5ab29c7b98c2c7f5e Mon Sep 17 00:00:00 2001 From: John Gallagher Date: Fri, 7 Feb 2025 10:39:35 -0500 Subject: [PATCH 21/43] [reconfigurator] Add dataset disposition to blueprint diffs (#7497) Fixes #7302, I think! (The issue is titled generically, but the specifics are about dataset diffs, which are fixed by this PR.) The diff is large because of expectorate. The code changes are _heavily_ modified after our existing `ModifiedZone` / zone error stuff (largely "copy, paste, s/zone/dataset/"). --- dev-tools/omdb/tests/successes.out | 18 +- .../output/planner_basic_add_sled_2_3.txt | 340 ++++++------ .../output/planner_basic_add_sled_3_5.txt | 380 +++++++------- ...dataset_settings_modified_in_place_1_2.txt | 114 ++--- .../planner_decommissions_sleds_1_2.txt | 304 +++++------ .../planner_deploy_all_keeper_nodes_1_2.txt | 312 +++++------ .../planner_deploy_all_keeper_nodes_3_4.txt | 312 +++++------ .../planner_deploy_all_keeper_nodes_4_5.txt | 320 ++++++------ .../planner_deploy_all_keeper_nodes_5_6.txt | 320 ++++++------ ...lanner_expunge_clickhouse_clusters_3_4.txt | 328 ++++++------ ...lanner_expunge_clickhouse_clusters_5_6.txt | 224 ++++---- ...ouse_zones_after_policy_is_changed_3_4.txt | 326 ++++++------ .../output/planner_nonprovisionable_1_2.txt | 484 +++++++++--------- .../output/planner_nonprovisionable_2_2a.txt | 294 +++++------ nexus/types/src/deployment.rs | 14 +- nexus/types/src/deployment/blueprint_diff.rs | 278 +++++++--- .../types/src/deployment/blueprint_display.rs | 10 +- 17 files changed, 2282 insertions(+), 2096 deletions(-) diff --git a/dev-tools/omdb/tests/successes.out b/dev-tools/omdb/tests/successes.out index 511f78ab212..d4460bcc3d9 100644 --- a/dev-tools/omdb/tests/successes.out +++ b/dev-tools/omdb/tests/successes.out @@ -1514,15 +1514,15 @@ to: blueprint ............. datasets at generation 2: - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_...................../crypt/zone/oxz_clickhouse_..................... ..................... none none off - oxp_...................../crypt/zone/oxz_cockroachdb_..................... ..................... none none off - oxp_...................../crypt/zone/oxz_crucible_pantry_..................... ..................... none none off - oxp_...................../crypt/zone/oxz_external_dns_..................... ..................... none none off - oxp_...................../crypt/zone/oxz_internal_dns_..................... ..................... none none off - oxp_...................../crypt/zone/oxz_nexus_..................... ..................... none none off + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_...................../crypt/zone/oxz_clickhouse_..................... ..................... in service none none off + oxp_...................../crypt/zone/oxz_cockroachdb_..................... ..................... in service none none off + oxp_...................../crypt/zone/oxz_crucible_pantry_..................... ..................... in service none none off + oxp_...................../crypt/zone/oxz_external_dns_..................... ..................... in service none none off + oxp_...................../crypt/zone/oxz_internal_dns_..................... ..................... in service none none off + oxp_...................../crypt/zone/oxz_nexus_..................... ..................... in service none none off omicron zones at generation 2: diff --git a/nexus/reconfigurator/planning/tests/output/planner_basic_add_sled_2_3.txt b/nexus/reconfigurator/planning/tests/output/planner_basic_add_sled_2_3.txt index 39754a5030b..8a578be17e5 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_basic_add_sled_2_3.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_basic_add_sled_2_3.txt @@ -22,56 +22,56 @@ to: blueprint 4171ad05-89dd-474b-846b-b007e4346366 datasets at generation 2: - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crucible ea8bb9f4-ef14-4764-8713-299c94aee754 none none off - oxp_31a3bc64-7a3b-496d-b644-785dc44b6e37/crucible 7dcb9cca-dcac-4d95-92d1-f9ee376558ee none none off - oxp_7bb40bd6-9c43-4b63-8337-18313c72aea2/crucible 87f012e5-1979-4d4f-abd7-5004e6a4de4a none none off - oxp_988aa8c2-cb5e-406b-9289-425dc2e5bc3a/crucible 8a017cce-a6e3-4891-80d2-282134012f1f none none off - oxp_ad574c09-2ae0-4534-a2a4-f923ce20ae87/crucible 51734f27-2839-481c-b11d-f59843297269 none none off - oxp_ad91e238-4901-4ff4-a91b-75233c936426/crucible 4ebb5c8c-77cc-4d9a-a66a-aab846d7f4d7 none none off - oxp_ce58d463-d442-4c97-a6b4-f7d98c3fd902/crucible 7e930ce3-f0e6-4188-940a-07dee8fc97cd none none off - oxp_f18f7689-0059-4b79-880e-34faf7a0fe0e/crucible e688234b-9854-4a4e-ae8e-5ec66a323784 none none off - oxp_f1d6cea4-640f-415e-89fe-2b1784ce3db8/crucible 48a12bd9-3d59-4151-adf1-ff703d71977c none none off - oxp_f4a96860-bdeb-4435-bdf5-2a10beb3d44a/crucible 4a0ed488-8ab7-4a8b-90da-ab568081832b none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/clickhouse 87d67ac6-6079-4a4c-960e-44991410a64c none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/internal_dns 31caca18-3e69-4e95-a48e-1a3f9219a304 none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone 8df851fd-0e0c-4069-ad4b-e8669051e42d none none off - oxp_31a3bc64-7a3b-496d-b644-785dc44b6e37/crypt/zone 3c2b2846-d286-4ac7-9001-1dbc92d8ec52 none none off - oxp_7bb40bd6-9c43-4b63-8337-18313c72aea2/crypt/zone d7519dd3-b371-4570-b474-e198d679bc47 none none off - oxp_988aa8c2-cb5e-406b-9289-425dc2e5bc3a/crypt/zone da77f084-5fc9-477a-a5b1-e424f98aa53f none none off - oxp_ad574c09-2ae0-4534-a2a4-f923ce20ae87/crypt/zone 8ffb3c67-d81d-4edc-b4fa-f829bc6d9fb5 none none off - oxp_ad91e238-4901-4ff4-a91b-75233c936426/crypt/zone 12c23a3b-389d-4f4f-950e-f7e36ae44262 none none off - oxp_ce58d463-d442-4c97-a6b4-f7d98c3fd902/crypt/zone 6614568a-a5a5-4db2-80f2-3e405fe35e17 none none off - oxp_f18f7689-0059-4b79-880e-34faf7a0fe0e/crypt/zone a7d4d358-7935-4060-985f-280829de083c none none off - oxp_f1d6cea4-640f-415e-89fe-2b1784ce3db8/crypt/zone 35decedb-c97e-4fde-9ee2-26680ccc7f7e none none off - oxp_f4a96860-bdeb-4435-bdf5-2a10beb3d44a/crypt/zone a0b8487f-b194-4583-ab31-3b02d85af60b none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_clickhouse_98229df2-6faf-45a4-8501-48e1ad25706e 0bda3f6e-6852-4476-8539-8d6315466ccb none none off - oxp_ad574c09-2ae0-4534-a2a4-f923ce20ae87/crypt/zone/oxz_crucible_3384bb31-72f2-46fc-9ada-b324580e2930 707c72de-e19c-4c7b-b2a1-4b028e1026c9 none none off - oxp_f1d6cea4-640f-415e-89fe-2b1784ce3db8/crypt/zone/oxz_crucible_397f4188-68b0-4d82-aea4-5b950f6fc779 8cab65a0-26af-42e7-9f77-10a03096edf0 none none off - oxp_988aa8c2-cb5e-406b-9289-425dc2e5bc3a/crypt/zone/oxz_crucible_4a35beea-a998-4ef1-845c-55d69d35108f 74aacf3e-7c5b-44d5-869c-ae04c9f70bf9 none none off - oxp_ad91e238-4901-4ff4-a91b-75233c936426/crypt/zone/oxz_crucible_5710b56a-a07e-49e2-8dfb-34f1c87ca02e 1e1bfd91-4900-4869-9b17-d6ff94d95301 none none off - oxp_f4a96860-bdeb-4435-bdf5-2a10beb3d44a/crypt/zone/oxz_crucible_62b70007-57c1-4086-8e35-e61443f0c259 b1217132-9894-472e-a763-626798f46cc2 none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_crucible_8ca9bfdc-c3a6-4280-ad34-b5af8fd5187e 14b40d48-c5b1-4e8e-90ec-e374d824204d none none off - oxp_31a3bc64-7a3b-496d-b644-785dc44b6e37/crypt/zone/oxz_crucible_9c927800-ba15-4e84-b80e-781606bec308 eb2960e5-5b89-432f-a384-3009d3b3db5d none none off - oxp_ce58d463-d442-4c97-a6b4-f7d98c3fd902/crypt/zone/oxz_crucible_a7cab59f-59f2-4cb9-b559-551dc6c43aaf 8c16b33b-54f3-453d-a28a-baed87bd45da none none off - oxp_f18f7689-0059-4b79-880e-34faf7a0fe0e/crypt/zone/oxz_crucible_cb67f66d-37e3-40a6-adbd-69962fb6cf73 52036fa0-92ad-4444-8156-01d0b2e9b676 none none off - oxp_7bb40bd6-9c43-4b63-8337-18313c72aea2/crypt/zone/oxz_crucible_da2fc172-8cb2-4d66-a92b-017a97842c27 3aa614f6-5a75-44a0-a950-6adb6c299299 none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_crucible_pantry_be4a1d4a-093f-40e0-8e06-74cc1d786d1b 25438f31-b9e0-499f-a55f-9bfcb0a4194d none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_internal_dns_2a6f89a2-3476-4c3b-97b2-322f00f2fc9a 572f2970-46ed-46e1-b600-d021e080903e none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_nexus_fb07dee1-d608-451b-83eb-4ee913d6e1f8 0e2d27bc-01d7-4afd-82e2-973db6138e70 none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_ntp_d7ffba91-8f9d-4168-89a4-26c6c4370cb0 63e6eeb0-e079-4165-9444-8aac3d50fef3 none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/debug 9982db80-b762-4c5f-9916-35383d59b6df 100 GiB none gzip-9 - oxp_31a3bc64-7a3b-496d-b644-785dc44b6e37/crypt/debug fd25bb57-dc4b-42ea-a2ab-d6395b38334f 100 GiB none gzip-9 - oxp_7bb40bd6-9c43-4b63-8337-18313c72aea2/crypt/debug 95f111d8-854f-4177-bcff-481e625dd73d 100 GiB none gzip-9 - oxp_988aa8c2-cb5e-406b-9289-425dc2e5bc3a/crypt/debug 38903da8-c23d-4516-b0ca-6036e26c49e4 100 GiB none gzip-9 - oxp_ad574c09-2ae0-4534-a2a4-f923ce20ae87/crypt/debug 216e74e6-691b-45f9-ad7f-037ae799a8c9 100 GiB none gzip-9 - oxp_ad91e238-4901-4ff4-a91b-75233c936426/crypt/debug e598cc97-90c4-403a-b7fc-741f8b93de87 100 GiB none gzip-9 - oxp_ce58d463-d442-4c97-a6b4-f7d98c3fd902/crypt/debug 235746b2-5d3f-4608-9017-2bd8d1521d2b 100 GiB none gzip-9 - oxp_f18f7689-0059-4b79-880e-34faf7a0fe0e/crypt/debug 08fdf2b1-430d-4a5c-adf3-b0a0f323ae9d 100 GiB none gzip-9 - oxp_f1d6cea4-640f-415e-89fe-2b1784ce3db8/crypt/debug ea7fa07f-f47b-4039-a0db-6ab9ca0f0e2c 100 GiB none gzip-9 - oxp_f4a96860-bdeb-4435-bdf5-2a10beb3d44a/crypt/debug 547cb9ee-f196-4dfe-9f2c-aa4b2f114abe 100 GiB none gzip-9 + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crucible ea8bb9f4-ef14-4764-8713-299c94aee754 in service none none off + oxp_31a3bc64-7a3b-496d-b644-785dc44b6e37/crucible 7dcb9cca-dcac-4d95-92d1-f9ee376558ee in service none none off + oxp_7bb40bd6-9c43-4b63-8337-18313c72aea2/crucible 87f012e5-1979-4d4f-abd7-5004e6a4de4a in service none none off + oxp_988aa8c2-cb5e-406b-9289-425dc2e5bc3a/crucible 8a017cce-a6e3-4891-80d2-282134012f1f in service none none off + oxp_ad574c09-2ae0-4534-a2a4-f923ce20ae87/crucible 51734f27-2839-481c-b11d-f59843297269 in service none none off + oxp_ad91e238-4901-4ff4-a91b-75233c936426/crucible 4ebb5c8c-77cc-4d9a-a66a-aab846d7f4d7 in service none none off + oxp_ce58d463-d442-4c97-a6b4-f7d98c3fd902/crucible 7e930ce3-f0e6-4188-940a-07dee8fc97cd in service none none off + oxp_f18f7689-0059-4b79-880e-34faf7a0fe0e/crucible e688234b-9854-4a4e-ae8e-5ec66a323784 in service none none off + oxp_f1d6cea4-640f-415e-89fe-2b1784ce3db8/crucible 48a12bd9-3d59-4151-adf1-ff703d71977c in service none none off + oxp_f4a96860-bdeb-4435-bdf5-2a10beb3d44a/crucible 4a0ed488-8ab7-4a8b-90da-ab568081832b in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/clickhouse 87d67ac6-6079-4a4c-960e-44991410a64c in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/internal_dns 31caca18-3e69-4e95-a48e-1a3f9219a304 in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone 8df851fd-0e0c-4069-ad4b-e8669051e42d in service none none off + oxp_31a3bc64-7a3b-496d-b644-785dc44b6e37/crypt/zone 3c2b2846-d286-4ac7-9001-1dbc92d8ec52 in service none none off + oxp_7bb40bd6-9c43-4b63-8337-18313c72aea2/crypt/zone d7519dd3-b371-4570-b474-e198d679bc47 in service none none off + oxp_988aa8c2-cb5e-406b-9289-425dc2e5bc3a/crypt/zone da77f084-5fc9-477a-a5b1-e424f98aa53f in service none none off + oxp_ad574c09-2ae0-4534-a2a4-f923ce20ae87/crypt/zone 8ffb3c67-d81d-4edc-b4fa-f829bc6d9fb5 in service none none off + oxp_ad91e238-4901-4ff4-a91b-75233c936426/crypt/zone 12c23a3b-389d-4f4f-950e-f7e36ae44262 in service none none off + oxp_ce58d463-d442-4c97-a6b4-f7d98c3fd902/crypt/zone 6614568a-a5a5-4db2-80f2-3e405fe35e17 in service none none off + oxp_f18f7689-0059-4b79-880e-34faf7a0fe0e/crypt/zone a7d4d358-7935-4060-985f-280829de083c in service none none off + oxp_f1d6cea4-640f-415e-89fe-2b1784ce3db8/crypt/zone 35decedb-c97e-4fde-9ee2-26680ccc7f7e in service none none off + oxp_f4a96860-bdeb-4435-bdf5-2a10beb3d44a/crypt/zone a0b8487f-b194-4583-ab31-3b02d85af60b in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_clickhouse_98229df2-6faf-45a4-8501-48e1ad25706e 0bda3f6e-6852-4476-8539-8d6315466ccb in service none none off + oxp_ad574c09-2ae0-4534-a2a4-f923ce20ae87/crypt/zone/oxz_crucible_3384bb31-72f2-46fc-9ada-b324580e2930 707c72de-e19c-4c7b-b2a1-4b028e1026c9 in service none none off + oxp_f1d6cea4-640f-415e-89fe-2b1784ce3db8/crypt/zone/oxz_crucible_397f4188-68b0-4d82-aea4-5b950f6fc779 8cab65a0-26af-42e7-9f77-10a03096edf0 in service none none off + oxp_988aa8c2-cb5e-406b-9289-425dc2e5bc3a/crypt/zone/oxz_crucible_4a35beea-a998-4ef1-845c-55d69d35108f 74aacf3e-7c5b-44d5-869c-ae04c9f70bf9 in service none none off + oxp_ad91e238-4901-4ff4-a91b-75233c936426/crypt/zone/oxz_crucible_5710b56a-a07e-49e2-8dfb-34f1c87ca02e 1e1bfd91-4900-4869-9b17-d6ff94d95301 in service none none off + oxp_f4a96860-bdeb-4435-bdf5-2a10beb3d44a/crypt/zone/oxz_crucible_62b70007-57c1-4086-8e35-e61443f0c259 b1217132-9894-472e-a763-626798f46cc2 in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_crucible_8ca9bfdc-c3a6-4280-ad34-b5af8fd5187e 14b40d48-c5b1-4e8e-90ec-e374d824204d in service none none off + oxp_31a3bc64-7a3b-496d-b644-785dc44b6e37/crypt/zone/oxz_crucible_9c927800-ba15-4e84-b80e-781606bec308 eb2960e5-5b89-432f-a384-3009d3b3db5d in service none none off + oxp_ce58d463-d442-4c97-a6b4-f7d98c3fd902/crypt/zone/oxz_crucible_a7cab59f-59f2-4cb9-b559-551dc6c43aaf 8c16b33b-54f3-453d-a28a-baed87bd45da in service none none off + oxp_f18f7689-0059-4b79-880e-34faf7a0fe0e/crypt/zone/oxz_crucible_cb67f66d-37e3-40a6-adbd-69962fb6cf73 52036fa0-92ad-4444-8156-01d0b2e9b676 in service none none off + oxp_7bb40bd6-9c43-4b63-8337-18313c72aea2/crypt/zone/oxz_crucible_da2fc172-8cb2-4d66-a92b-017a97842c27 3aa614f6-5a75-44a0-a950-6adb6c299299 in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_crucible_pantry_be4a1d4a-093f-40e0-8e06-74cc1d786d1b 25438f31-b9e0-499f-a55f-9bfcb0a4194d in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_internal_dns_2a6f89a2-3476-4c3b-97b2-322f00f2fc9a 572f2970-46ed-46e1-b600-d021e080903e in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_nexus_fb07dee1-d608-451b-83eb-4ee913d6e1f8 0e2d27bc-01d7-4afd-82e2-973db6138e70 in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_ntp_d7ffba91-8f9d-4168-89a4-26c6c4370cb0 63e6eeb0-e079-4165-9444-8aac3d50fef3 in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/debug 9982db80-b762-4c5f-9916-35383d59b6df in service 100 GiB none gzip-9 + oxp_31a3bc64-7a3b-496d-b644-785dc44b6e37/crypt/debug fd25bb57-dc4b-42ea-a2ab-d6395b38334f in service 100 GiB none gzip-9 + oxp_7bb40bd6-9c43-4b63-8337-18313c72aea2/crypt/debug 95f111d8-854f-4177-bcff-481e625dd73d in service 100 GiB none gzip-9 + oxp_988aa8c2-cb5e-406b-9289-425dc2e5bc3a/crypt/debug 38903da8-c23d-4516-b0ca-6036e26c49e4 in service 100 GiB none gzip-9 + oxp_ad574c09-2ae0-4534-a2a4-f923ce20ae87/crypt/debug 216e74e6-691b-45f9-ad7f-037ae799a8c9 in service 100 GiB none gzip-9 + oxp_ad91e238-4901-4ff4-a91b-75233c936426/crypt/debug e598cc97-90c4-403a-b7fc-741f8b93de87 in service 100 GiB none gzip-9 + oxp_ce58d463-d442-4c97-a6b4-f7d98c3fd902/crypt/debug 235746b2-5d3f-4608-9017-2bd8d1521d2b in service 100 GiB none gzip-9 + oxp_f18f7689-0059-4b79-880e-34faf7a0fe0e/crypt/debug 08fdf2b1-430d-4a5c-adf3-b0a0f323ae9d in service 100 GiB none gzip-9 + oxp_f1d6cea4-640f-415e-89fe-2b1784ce3db8/crypt/debug ea7fa07f-f47b-4039-a0db-6ab9ca0f0e2c in service 100 GiB none gzip-9 + oxp_f4a96860-bdeb-4435-bdf5-2a10beb3d44a/crypt/debug 547cb9ee-f196-4dfe-9f2c-aa4b2f114abe in service 100 GiB none gzip-9 omicron zones at generation 2: @@ -114,54 +114,54 @@ to: blueprint 4171ad05-89dd-474b-846b-b007e4346366 datasets at generation 2: - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crucible 55136aae-73db-46b2-bd32-e26634f865ed none none off - oxp_29758363-6c77-40c3-8740-9c0c64f6e14a/crucible 5c4eda29-ed3e-4dc6-b756-afafa1c216b8 none none off - oxp_3f331c10-7882-48ab-85d9-05108490b55b/crucible 9b5d5293-2546-43f0-b953-73a696cad4bf none none off - oxp_5152d1aa-9045-4e06-9ef6-6eadac3696e4/crucible 74c65a92-1d4a-44cc-9a55-cd540e9fb57e none none off - oxp_5c0dd424-d905-4fc5-a73c-36254fdd470c/crucible cc25055b-483e-46ab-a5bf-1d8838b846fd none none off - oxp_794df76f-bca0-4635-9eb6-773ad0108f7e/crucible 8270e505-beff-480a-955b-bf96c4b1a9a3 none none off - oxp_9024d350-38a7-459b-8550-3b2c4a88b5c1/crucible ea234d9d-291b-4adf-9d96-48b7945c2892 none none off - oxp_95e86080-e162-4980-a589-db6bb1a95ca7/crucible d8d9a6d4-f6be-4044-8eac-b994aa166053 none none off - oxp_d55d36d7-df92-4615-944d-440a1f8b5001/crucible 64955a3e-2059-4d16-aee4-f63f9362b554 none none off - oxp_db6686c8-2dd9-4032-8444-2a06b43baa68/crucible 863c76ac-732e-4d10-b7a3-1d6ba02dc1f5 none none off - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/internal_dns b4df380c-6cca-41c1-b79c-45671067d459 none none off - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone 9bcac944-9866-4251-b333-1cbdc137a03e none none off - oxp_29758363-6c77-40c3-8740-9c0c64f6e14a/crypt/zone 0557de8a-45cf-44a0-a39d-4a7095e9045b none none off - oxp_3f331c10-7882-48ab-85d9-05108490b55b/crypt/zone 5f5e1e10-1561-4556-aac1-6b6285df5cb2 none none off - oxp_5152d1aa-9045-4e06-9ef6-6eadac3696e4/crypt/zone 52d9152d-e80a-455e-b24a-70b5d2ffc372 none none off - oxp_5c0dd424-d905-4fc5-a73c-36254fdd470c/crypt/zone 1b990bb0-ea73-430c-bafa-6eb5647af125 none none off - oxp_794df76f-bca0-4635-9eb6-773ad0108f7e/crypt/zone 4fc058ac-95d8-4ea4-808c-6b976e95449e none none off - oxp_9024d350-38a7-459b-8550-3b2c4a88b5c1/crypt/zone 208cd4b7-be74-4187-a4e3-21e518bc92a6 none none off - oxp_95e86080-e162-4980-a589-db6bb1a95ca7/crypt/zone bf66b843-7c47-4e46-b629-267111de97b5 none none off - oxp_d55d36d7-df92-4615-944d-440a1f8b5001/crypt/zone 5672e912-aa12-4614-b79b-5fcf548e9d96 none none off - oxp_db6686c8-2dd9-4032-8444-2a06b43baa68/crypt/zone 99d7b142-b462-4a67-b84e-f3fc79e761fd none none off - oxp_95e86080-e162-4980-a589-db6bb1a95ca7/crypt/zone/oxz_crucible_1437bb47-a2d3-48e9-8902-021ff5057d26 3dd86436-a934-44a8-97b2-1848ab6ebbc9 none none off - oxp_5c0dd424-d905-4fc5-a73c-36254fdd470c/crypt/zone/oxz_crucible_31f49108-cdda-4659-bf24-319bf99a9c20 faa7fe52-a532-4784-84f3-376dc8334fdd none none off - oxp_29758363-6c77-40c3-8740-9c0c64f6e14a/crypt/zone/oxz_crucible_5152e5e7-8615-407d-beed-37fd03852ad6 5def9f9d-7e1f-4ef0-94cf-b26f21e6da07 none none off - oxp_3f331c10-7882-48ab-85d9-05108490b55b/crypt/zone/oxz_crucible_6593648a-53f3-4a0f-b902-ef6cd7eab43b 9651f8ed-ae45-476c-bca4-42ebe6ee1618 none none off - oxp_d55d36d7-df92-4615-944d-440a1f8b5001/crypt/zone/oxz_crucible_754bae61-cbff-402f-b250-91bec499b449 8e72b070-ef13-4082-bcf8-2c54488a4ae1 none none off - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_crucible_8f316745-d46d-47cb-8c7e-678fd9021c40 d508ecc2-baf5-4299-9799-e6d30f83663e none none off - oxp_9024d350-38a7-459b-8550-3b2c4a88b5c1/crypt/zone/oxz_crucible_9fdb739d-b149-4f8f-b488-b97d16ea284a 96dc8dcd-700b-4dd7-8970-568e91b93948 none none off - oxp_db6686c8-2dd9-4032-8444-2a06b43baa68/crypt/zone/oxz_crucible_b23471ff-b35a-4919-aa3f-3c3683fa3210 646e79ac-9828-4a8d-8173-e385f5e65a15 none none off - oxp_794df76f-bca0-4635-9eb6-773ad0108f7e/crypt/zone/oxz_crucible_fa8963b6-dad1-4cf8-9243-c77b3f86d654 2dd82bf7-cad0-4725-ba7d-0cf40b725b39 none none off - oxp_5152d1aa-9045-4e06-9ef6-6eadac3696e4/crypt/zone/oxz_crucible_ff5bf6ea-ab3e-40c5-a9a5-cb2bc89de9c8 ead9603d-c1ea-4ea8-9ca7-f3bc31718458 none none off - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_crucible_pantry_634fc0b7-9f95-494d-939b-28819cbcaa2b be2863b0-0d23-4fd4-92e8-ffc4184e5742 none none off - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_internal_dns_92628102-eef4-4000-a061-1df796db3806 998bf38c-b6ec-4ddd-80ac-59fc1ee30ca2 none none off - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_nexus_7a3ea24a-85f4-4aad-a935-4e7b22766985 73e12d19-7957-4c44-b3e0-fef8d2ad4826 none none off - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_ntp_edd3fb4a-6ea7-49a5-82fb-444dfcf6fcc5 305f5727-4d83-4282-9efe-f776ad63aef9 none none off - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/debug b3261747-8c28-4c02-8ab7-be1b8cab03fe 100 GiB none gzip-9 - oxp_29758363-6c77-40c3-8740-9c0c64f6e14a/crypt/debug be79f715-8cc9-475c-81dd-f3a8141df986 100 GiB none gzip-9 - oxp_3f331c10-7882-48ab-85d9-05108490b55b/crypt/debug b0f40911-5074-4dad-bcf9-269e20793f6f 100 GiB none gzip-9 - oxp_5152d1aa-9045-4e06-9ef6-6eadac3696e4/crypt/debug 1f81c8ba-d0b2-4c24-b8b8-90a5a3148b2a 100 GiB none gzip-9 - oxp_5c0dd424-d905-4fc5-a73c-36254fdd470c/crypt/debug b489b3a7-eb94-481f-805d-c93958f566dd 100 GiB none gzip-9 - oxp_794df76f-bca0-4635-9eb6-773ad0108f7e/crypt/debug 903e2867-5fc0-487b-9d9c-9afe60731a6c 100 GiB none gzip-9 - oxp_9024d350-38a7-459b-8550-3b2c4a88b5c1/crypt/debug a02260de-3336-4cbf-ba45-ff79586b40fa 100 GiB none gzip-9 - oxp_95e86080-e162-4980-a589-db6bb1a95ca7/crypt/debug 667d664c-c5a1-4b77-a54c-6bbb1bcc2096 100 GiB none gzip-9 - oxp_d55d36d7-df92-4615-944d-440a1f8b5001/crypt/debug 4f4ad767-8887-4892-b6c7-5bc652f3d673 100 GiB none gzip-9 - oxp_db6686c8-2dd9-4032-8444-2a06b43baa68/crypt/debug f5b987f9-0a34-4394-8fc5-2ee12bf3e9bf 100 GiB none gzip-9 + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crucible 55136aae-73db-46b2-bd32-e26634f865ed in service none none off + oxp_29758363-6c77-40c3-8740-9c0c64f6e14a/crucible 5c4eda29-ed3e-4dc6-b756-afafa1c216b8 in service none none off + oxp_3f331c10-7882-48ab-85d9-05108490b55b/crucible 9b5d5293-2546-43f0-b953-73a696cad4bf in service none none off + oxp_5152d1aa-9045-4e06-9ef6-6eadac3696e4/crucible 74c65a92-1d4a-44cc-9a55-cd540e9fb57e in service none none off + oxp_5c0dd424-d905-4fc5-a73c-36254fdd470c/crucible cc25055b-483e-46ab-a5bf-1d8838b846fd in service none none off + oxp_794df76f-bca0-4635-9eb6-773ad0108f7e/crucible 8270e505-beff-480a-955b-bf96c4b1a9a3 in service none none off + oxp_9024d350-38a7-459b-8550-3b2c4a88b5c1/crucible ea234d9d-291b-4adf-9d96-48b7945c2892 in service none none off + oxp_95e86080-e162-4980-a589-db6bb1a95ca7/crucible d8d9a6d4-f6be-4044-8eac-b994aa166053 in service none none off + oxp_d55d36d7-df92-4615-944d-440a1f8b5001/crucible 64955a3e-2059-4d16-aee4-f63f9362b554 in service none none off + oxp_db6686c8-2dd9-4032-8444-2a06b43baa68/crucible 863c76ac-732e-4d10-b7a3-1d6ba02dc1f5 in service none none off + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/internal_dns b4df380c-6cca-41c1-b79c-45671067d459 in service none none off + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone 9bcac944-9866-4251-b333-1cbdc137a03e in service none none off + oxp_29758363-6c77-40c3-8740-9c0c64f6e14a/crypt/zone 0557de8a-45cf-44a0-a39d-4a7095e9045b in service none none off + oxp_3f331c10-7882-48ab-85d9-05108490b55b/crypt/zone 5f5e1e10-1561-4556-aac1-6b6285df5cb2 in service none none off + oxp_5152d1aa-9045-4e06-9ef6-6eadac3696e4/crypt/zone 52d9152d-e80a-455e-b24a-70b5d2ffc372 in service none none off + oxp_5c0dd424-d905-4fc5-a73c-36254fdd470c/crypt/zone 1b990bb0-ea73-430c-bafa-6eb5647af125 in service none none off + oxp_794df76f-bca0-4635-9eb6-773ad0108f7e/crypt/zone 4fc058ac-95d8-4ea4-808c-6b976e95449e in service none none off + oxp_9024d350-38a7-459b-8550-3b2c4a88b5c1/crypt/zone 208cd4b7-be74-4187-a4e3-21e518bc92a6 in service none none off + oxp_95e86080-e162-4980-a589-db6bb1a95ca7/crypt/zone bf66b843-7c47-4e46-b629-267111de97b5 in service none none off + oxp_d55d36d7-df92-4615-944d-440a1f8b5001/crypt/zone 5672e912-aa12-4614-b79b-5fcf548e9d96 in service none none off + oxp_db6686c8-2dd9-4032-8444-2a06b43baa68/crypt/zone 99d7b142-b462-4a67-b84e-f3fc79e761fd in service none none off + oxp_95e86080-e162-4980-a589-db6bb1a95ca7/crypt/zone/oxz_crucible_1437bb47-a2d3-48e9-8902-021ff5057d26 3dd86436-a934-44a8-97b2-1848ab6ebbc9 in service none none off + oxp_5c0dd424-d905-4fc5-a73c-36254fdd470c/crypt/zone/oxz_crucible_31f49108-cdda-4659-bf24-319bf99a9c20 faa7fe52-a532-4784-84f3-376dc8334fdd in service none none off + oxp_29758363-6c77-40c3-8740-9c0c64f6e14a/crypt/zone/oxz_crucible_5152e5e7-8615-407d-beed-37fd03852ad6 5def9f9d-7e1f-4ef0-94cf-b26f21e6da07 in service none none off + oxp_3f331c10-7882-48ab-85d9-05108490b55b/crypt/zone/oxz_crucible_6593648a-53f3-4a0f-b902-ef6cd7eab43b 9651f8ed-ae45-476c-bca4-42ebe6ee1618 in service none none off + oxp_d55d36d7-df92-4615-944d-440a1f8b5001/crypt/zone/oxz_crucible_754bae61-cbff-402f-b250-91bec499b449 8e72b070-ef13-4082-bcf8-2c54488a4ae1 in service none none off + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_crucible_8f316745-d46d-47cb-8c7e-678fd9021c40 d508ecc2-baf5-4299-9799-e6d30f83663e in service none none off + oxp_9024d350-38a7-459b-8550-3b2c4a88b5c1/crypt/zone/oxz_crucible_9fdb739d-b149-4f8f-b488-b97d16ea284a 96dc8dcd-700b-4dd7-8970-568e91b93948 in service none none off + oxp_db6686c8-2dd9-4032-8444-2a06b43baa68/crypt/zone/oxz_crucible_b23471ff-b35a-4919-aa3f-3c3683fa3210 646e79ac-9828-4a8d-8173-e385f5e65a15 in service none none off + oxp_794df76f-bca0-4635-9eb6-773ad0108f7e/crypt/zone/oxz_crucible_fa8963b6-dad1-4cf8-9243-c77b3f86d654 2dd82bf7-cad0-4725-ba7d-0cf40b725b39 in service none none off + oxp_5152d1aa-9045-4e06-9ef6-6eadac3696e4/crypt/zone/oxz_crucible_ff5bf6ea-ab3e-40c5-a9a5-cb2bc89de9c8 ead9603d-c1ea-4ea8-9ca7-f3bc31718458 in service none none off + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_crucible_pantry_634fc0b7-9f95-494d-939b-28819cbcaa2b be2863b0-0d23-4fd4-92e8-ffc4184e5742 in service none none off + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_internal_dns_92628102-eef4-4000-a061-1df796db3806 998bf38c-b6ec-4ddd-80ac-59fc1ee30ca2 in service none none off + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_nexus_7a3ea24a-85f4-4aad-a935-4e7b22766985 73e12d19-7957-4c44-b3e0-fef8d2ad4826 in service none none off + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_ntp_edd3fb4a-6ea7-49a5-82fb-444dfcf6fcc5 305f5727-4d83-4282-9efe-f776ad63aef9 in service none none off + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/debug b3261747-8c28-4c02-8ab7-be1b8cab03fe in service 100 GiB none gzip-9 + oxp_29758363-6c77-40c3-8740-9c0c64f6e14a/crypt/debug be79f715-8cc9-475c-81dd-f3a8141df986 in service 100 GiB none gzip-9 + oxp_3f331c10-7882-48ab-85d9-05108490b55b/crypt/debug b0f40911-5074-4dad-bcf9-269e20793f6f in service 100 GiB none gzip-9 + oxp_5152d1aa-9045-4e06-9ef6-6eadac3696e4/crypt/debug 1f81c8ba-d0b2-4c24-b8b8-90a5a3148b2a in service 100 GiB none gzip-9 + oxp_5c0dd424-d905-4fc5-a73c-36254fdd470c/crypt/debug b489b3a7-eb94-481f-805d-c93958f566dd in service 100 GiB none gzip-9 + oxp_794df76f-bca0-4635-9eb6-773ad0108f7e/crypt/debug 903e2867-5fc0-487b-9d9c-9afe60731a6c in service 100 GiB none gzip-9 + oxp_9024d350-38a7-459b-8550-3b2c4a88b5c1/crypt/debug a02260de-3336-4cbf-ba45-ff79586b40fa in service 100 GiB none gzip-9 + oxp_95e86080-e162-4980-a589-db6bb1a95ca7/crypt/debug 667d664c-c5a1-4b77-a54c-6bbb1bcc2096 in service 100 GiB none gzip-9 + oxp_d55d36d7-df92-4615-944d-440a1f8b5001/crypt/debug 4f4ad767-8887-4892-b6c7-5bc652f3d673 in service 100 GiB none gzip-9 + oxp_db6686c8-2dd9-4032-8444-2a06b43baa68/crypt/debug f5b987f9-0a34-4394-8fc5-2ee12bf3e9bf in service 100 GiB none gzip-9 omicron zones at generation 2: @@ -203,54 +203,54 @@ to: blueprint 4171ad05-89dd-474b-846b-b007e4346366 datasets at generation 2: - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crucible 852963f5-4c4b-4bd9-a5b6-25ea416c25fe none none off - oxp_32456d15-f5b6-4efc-90c8-dbba979b69cb/crucible d37faff5-a0a8-4b60-bb33-508c478fe1c9 none none off - oxp_416fe9f9-5161-4b0f-9e11-c9d81563ded5/crucible c096ba5f-adbf-498d-8ea5-ba736454d9fb none none off - oxp_4c68800e-23f8-485b-b251-628fd151e445/crucible 56661c11-0041-4ffd-8a0c-72b5fc0486b9 none none off - oxp_9dd87c4d-5fb4-475a-86fa-c0da81a3e00a/crucible b6a3f4cf-27f4-4ba8-b063-b4b3c7b03cc3 none none off - oxp_be93a517-445e-46c2-aa21-3dc526d4a413/crucible f32a5631-dd04-4e2d-a9f9-b5974253601d none none off - oxp_d9344e2b-84d2-4392-84ab-41b86ed02237/crucible a15aacbb-53de-45e0-a646-a88817c929c6 none none off - oxp_eab188d0-b34a-4673-b254-12e705597654/crucible 932f321c-10ae-476a-9721-33b5e76fb989 none none off - oxp_f1e0386f-11b6-4cdf-8250-826d256db6b5/crucible ad47c2f1-68ea-413f-ad9e-0975d02a0e11 none none off - oxp_f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b/crucible 9861aeea-9a0c-4fc7-b3d7-e80f3e5c88a5 none none off - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/internal_dns a8eea986-61ba-4723-a97c-61f911210031 none none off - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone 3938e220-b204-4f50-bd73-9c835eb4dea7 none none off - oxp_32456d15-f5b6-4efc-90c8-dbba979b69cb/crypt/zone ba8d7bd5-7282-468c-bba6-28462b5400ff none none off - oxp_416fe9f9-5161-4b0f-9e11-c9d81563ded5/crypt/zone 57497a15-47dd-4eca-a52a-1ee1a3a005b4 none none off - oxp_4c68800e-23f8-485b-b251-628fd151e445/crypt/zone 44a73f30-9601-4fbd-9699-deb600252cb1 none none off - oxp_9dd87c4d-5fb4-475a-86fa-c0da81a3e00a/crypt/zone 6ce8fc11-2f6e-4c7a-b026-d2f05ee49c8f none none off - oxp_be93a517-445e-46c2-aa21-3dc526d4a413/crypt/zone babe6a59-94f6-4fbb-b49e-2fda486cc39e none none off - oxp_d9344e2b-84d2-4392-84ab-41b86ed02237/crypt/zone 69686d88-8e89-4137-9377-3e1b61995d79 none none off - oxp_eab188d0-b34a-4673-b254-12e705597654/crypt/zone f1a436b2-d773-4b72-ad3a-fc5d03ae9855 none none off - oxp_f1e0386f-11b6-4cdf-8250-826d256db6b5/crypt/zone 8196e6fd-4094-4bc9-ad43-1d774de79b25 none none off - oxp_f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b/crypt/zone de91df2d-b85b-4300-82f4-70ee5d0c8f71 none none off - oxp_32456d15-f5b6-4efc-90c8-dbba979b69cb/crypt/zone/oxz_crucible_3b49c2c6-0b0b-4a11-be95-bf94c1cb54a8 e033c975-ab2f-4d39-96e1-02fc6d95e58f none none off - oxp_d9344e2b-84d2-4392-84ab-41b86ed02237/crypt/zone/oxz_crucible_4c65501d-a08d-4fe5-9c78-2694ce6b3a43 28c2eb82-e779-4629-91af-633e4460cd21 none none off - oxp_eab188d0-b34a-4673-b254-12e705597654/crypt/zone/oxz_crucible_60e74b27-a7d7-475e-b5ce-2a92eff4fa63 362a51ca-7116-4df3-96bd-5383c32b33f3 none none off - oxp_f1e0386f-11b6-4cdf-8250-826d256db6b5/crypt/zone/oxz_crucible_68f44e7e-8231-40c0-861e-2f4d0c2eb392 1db171be-4a44-473a-bfa0-c9dda78fed77 none none off - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_crucible_74fc3000-c4b7-4687-88b5-a27584b45434 00218e6a-5e1b-450c-ad38-624ad37d2fc4 none none off - oxp_f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b/crypt/zone/oxz_crucible_83ae0625-2e61-4637-a1f9-473b21b94f72 418a8d5c-fbe8-46c0-b260-e77eb2235105 none none off - oxp_416fe9f9-5161-4b0f-9e11-c9d81563ded5/crypt/zone/oxz_crucible_9b462d74-c05a-4a7e-8d24-449c848a7b13 bea24fa2-353f-4c13-844d-3ce58d682eb7 none none off - oxp_be93a517-445e-46c2-aa21-3dc526d4a413/crypt/zone/oxz_crucible_a9ed9f72-e57d-4092-ab0e-bb2000a5459e dda0482e-cffe-4230-9370-9eebfb9c7121 none none off - oxp_4c68800e-23f8-485b-b251-628fd151e445/crypt/zone/oxz_crucible_d84bc314-4895-4331-8afb-22bffdd56699 17f7d94a-7734-4b3b-a108-dc11b114610e none none off - oxp_9dd87c4d-5fb4-475a-86fa-c0da81a3e00a/crypt/zone/oxz_crucible_f1f03b7d-916e-4c5f-8906-1e18e498184d 3f1fb9c9-8a05-44fc-af26-eb71bec3b890 none none off - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_crucible_pantry_ecdc7438-a007-4558-96b3-65bdab21a8a9 f48c22cc-5ff7-4170-bdbd-bd082c882de3 none none off - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_internal_dns_c1049e2e-7269-4de0-b96e-2e9f8edc90ea 67f5eef3-2c29-4a5c-9664-81dbd5ed55a5 none none off - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_nexus_785868d0-a003-4860-acc1-9beee9f39816 2a2e9b25-83b8-4bc3-b934-723c947f56d7 none none off - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_ntp_d5b390d3-7280-4d2b-b670-340f91d7ebd7 7b3fae75-9421-4a8d-8524-b17a540f994e none none off - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/debug 5eb19f06-e5e9-4b96-b1c3-84355460b2ea 100 GiB none gzip-9 - oxp_32456d15-f5b6-4efc-90c8-dbba979b69cb/crypt/debug 89ab2d4a-101f-46c5-8bb8-2c93dbe2d020 100 GiB none gzip-9 - oxp_416fe9f9-5161-4b0f-9e11-c9d81563ded5/crypt/debug 12f242f1-44e6-449d-9dfd-b4c5c1bb5ddf 100 GiB none gzip-9 - oxp_4c68800e-23f8-485b-b251-628fd151e445/crypt/debug 45d68f02-6f5a-4c8b-9a59-e4554ebbeff7 100 GiB none gzip-9 - oxp_9dd87c4d-5fb4-475a-86fa-c0da81a3e00a/crypt/debug e0e621f0-62f6-4425-a4b0-ff659c63ea11 100 GiB none gzip-9 - oxp_be93a517-445e-46c2-aa21-3dc526d4a413/crypt/debug b90bbe6c-15d2-4313-9fce-c1b9ccdf38d3 100 GiB none gzip-9 - oxp_d9344e2b-84d2-4392-84ab-41b86ed02237/crypt/debug 3bae870d-ae7b-4e95-b4ea-419ba251839b 100 GiB none gzip-9 - oxp_eab188d0-b34a-4673-b254-12e705597654/crypt/debug b7284180-362b-42ba-b970-90c27a8468c5 100 GiB none gzip-9 - oxp_f1e0386f-11b6-4cdf-8250-826d256db6b5/crypt/debug d814aea1-475f-44c2-8dcc-e2cd2d335bf9 100 GiB none gzip-9 - oxp_f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b/crypt/debug fdd77b3a-5ec9-4e1a-bc62-379baa7c5552 100 GiB none gzip-9 + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crucible 852963f5-4c4b-4bd9-a5b6-25ea416c25fe in service none none off + oxp_32456d15-f5b6-4efc-90c8-dbba979b69cb/crucible d37faff5-a0a8-4b60-bb33-508c478fe1c9 in service none none off + oxp_416fe9f9-5161-4b0f-9e11-c9d81563ded5/crucible c096ba5f-adbf-498d-8ea5-ba736454d9fb in service none none off + oxp_4c68800e-23f8-485b-b251-628fd151e445/crucible 56661c11-0041-4ffd-8a0c-72b5fc0486b9 in service none none off + oxp_9dd87c4d-5fb4-475a-86fa-c0da81a3e00a/crucible b6a3f4cf-27f4-4ba8-b063-b4b3c7b03cc3 in service none none off + oxp_be93a517-445e-46c2-aa21-3dc526d4a413/crucible f32a5631-dd04-4e2d-a9f9-b5974253601d in service none none off + oxp_d9344e2b-84d2-4392-84ab-41b86ed02237/crucible a15aacbb-53de-45e0-a646-a88817c929c6 in service none none off + oxp_eab188d0-b34a-4673-b254-12e705597654/crucible 932f321c-10ae-476a-9721-33b5e76fb989 in service none none off + oxp_f1e0386f-11b6-4cdf-8250-826d256db6b5/crucible ad47c2f1-68ea-413f-ad9e-0975d02a0e11 in service none none off + oxp_f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b/crucible 9861aeea-9a0c-4fc7-b3d7-e80f3e5c88a5 in service none none off + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/internal_dns a8eea986-61ba-4723-a97c-61f911210031 in service none none off + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone 3938e220-b204-4f50-bd73-9c835eb4dea7 in service none none off + oxp_32456d15-f5b6-4efc-90c8-dbba979b69cb/crypt/zone ba8d7bd5-7282-468c-bba6-28462b5400ff in service none none off + oxp_416fe9f9-5161-4b0f-9e11-c9d81563ded5/crypt/zone 57497a15-47dd-4eca-a52a-1ee1a3a005b4 in service none none off + oxp_4c68800e-23f8-485b-b251-628fd151e445/crypt/zone 44a73f30-9601-4fbd-9699-deb600252cb1 in service none none off + oxp_9dd87c4d-5fb4-475a-86fa-c0da81a3e00a/crypt/zone 6ce8fc11-2f6e-4c7a-b026-d2f05ee49c8f in service none none off + oxp_be93a517-445e-46c2-aa21-3dc526d4a413/crypt/zone babe6a59-94f6-4fbb-b49e-2fda486cc39e in service none none off + oxp_d9344e2b-84d2-4392-84ab-41b86ed02237/crypt/zone 69686d88-8e89-4137-9377-3e1b61995d79 in service none none off + oxp_eab188d0-b34a-4673-b254-12e705597654/crypt/zone f1a436b2-d773-4b72-ad3a-fc5d03ae9855 in service none none off + oxp_f1e0386f-11b6-4cdf-8250-826d256db6b5/crypt/zone 8196e6fd-4094-4bc9-ad43-1d774de79b25 in service none none off + oxp_f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b/crypt/zone de91df2d-b85b-4300-82f4-70ee5d0c8f71 in service none none off + oxp_32456d15-f5b6-4efc-90c8-dbba979b69cb/crypt/zone/oxz_crucible_3b49c2c6-0b0b-4a11-be95-bf94c1cb54a8 e033c975-ab2f-4d39-96e1-02fc6d95e58f in service none none off + oxp_d9344e2b-84d2-4392-84ab-41b86ed02237/crypt/zone/oxz_crucible_4c65501d-a08d-4fe5-9c78-2694ce6b3a43 28c2eb82-e779-4629-91af-633e4460cd21 in service none none off + oxp_eab188d0-b34a-4673-b254-12e705597654/crypt/zone/oxz_crucible_60e74b27-a7d7-475e-b5ce-2a92eff4fa63 362a51ca-7116-4df3-96bd-5383c32b33f3 in service none none off + oxp_f1e0386f-11b6-4cdf-8250-826d256db6b5/crypt/zone/oxz_crucible_68f44e7e-8231-40c0-861e-2f4d0c2eb392 1db171be-4a44-473a-bfa0-c9dda78fed77 in service none none off + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_crucible_74fc3000-c4b7-4687-88b5-a27584b45434 00218e6a-5e1b-450c-ad38-624ad37d2fc4 in service none none off + oxp_f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b/crypt/zone/oxz_crucible_83ae0625-2e61-4637-a1f9-473b21b94f72 418a8d5c-fbe8-46c0-b260-e77eb2235105 in service none none off + oxp_416fe9f9-5161-4b0f-9e11-c9d81563ded5/crypt/zone/oxz_crucible_9b462d74-c05a-4a7e-8d24-449c848a7b13 bea24fa2-353f-4c13-844d-3ce58d682eb7 in service none none off + oxp_be93a517-445e-46c2-aa21-3dc526d4a413/crypt/zone/oxz_crucible_a9ed9f72-e57d-4092-ab0e-bb2000a5459e dda0482e-cffe-4230-9370-9eebfb9c7121 in service none none off + oxp_4c68800e-23f8-485b-b251-628fd151e445/crypt/zone/oxz_crucible_d84bc314-4895-4331-8afb-22bffdd56699 17f7d94a-7734-4b3b-a108-dc11b114610e in service none none off + oxp_9dd87c4d-5fb4-475a-86fa-c0da81a3e00a/crypt/zone/oxz_crucible_f1f03b7d-916e-4c5f-8906-1e18e498184d 3f1fb9c9-8a05-44fc-af26-eb71bec3b890 in service none none off + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_crucible_pantry_ecdc7438-a007-4558-96b3-65bdab21a8a9 f48c22cc-5ff7-4170-bdbd-bd082c882de3 in service none none off + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_internal_dns_c1049e2e-7269-4de0-b96e-2e9f8edc90ea 67f5eef3-2c29-4a5c-9664-81dbd5ed55a5 in service none none off + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_nexus_785868d0-a003-4860-acc1-9beee9f39816 2a2e9b25-83b8-4bc3-b934-723c947f56d7 in service none none off + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_ntp_d5b390d3-7280-4d2b-b670-340f91d7ebd7 7b3fae75-9421-4a8d-8524-b17a540f994e in service none none off + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/debug 5eb19f06-e5e9-4b96-b1c3-84355460b2ea in service 100 GiB none gzip-9 + oxp_32456d15-f5b6-4efc-90c8-dbba979b69cb/crypt/debug 89ab2d4a-101f-46c5-8bb8-2c93dbe2d020 in service 100 GiB none gzip-9 + oxp_416fe9f9-5161-4b0f-9e11-c9d81563ded5/crypt/debug 12f242f1-44e6-449d-9dfd-b4c5c1bb5ddf in service 100 GiB none gzip-9 + oxp_4c68800e-23f8-485b-b251-628fd151e445/crypt/debug 45d68f02-6f5a-4c8b-9a59-e4554ebbeff7 in service 100 GiB none gzip-9 + oxp_9dd87c4d-5fb4-475a-86fa-c0da81a3e00a/crypt/debug e0e621f0-62f6-4425-a4b0-ff659c63ea11 in service 100 GiB none gzip-9 + oxp_be93a517-445e-46c2-aa21-3dc526d4a413/crypt/debug b90bbe6c-15d2-4313-9fce-c1b9ccdf38d3 in service 100 GiB none gzip-9 + oxp_d9344e2b-84d2-4392-84ab-41b86ed02237/crypt/debug 3bae870d-ae7b-4e95-b4ea-419ba251839b in service 100 GiB none gzip-9 + oxp_eab188d0-b34a-4673-b254-12e705597654/crypt/debug b7284180-362b-42ba-b970-90c27a8468c5 in service 100 GiB none gzip-9 + oxp_f1e0386f-11b6-4cdf-8250-826d256db6b5/crypt/debug d814aea1-475f-44c2-8dcc-e2cd2d335bf9 in service 100 GiB none gzip-9 + oxp_f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b/crypt/debug fdd77b3a-5ec9-4e1a-bc62-379baa7c5552 in service 100 GiB none gzip-9 omicron zones at generation 2: @@ -294,30 +294,30 @@ to: blueprint 4171ad05-89dd-474b-846b-b007e4346366 datasets at generation 2: - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ oxp_28699448-c5d9-49ea-bf7e-627800efe783/crypt/zone bd515f95-ef75-4243-b279-5448e8c56693 none none off -+ oxp_2c490e96-27f2-4a7f-b440-04d4bfd1e4f6/crypt/zone a5ebe3b2-007d-4cb6-a01b-519eb696dd51 none none off -+ oxp_4c3bb1c7-55b6-49b8-b212-516b8f2c26c2/crypt/zone 292da7cf-54f6-4d8c-a941-eebe5d47fe50 none none off -+ oxp_5db07562-31a8-43e3-b99e-7c7cb89754b7/crypt/zone 58573ab1-3d00-4251-9e32-1c8c94d41689 none none off -+ oxp_9451a5d5-b358-4719-b6c1-a0d187da217c/crypt/zone 823a6464-7317-41c4-88d1-317e6156da3b none none off -+ oxp_bb2e2869-9481-483a-bc49-2bdd62f515f5/crypt/zone edf02038-6f07-4788-80f7-1c9ef4537956 none none off -+ oxp_d5a36c66-4b2f-46e6-96f4-b82debee1a4a/crypt/zone 77234c3d-1877-4d9b-9885-cd70b05f6d3d none none off -+ oxp_f99ec996-ec08-4ccf-9a6e-6c5cab440fb4/crypt/zone 04ebd243-fe45-4222-a437-da51aa719c37 none none off -+ oxp_faccbb39-d686-42a1-a50a-0eb59ba74a87/crypt/zone b6c84399-0029-4eaa-af95-328e62813332 none none off -+ oxp_fdfd067b-1d86-444d-a21f-ed33709f3e4d/crypt/zone d1121115-497a-49a1-8908-2bc330bb5b98 none none off -+ oxp_28699448-c5d9-49ea-bf7e-627800efe783/crypt/zone/oxz_ntp_f4a71d99-95e2-484a-ae67-6f98aacee92b 2178dce4-6fba-4b15-b5ce-ece8c54083b5 none none off -+ oxp_28699448-c5d9-49ea-bf7e-627800efe783/crypt/debug 9c2fc653-d640-4d06-8fb0-a32ce35309b7 100 GiB none gzip-9 -+ oxp_2c490e96-27f2-4a7f-b440-04d4bfd1e4f6/crypt/debug 3544ad60-7696-44a4-812d-1e830e2de897 100 GiB none gzip-9 -+ oxp_4c3bb1c7-55b6-49b8-b212-516b8f2c26c2/crypt/debug 81d852cd-0bfd-4f3a-98b5-641657f2acda 100 GiB none gzip-9 -+ oxp_5db07562-31a8-43e3-b99e-7c7cb89754b7/crypt/debug fa35030d-d14d-4969-9dbf-38dfb7bd4a4d 100 GiB none gzip-9 -+ oxp_9451a5d5-b358-4719-b6c1-a0d187da217c/crypt/debug 2110ad2b-9665-4427-b6fb-9059d3d65070 100 GiB none gzip-9 -+ oxp_bb2e2869-9481-483a-bc49-2bdd62f515f5/crypt/debug c4f6dae6-d357-4ad3-becd-5e49c4dcf171 100 GiB none gzip-9 -+ oxp_d5a36c66-4b2f-46e6-96f4-b82debee1a4a/crypt/debug 25c84622-b39a-4c28-9dd5-1f9f33170150 100 GiB none gzip-9 -+ oxp_f99ec996-ec08-4ccf-9a6e-6c5cab440fb4/crypt/debug 1a88aed3-4f65-479a-8677-af5771feade4 100 GiB none gzip-9 -+ oxp_faccbb39-d686-42a1-a50a-0eb59ba74a87/crypt/debug 25eff656-ae3f-42bc-9bfb-8adbc9a1f146 100 GiB none gzip-9 -+ oxp_fdfd067b-1d86-444d-a21f-ed33709f3e4d/crypt/debug ecba8219-9446-4f43-a2fd-098f54ebdfd2 100 GiB none gzip-9 + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ++ oxp_28699448-c5d9-49ea-bf7e-627800efe783/crypt/zone bd515f95-ef75-4243-b279-5448e8c56693 in service none none off ++ oxp_2c490e96-27f2-4a7f-b440-04d4bfd1e4f6/crypt/zone a5ebe3b2-007d-4cb6-a01b-519eb696dd51 in service none none off ++ oxp_4c3bb1c7-55b6-49b8-b212-516b8f2c26c2/crypt/zone 292da7cf-54f6-4d8c-a941-eebe5d47fe50 in service none none off ++ oxp_5db07562-31a8-43e3-b99e-7c7cb89754b7/crypt/zone 58573ab1-3d00-4251-9e32-1c8c94d41689 in service none none off ++ oxp_9451a5d5-b358-4719-b6c1-a0d187da217c/crypt/zone 823a6464-7317-41c4-88d1-317e6156da3b in service none none off ++ oxp_bb2e2869-9481-483a-bc49-2bdd62f515f5/crypt/zone edf02038-6f07-4788-80f7-1c9ef4537956 in service none none off ++ oxp_d5a36c66-4b2f-46e6-96f4-b82debee1a4a/crypt/zone 77234c3d-1877-4d9b-9885-cd70b05f6d3d in service none none off ++ oxp_f99ec996-ec08-4ccf-9a6e-6c5cab440fb4/crypt/zone 04ebd243-fe45-4222-a437-da51aa719c37 in service none none off ++ oxp_faccbb39-d686-42a1-a50a-0eb59ba74a87/crypt/zone b6c84399-0029-4eaa-af95-328e62813332 in service none none off ++ oxp_fdfd067b-1d86-444d-a21f-ed33709f3e4d/crypt/zone d1121115-497a-49a1-8908-2bc330bb5b98 in service none none off ++ oxp_28699448-c5d9-49ea-bf7e-627800efe783/crypt/zone/oxz_ntp_f4a71d99-95e2-484a-ae67-6f98aacee92b 2178dce4-6fba-4b15-b5ce-ece8c54083b5 in service none none off ++ oxp_28699448-c5d9-49ea-bf7e-627800efe783/crypt/debug 9c2fc653-d640-4d06-8fb0-a32ce35309b7 in service 100 GiB none gzip-9 ++ oxp_2c490e96-27f2-4a7f-b440-04d4bfd1e4f6/crypt/debug 3544ad60-7696-44a4-812d-1e830e2de897 in service 100 GiB none gzip-9 ++ oxp_4c3bb1c7-55b6-49b8-b212-516b8f2c26c2/crypt/debug 81d852cd-0bfd-4f3a-98b5-641657f2acda in service 100 GiB none gzip-9 ++ oxp_5db07562-31a8-43e3-b99e-7c7cb89754b7/crypt/debug fa35030d-d14d-4969-9dbf-38dfb7bd4a4d in service 100 GiB none gzip-9 ++ oxp_9451a5d5-b358-4719-b6c1-a0d187da217c/crypt/debug 2110ad2b-9665-4427-b6fb-9059d3d65070 in service 100 GiB none gzip-9 ++ oxp_bb2e2869-9481-483a-bc49-2bdd62f515f5/crypt/debug c4f6dae6-d357-4ad3-becd-5e49c4dcf171 in service 100 GiB none gzip-9 ++ oxp_d5a36c66-4b2f-46e6-96f4-b82debee1a4a/crypt/debug 25c84622-b39a-4c28-9dd5-1f9f33170150 in service 100 GiB none gzip-9 ++ oxp_f99ec996-ec08-4ccf-9a6e-6c5cab440fb4/crypt/debug 1a88aed3-4f65-479a-8677-af5771feade4 in service 100 GiB none gzip-9 ++ oxp_faccbb39-d686-42a1-a50a-0eb59ba74a87/crypt/debug 25eff656-ae3f-42bc-9bfb-8adbc9a1f146 in service 100 GiB none gzip-9 ++ oxp_fdfd067b-1d86-444d-a21f-ed33709f3e4d/crypt/debug ecba8219-9446-4f43-a2fd-098f54ebdfd2 in service 100 GiB none gzip-9 omicron zones at generation 2: diff --git a/nexus/reconfigurator/planning/tests/output/planner_basic_add_sled_3_5.txt b/nexus/reconfigurator/planning/tests/output/planner_basic_add_sled_3_5.txt index 3036b81849a..cafd440f054 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_basic_add_sled_3_5.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_basic_add_sled_3_5.txt @@ -22,56 +22,56 @@ to: blueprint f432fcd5-1284-4058-8b4a-9286a3de6163 datasets at generation 2: - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crucible ea8bb9f4-ef14-4764-8713-299c94aee754 none none off - oxp_31a3bc64-7a3b-496d-b644-785dc44b6e37/crucible 7dcb9cca-dcac-4d95-92d1-f9ee376558ee none none off - oxp_7bb40bd6-9c43-4b63-8337-18313c72aea2/crucible 87f012e5-1979-4d4f-abd7-5004e6a4de4a none none off - oxp_988aa8c2-cb5e-406b-9289-425dc2e5bc3a/crucible 8a017cce-a6e3-4891-80d2-282134012f1f none none off - oxp_ad574c09-2ae0-4534-a2a4-f923ce20ae87/crucible 51734f27-2839-481c-b11d-f59843297269 none none off - oxp_ad91e238-4901-4ff4-a91b-75233c936426/crucible 4ebb5c8c-77cc-4d9a-a66a-aab846d7f4d7 none none off - oxp_ce58d463-d442-4c97-a6b4-f7d98c3fd902/crucible 7e930ce3-f0e6-4188-940a-07dee8fc97cd none none off - oxp_f18f7689-0059-4b79-880e-34faf7a0fe0e/crucible e688234b-9854-4a4e-ae8e-5ec66a323784 none none off - oxp_f1d6cea4-640f-415e-89fe-2b1784ce3db8/crucible 48a12bd9-3d59-4151-adf1-ff703d71977c none none off - oxp_f4a96860-bdeb-4435-bdf5-2a10beb3d44a/crucible 4a0ed488-8ab7-4a8b-90da-ab568081832b none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/clickhouse 87d67ac6-6079-4a4c-960e-44991410a64c none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/internal_dns 31caca18-3e69-4e95-a48e-1a3f9219a304 none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone 8df851fd-0e0c-4069-ad4b-e8669051e42d none none off - oxp_31a3bc64-7a3b-496d-b644-785dc44b6e37/crypt/zone 3c2b2846-d286-4ac7-9001-1dbc92d8ec52 none none off - oxp_7bb40bd6-9c43-4b63-8337-18313c72aea2/crypt/zone d7519dd3-b371-4570-b474-e198d679bc47 none none off - oxp_988aa8c2-cb5e-406b-9289-425dc2e5bc3a/crypt/zone da77f084-5fc9-477a-a5b1-e424f98aa53f none none off - oxp_ad574c09-2ae0-4534-a2a4-f923ce20ae87/crypt/zone 8ffb3c67-d81d-4edc-b4fa-f829bc6d9fb5 none none off - oxp_ad91e238-4901-4ff4-a91b-75233c936426/crypt/zone 12c23a3b-389d-4f4f-950e-f7e36ae44262 none none off - oxp_ce58d463-d442-4c97-a6b4-f7d98c3fd902/crypt/zone 6614568a-a5a5-4db2-80f2-3e405fe35e17 none none off - oxp_f18f7689-0059-4b79-880e-34faf7a0fe0e/crypt/zone a7d4d358-7935-4060-985f-280829de083c none none off - oxp_f1d6cea4-640f-415e-89fe-2b1784ce3db8/crypt/zone 35decedb-c97e-4fde-9ee2-26680ccc7f7e none none off - oxp_f4a96860-bdeb-4435-bdf5-2a10beb3d44a/crypt/zone a0b8487f-b194-4583-ab31-3b02d85af60b none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_clickhouse_98229df2-6faf-45a4-8501-48e1ad25706e 0bda3f6e-6852-4476-8539-8d6315466ccb none none off - oxp_ad574c09-2ae0-4534-a2a4-f923ce20ae87/crypt/zone/oxz_crucible_3384bb31-72f2-46fc-9ada-b324580e2930 707c72de-e19c-4c7b-b2a1-4b028e1026c9 none none off - oxp_f1d6cea4-640f-415e-89fe-2b1784ce3db8/crypt/zone/oxz_crucible_397f4188-68b0-4d82-aea4-5b950f6fc779 8cab65a0-26af-42e7-9f77-10a03096edf0 none none off - oxp_988aa8c2-cb5e-406b-9289-425dc2e5bc3a/crypt/zone/oxz_crucible_4a35beea-a998-4ef1-845c-55d69d35108f 74aacf3e-7c5b-44d5-869c-ae04c9f70bf9 none none off - oxp_ad91e238-4901-4ff4-a91b-75233c936426/crypt/zone/oxz_crucible_5710b56a-a07e-49e2-8dfb-34f1c87ca02e 1e1bfd91-4900-4869-9b17-d6ff94d95301 none none off - oxp_f4a96860-bdeb-4435-bdf5-2a10beb3d44a/crypt/zone/oxz_crucible_62b70007-57c1-4086-8e35-e61443f0c259 b1217132-9894-472e-a763-626798f46cc2 none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_crucible_8ca9bfdc-c3a6-4280-ad34-b5af8fd5187e 14b40d48-c5b1-4e8e-90ec-e374d824204d none none off - oxp_31a3bc64-7a3b-496d-b644-785dc44b6e37/crypt/zone/oxz_crucible_9c927800-ba15-4e84-b80e-781606bec308 eb2960e5-5b89-432f-a384-3009d3b3db5d none none off - oxp_ce58d463-d442-4c97-a6b4-f7d98c3fd902/crypt/zone/oxz_crucible_a7cab59f-59f2-4cb9-b559-551dc6c43aaf 8c16b33b-54f3-453d-a28a-baed87bd45da none none off - oxp_f18f7689-0059-4b79-880e-34faf7a0fe0e/crypt/zone/oxz_crucible_cb67f66d-37e3-40a6-adbd-69962fb6cf73 52036fa0-92ad-4444-8156-01d0b2e9b676 none none off - oxp_7bb40bd6-9c43-4b63-8337-18313c72aea2/crypt/zone/oxz_crucible_da2fc172-8cb2-4d66-a92b-017a97842c27 3aa614f6-5a75-44a0-a950-6adb6c299299 none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_crucible_pantry_be4a1d4a-093f-40e0-8e06-74cc1d786d1b 25438f31-b9e0-499f-a55f-9bfcb0a4194d none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_internal_dns_2a6f89a2-3476-4c3b-97b2-322f00f2fc9a 572f2970-46ed-46e1-b600-d021e080903e none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_nexus_fb07dee1-d608-451b-83eb-4ee913d6e1f8 0e2d27bc-01d7-4afd-82e2-973db6138e70 none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_ntp_d7ffba91-8f9d-4168-89a4-26c6c4370cb0 63e6eeb0-e079-4165-9444-8aac3d50fef3 none none off - oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/debug 9982db80-b762-4c5f-9916-35383d59b6df 100 GiB none gzip-9 - oxp_31a3bc64-7a3b-496d-b644-785dc44b6e37/crypt/debug fd25bb57-dc4b-42ea-a2ab-d6395b38334f 100 GiB none gzip-9 - oxp_7bb40bd6-9c43-4b63-8337-18313c72aea2/crypt/debug 95f111d8-854f-4177-bcff-481e625dd73d 100 GiB none gzip-9 - oxp_988aa8c2-cb5e-406b-9289-425dc2e5bc3a/crypt/debug 38903da8-c23d-4516-b0ca-6036e26c49e4 100 GiB none gzip-9 - oxp_ad574c09-2ae0-4534-a2a4-f923ce20ae87/crypt/debug 216e74e6-691b-45f9-ad7f-037ae799a8c9 100 GiB none gzip-9 - oxp_ad91e238-4901-4ff4-a91b-75233c936426/crypt/debug e598cc97-90c4-403a-b7fc-741f8b93de87 100 GiB none gzip-9 - oxp_ce58d463-d442-4c97-a6b4-f7d98c3fd902/crypt/debug 235746b2-5d3f-4608-9017-2bd8d1521d2b 100 GiB none gzip-9 - oxp_f18f7689-0059-4b79-880e-34faf7a0fe0e/crypt/debug 08fdf2b1-430d-4a5c-adf3-b0a0f323ae9d 100 GiB none gzip-9 - oxp_f1d6cea4-640f-415e-89fe-2b1784ce3db8/crypt/debug ea7fa07f-f47b-4039-a0db-6ab9ca0f0e2c 100 GiB none gzip-9 - oxp_f4a96860-bdeb-4435-bdf5-2a10beb3d44a/crypt/debug 547cb9ee-f196-4dfe-9f2c-aa4b2f114abe 100 GiB none gzip-9 + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crucible ea8bb9f4-ef14-4764-8713-299c94aee754 in service none none off + oxp_31a3bc64-7a3b-496d-b644-785dc44b6e37/crucible 7dcb9cca-dcac-4d95-92d1-f9ee376558ee in service none none off + oxp_7bb40bd6-9c43-4b63-8337-18313c72aea2/crucible 87f012e5-1979-4d4f-abd7-5004e6a4de4a in service none none off + oxp_988aa8c2-cb5e-406b-9289-425dc2e5bc3a/crucible 8a017cce-a6e3-4891-80d2-282134012f1f in service none none off + oxp_ad574c09-2ae0-4534-a2a4-f923ce20ae87/crucible 51734f27-2839-481c-b11d-f59843297269 in service none none off + oxp_ad91e238-4901-4ff4-a91b-75233c936426/crucible 4ebb5c8c-77cc-4d9a-a66a-aab846d7f4d7 in service none none off + oxp_ce58d463-d442-4c97-a6b4-f7d98c3fd902/crucible 7e930ce3-f0e6-4188-940a-07dee8fc97cd in service none none off + oxp_f18f7689-0059-4b79-880e-34faf7a0fe0e/crucible e688234b-9854-4a4e-ae8e-5ec66a323784 in service none none off + oxp_f1d6cea4-640f-415e-89fe-2b1784ce3db8/crucible 48a12bd9-3d59-4151-adf1-ff703d71977c in service none none off + oxp_f4a96860-bdeb-4435-bdf5-2a10beb3d44a/crucible 4a0ed488-8ab7-4a8b-90da-ab568081832b in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/clickhouse 87d67ac6-6079-4a4c-960e-44991410a64c in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/internal_dns 31caca18-3e69-4e95-a48e-1a3f9219a304 in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone 8df851fd-0e0c-4069-ad4b-e8669051e42d in service none none off + oxp_31a3bc64-7a3b-496d-b644-785dc44b6e37/crypt/zone 3c2b2846-d286-4ac7-9001-1dbc92d8ec52 in service none none off + oxp_7bb40bd6-9c43-4b63-8337-18313c72aea2/crypt/zone d7519dd3-b371-4570-b474-e198d679bc47 in service none none off + oxp_988aa8c2-cb5e-406b-9289-425dc2e5bc3a/crypt/zone da77f084-5fc9-477a-a5b1-e424f98aa53f in service none none off + oxp_ad574c09-2ae0-4534-a2a4-f923ce20ae87/crypt/zone 8ffb3c67-d81d-4edc-b4fa-f829bc6d9fb5 in service none none off + oxp_ad91e238-4901-4ff4-a91b-75233c936426/crypt/zone 12c23a3b-389d-4f4f-950e-f7e36ae44262 in service none none off + oxp_ce58d463-d442-4c97-a6b4-f7d98c3fd902/crypt/zone 6614568a-a5a5-4db2-80f2-3e405fe35e17 in service none none off + oxp_f18f7689-0059-4b79-880e-34faf7a0fe0e/crypt/zone a7d4d358-7935-4060-985f-280829de083c in service none none off + oxp_f1d6cea4-640f-415e-89fe-2b1784ce3db8/crypt/zone 35decedb-c97e-4fde-9ee2-26680ccc7f7e in service none none off + oxp_f4a96860-bdeb-4435-bdf5-2a10beb3d44a/crypt/zone a0b8487f-b194-4583-ab31-3b02d85af60b in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_clickhouse_98229df2-6faf-45a4-8501-48e1ad25706e 0bda3f6e-6852-4476-8539-8d6315466ccb in service none none off + oxp_ad574c09-2ae0-4534-a2a4-f923ce20ae87/crypt/zone/oxz_crucible_3384bb31-72f2-46fc-9ada-b324580e2930 707c72de-e19c-4c7b-b2a1-4b028e1026c9 in service none none off + oxp_f1d6cea4-640f-415e-89fe-2b1784ce3db8/crypt/zone/oxz_crucible_397f4188-68b0-4d82-aea4-5b950f6fc779 8cab65a0-26af-42e7-9f77-10a03096edf0 in service none none off + oxp_988aa8c2-cb5e-406b-9289-425dc2e5bc3a/crypt/zone/oxz_crucible_4a35beea-a998-4ef1-845c-55d69d35108f 74aacf3e-7c5b-44d5-869c-ae04c9f70bf9 in service none none off + oxp_ad91e238-4901-4ff4-a91b-75233c936426/crypt/zone/oxz_crucible_5710b56a-a07e-49e2-8dfb-34f1c87ca02e 1e1bfd91-4900-4869-9b17-d6ff94d95301 in service none none off + oxp_f4a96860-bdeb-4435-bdf5-2a10beb3d44a/crypt/zone/oxz_crucible_62b70007-57c1-4086-8e35-e61443f0c259 b1217132-9894-472e-a763-626798f46cc2 in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_crucible_8ca9bfdc-c3a6-4280-ad34-b5af8fd5187e 14b40d48-c5b1-4e8e-90ec-e374d824204d in service none none off + oxp_31a3bc64-7a3b-496d-b644-785dc44b6e37/crypt/zone/oxz_crucible_9c927800-ba15-4e84-b80e-781606bec308 eb2960e5-5b89-432f-a384-3009d3b3db5d in service none none off + oxp_ce58d463-d442-4c97-a6b4-f7d98c3fd902/crypt/zone/oxz_crucible_a7cab59f-59f2-4cb9-b559-551dc6c43aaf 8c16b33b-54f3-453d-a28a-baed87bd45da in service none none off + oxp_f18f7689-0059-4b79-880e-34faf7a0fe0e/crypt/zone/oxz_crucible_cb67f66d-37e3-40a6-adbd-69962fb6cf73 52036fa0-92ad-4444-8156-01d0b2e9b676 in service none none off + oxp_7bb40bd6-9c43-4b63-8337-18313c72aea2/crypt/zone/oxz_crucible_da2fc172-8cb2-4d66-a92b-017a97842c27 3aa614f6-5a75-44a0-a950-6adb6c299299 in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_crucible_pantry_be4a1d4a-093f-40e0-8e06-74cc1d786d1b 25438f31-b9e0-499f-a55f-9bfcb0a4194d in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_internal_dns_2a6f89a2-3476-4c3b-97b2-322f00f2fc9a 572f2970-46ed-46e1-b600-d021e080903e in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_nexus_fb07dee1-d608-451b-83eb-4ee913d6e1f8 0e2d27bc-01d7-4afd-82e2-973db6138e70 in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/zone/oxz_ntp_d7ffba91-8f9d-4168-89a4-26c6c4370cb0 63e6eeb0-e079-4165-9444-8aac3d50fef3 in service none none off + oxp_014eb1e9-04fe-4f36-8339-0a090b053ada/crypt/debug 9982db80-b762-4c5f-9916-35383d59b6df in service 100 GiB none gzip-9 + oxp_31a3bc64-7a3b-496d-b644-785dc44b6e37/crypt/debug fd25bb57-dc4b-42ea-a2ab-d6395b38334f in service 100 GiB none gzip-9 + oxp_7bb40bd6-9c43-4b63-8337-18313c72aea2/crypt/debug 95f111d8-854f-4177-bcff-481e625dd73d in service 100 GiB none gzip-9 + oxp_988aa8c2-cb5e-406b-9289-425dc2e5bc3a/crypt/debug 38903da8-c23d-4516-b0ca-6036e26c49e4 in service 100 GiB none gzip-9 + oxp_ad574c09-2ae0-4534-a2a4-f923ce20ae87/crypt/debug 216e74e6-691b-45f9-ad7f-037ae799a8c9 in service 100 GiB none gzip-9 + oxp_ad91e238-4901-4ff4-a91b-75233c936426/crypt/debug e598cc97-90c4-403a-b7fc-741f8b93de87 in service 100 GiB none gzip-9 + oxp_ce58d463-d442-4c97-a6b4-f7d98c3fd902/crypt/debug 235746b2-5d3f-4608-9017-2bd8d1521d2b in service 100 GiB none gzip-9 + oxp_f18f7689-0059-4b79-880e-34faf7a0fe0e/crypt/debug 08fdf2b1-430d-4a5c-adf3-b0a0f323ae9d in service 100 GiB none gzip-9 + oxp_f1d6cea4-640f-415e-89fe-2b1784ce3db8/crypt/debug ea7fa07f-f47b-4039-a0db-6ab9ca0f0e2c in service 100 GiB none gzip-9 + oxp_f4a96860-bdeb-4435-bdf5-2a10beb3d44a/crypt/debug 547cb9ee-f196-4dfe-9f2c-aa4b2f114abe in service 100 GiB none gzip-9 omicron zones at generation 2: @@ -114,54 +114,54 @@ to: blueprint f432fcd5-1284-4058-8b4a-9286a3de6163 datasets at generation 2: - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crucible 55136aae-73db-46b2-bd32-e26634f865ed none none off - oxp_29758363-6c77-40c3-8740-9c0c64f6e14a/crucible 5c4eda29-ed3e-4dc6-b756-afafa1c216b8 none none off - oxp_3f331c10-7882-48ab-85d9-05108490b55b/crucible 9b5d5293-2546-43f0-b953-73a696cad4bf none none off - oxp_5152d1aa-9045-4e06-9ef6-6eadac3696e4/crucible 74c65a92-1d4a-44cc-9a55-cd540e9fb57e none none off - oxp_5c0dd424-d905-4fc5-a73c-36254fdd470c/crucible cc25055b-483e-46ab-a5bf-1d8838b846fd none none off - oxp_794df76f-bca0-4635-9eb6-773ad0108f7e/crucible 8270e505-beff-480a-955b-bf96c4b1a9a3 none none off - oxp_9024d350-38a7-459b-8550-3b2c4a88b5c1/crucible ea234d9d-291b-4adf-9d96-48b7945c2892 none none off - oxp_95e86080-e162-4980-a589-db6bb1a95ca7/crucible d8d9a6d4-f6be-4044-8eac-b994aa166053 none none off - oxp_d55d36d7-df92-4615-944d-440a1f8b5001/crucible 64955a3e-2059-4d16-aee4-f63f9362b554 none none off - oxp_db6686c8-2dd9-4032-8444-2a06b43baa68/crucible 863c76ac-732e-4d10-b7a3-1d6ba02dc1f5 none none off - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/internal_dns b4df380c-6cca-41c1-b79c-45671067d459 none none off - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone 9bcac944-9866-4251-b333-1cbdc137a03e none none off - oxp_29758363-6c77-40c3-8740-9c0c64f6e14a/crypt/zone 0557de8a-45cf-44a0-a39d-4a7095e9045b none none off - oxp_3f331c10-7882-48ab-85d9-05108490b55b/crypt/zone 5f5e1e10-1561-4556-aac1-6b6285df5cb2 none none off - oxp_5152d1aa-9045-4e06-9ef6-6eadac3696e4/crypt/zone 52d9152d-e80a-455e-b24a-70b5d2ffc372 none none off - oxp_5c0dd424-d905-4fc5-a73c-36254fdd470c/crypt/zone 1b990bb0-ea73-430c-bafa-6eb5647af125 none none off - oxp_794df76f-bca0-4635-9eb6-773ad0108f7e/crypt/zone 4fc058ac-95d8-4ea4-808c-6b976e95449e none none off - oxp_9024d350-38a7-459b-8550-3b2c4a88b5c1/crypt/zone 208cd4b7-be74-4187-a4e3-21e518bc92a6 none none off - oxp_95e86080-e162-4980-a589-db6bb1a95ca7/crypt/zone bf66b843-7c47-4e46-b629-267111de97b5 none none off - oxp_d55d36d7-df92-4615-944d-440a1f8b5001/crypt/zone 5672e912-aa12-4614-b79b-5fcf548e9d96 none none off - oxp_db6686c8-2dd9-4032-8444-2a06b43baa68/crypt/zone 99d7b142-b462-4a67-b84e-f3fc79e761fd none none off - oxp_95e86080-e162-4980-a589-db6bb1a95ca7/crypt/zone/oxz_crucible_1437bb47-a2d3-48e9-8902-021ff5057d26 3dd86436-a934-44a8-97b2-1848ab6ebbc9 none none off - oxp_5c0dd424-d905-4fc5-a73c-36254fdd470c/crypt/zone/oxz_crucible_31f49108-cdda-4659-bf24-319bf99a9c20 faa7fe52-a532-4784-84f3-376dc8334fdd none none off - oxp_29758363-6c77-40c3-8740-9c0c64f6e14a/crypt/zone/oxz_crucible_5152e5e7-8615-407d-beed-37fd03852ad6 5def9f9d-7e1f-4ef0-94cf-b26f21e6da07 none none off - oxp_3f331c10-7882-48ab-85d9-05108490b55b/crypt/zone/oxz_crucible_6593648a-53f3-4a0f-b902-ef6cd7eab43b 9651f8ed-ae45-476c-bca4-42ebe6ee1618 none none off - oxp_d55d36d7-df92-4615-944d-440a1f8b5001/crypt/zone/oxz_crucible_754bae61-cbff-402f-b250-91bec499b449 8e72b070-ef13-4082-bcf8-2c54488a4ae1 none none off - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_crucible_8f316745-d46d-47cb-8c7e-678fd9021c40 d508ecc2-baf5-4299-9799-e6d30f83663e none none off - oxp_9024d350-38a7-459b-8550-3b2c4a88b5c1/crypt/zone/oxz_crucible_9fdb739d-b149-4f8f-b488-b97d16ea284a 96dc8dcd-700b-4dd7-8970-568e91b93948 none none off - oxp_db6686c8-2dd9-4032-8444-2a06b43baa68/crypt/zone/oxz_crucible_b23471ff-b35a-4919-aa3f-3c3683fa3210 646e79ac-9828-4a8d-8173-e385f5e65a15 none none off - oxp_794df76f-bca0-4635-9eb6-773ad0108f7e/crypt/zone/oxz_crucible_fa8963b6-dad1-4cf8-9243-c77b3f86d654 2dd82bf7-cad0-4725-ba7d-0cf40b725b39 none none off - oxp_5152d1aa-9045-4e06-9ef6-6eadac3696e4/crypt/zone/oxz_crucible_ff5bf6ea-ab3e-40c5-a9a5-cb2bc89de9c8 ead9603d-c1ea-4ea8-9ca7-f3bc31718458 none none off - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_crucible_pantry_634fc0b7-9f95-494d-939b-28819cbcaa2b be2863b0-0d23-4fd4-92e8-ffc4184e5742 none none off - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_internal_dns_92628102-eef4-4000-a061-1df796db3806 998bf38c-b6ec-4ddd-80ac-59fc1ee30ca2 none none off - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_nexus_7a3ea24a-85f4-4aad-a935-4e7b22766985 73e12d19-7957-4c44-b3e0-fef8d2ad4826 none none off - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_ntp_edd3fb4a-6ea7-49a5-82fb-444dfcf6fcc5 305f5727-4d83-4282-9efe-f776ad63aef9 none none off - oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/debug b3261747-8c28-4c02-8ab7-be1b8cab03fe 100 GiB none gzip-9 - oxp_29758363-6c77-40c3-8740-9c0c64f6e14a/crypt/debug be79f715-8cc9-475c-81dd-f3a8141df986 100 GiB none gzip-9 - oxp_3f331c10-7882-48ab-85d9-05108490b55b/crypt/debug b0f40911-5074-4dad-bcf9-269e20793f6f 100 GiB none gzip-9 - oxp_5152d1aa-9045-4e06-9ef6-6eadac3696e4/crypt/debug 1f81c8ba-d0b2-4c24-b8b8-90a5a3148b2a 100 GiB none gzip-9 - oxp_5c0dd424-d905-4fc5-a73c-36254fdd470c/crypt/debug b489b3a7-eb94-481f-805d-c93958f566dd 100 GiB none gzip-9 - oxp_794df76f-bca0-4635-9eb6-773ad0108f7e/crypt/debug 903e2867-5fc0-487b-9d9c-9afe60731a6c 100 GiB none gzip-9 - oxp_9024d350-38a7-459b-8550-3b2c4a88b5c1/crypt/debug a02260de-3336-4cbf-ba45-ff79586b40fa 100 GiB none gzip-9 - oxp_95e86080-e162-4980-a589-db6bb1a95ca7/crypt/debug 667d664c-c5a1-4b77-a54c-6bbb1bcc2096 100 GiB none gzip-9 - oxp_d55d36d7-df92-4615-944d-440a1f8b5001/crypt/debug 4f4ad767-8887-4892-b6c7-5bc652f3d673 100 GiB none gzip-9 - oxp_db6686c8-2dd9-4032-8444-2a06b43baa68/crypt/debug f5b987f9-0a34-4394-8fc5-2ee12bf3e9bf 100 GiB none gzip-9 + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crucible 55136aae-73db-46b2-bd32-e26634f865ed in service none none off + oxp_29758363-6c77-40c3-8740-9c0c64f6e14a/crucible 5c4eda29-ed3e-4dc6-b756-afafa1c216b8 in service none none off + oxp_3f331c10-7882-48ab-85d9-05108490b55b/crucible 9b5d5293-2546-43f0-b953-73a696cad4bf in service none none off + oxp_5152d1aa-9045-4e06-9ef6-6eadac3696e4/crucible 74c65a92-1d4a-44cc-9a55-cd540e9fb57e in service none none off + oxp_5c0dd424-d905-4fc5-a73c-36254fdd470c/crucible cc25055b-483e-46ab-a5bf-1d8838b846fd in service none none off + oxp_794df76f-bca0-4635-9eb6-773ad0108f7e/crucible 8270e505-beff-480a-955b-bf96c4b1a9a3 in service none none off + oxp_9024d350-38a7-459b-8550-3b2c4a88b5c1/crucible ea234d9d-291b-4adf-9d96-48b7945c2892 in service none none off + oxp_95e86080-e162-4980-a589-db6bb1a95ca7/crucible d8d9a6d4-f6be-4044-8eac-b994aa166053 in service none none off + oxp_d55d36d7-df92-4615-944d-440a1f8b5001/crucible 64955a3e-2059-4d16-aee4-f63f9362b554 in service none none off + oxp_db6686c8-2dd9-4032-8444-2a06b43baa68/crucible 863c76ac-732e-4d10-b7a3-1d6ba02dc1f5 in service none none off + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/internal_dns b4df380c-6cca-41c1-b79c-45671067d459 in service none none off + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone 9bcac944-9866-4251-b333-1cbdc137a03e in service none none off + oxp_29758363-6c77-40c3-8740-9c0c64f6e14a/crypt/zone 0557de8a-45cf-44a0-a39d-4a7095e9045b in service none none off + oxp_3f331c10-7882-48ab-85d9-05108490b55b/crypt/zone 5f5e1e10-1561-4556-aac1-6b6285df5cb2 in service none none off + oxp_5152d1aa-9045-4e06-9ef6-6eadac3696e4/crypt/zone 52d9152d-e80a-455e-b24a-70b5d2ffc372 in service none none off + oxp_5c0dd424-d905-4fc5-a73c-36254fdd470c/crypt/zone 1b990bb0-ea73-430c-bafa-6eb5647af125 in service none none off + oxp_794df76f-bca0-4635-9eb6-773ad0108f7e/crypt/zone 4fc058ac-95d8-4ea4-808c-6b976e95449e in service none none off + oxp_9024d350-38a7-459b-8550-3b2c4a88b5c1/crypt/zone 208cd4b7-be74-4187-a4e3-21e518bc92a6 in service none none off + oxp_95e86080-e162-4980-a589-db6bb1a95ca7/crypt/zone bf66b843-7c47-4e46-b629-267111de97b5 in service none none off + oxp_d55d36d7-df92-4615-944d-440a1f8b5001/crypt/zone 5672e912-aa12-4614-b79b-5fcf548e9d96 in service none none off + oxp_db6686c8-2dd9-4032-8444-2a06b43baa68/crypt/zone 99d7b142-b462-4a67-b84e-f3fc79e761fd in service none none off + oxp_95e86080-e162-4980-a589-db6bb1a95ca7/crypt/zone/oxz_crucible_1437bb47-a2d3-48e9-8902-021ff5057d26 3dd86436-a934-44a8-97b2-1848ab6ebbc9 in service none none off + oxp_5c0dd424-d905-4fc5-a73c-36254fdd470c/crypt/zone/oxz_crucible_31f49108-cdda-4659-bf24-319bf99a9c20 faa7fe52-a532-4784-84f3-376dc8334fdd in service none none off + oxp_29758363-6c77-40c3-8740-9c0c64f6e14a/crypt/zone/oxz_crucible_5152e5e7-8615-407d-beed-37fd03852ad6 5def9f9d-7e1f-4ef0-94cf-b26f21e6da07 in service none none off + oxp_3f331c10-7882-48ab-85d9-05108490b55b/crypt/zone/oxz_crucible_6593648a-53f3-4a0f-b902-ef6cd7eab43b 9651f8ed-ae45-476c-bca4-42ebe6ee1618 in service none none off + oxp_d55d36d7-df92-4615-944d-440a1f8b5001/crypt/zone/oxz_crucible_754bae61-cbff-402f-b250-91bec499b449 8e72b070-ef13-4082-bcf8-2c54488a4ae1 in service none none off + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_crucible_8f316745-d46d-47cb-8c7e-678fd9021c40 d508ecc2-baf5-4299-9799-e6d30f83663e in service none none off + oxp_9024d350-38a7-459b-8550-3b2c4a88b5c1/crypt/zone/oxz_crucible_9fdb739d-b149-4f8f-b488-b97d16ea284a 96dc8dcd-700b-4dd7-8970-568e91b93948 in service none none off + oxp_db6686c8-2dd9-4032-8444-2a06b43baa68/crypt/zone/oxz_crucible_b23471ff-b35a-4919-aa3f-3c3683fa3210 646e79ac-9828-4a8d-8173-e385f5e65a15 in service none none off + oxp_794df76f-bca0-4635-9eb6-773ad0108f7e/crypt/zone/oxz_crucible_fa8963b6-dad1-4cf8-9243-c77b3f86d654 2dd82bf7-cad0-4725-ba7d-0cf40b725b39 in service none none off + oxp_5152d1aa-9045-4e06-9ef6-6eadac3696e4/crypt/zone/oxz_crucible_ff5bf6ea-ab3e-40c5-a9a5-cb2bc89de9c8 ead9603d-c1ea-4ea8-9ca7-f3bc31718458 in service none none off + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_crucible_pantry_634fc0b7-9f95-494d-939b-28819cbcaa2b be2863b0-0d23-4fd4-92e8-ffc4184e5742 in service none none off + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_internal_dns_92628102-eef4-4000-a061-1df796db3806 998bf38c-b6ec-4ddd-80ac-59fc1ee30ca2 in service none none off + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_nexus_7a3ea24a-85f4-4aad-a935-4e7b22766985 73e12d19-7957-4c44-b3e0-fef8d2ad4826 in service none none off + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/zone/oxz_ntp_edd3fb4a-6ea7-49a5-82fb-444dfcf6fcc5 305f5727-4d83-4282-9efe-f776ad63aef9 in service none none off + oxp_12057b4a-0b06-4f70-ba22-336de2385bfe/crypt/debug b3261747-8c28-4c02-8ab7-be1b8cab03fe in service 100 GiB none gzip-9 + oxp_29758363-6c77-40c3-8740-9c0c64f6e14a/crypt/debug be79f715-8cc9-475c-81dd-f3a8141df986 in service 100 GiB none gzip-9 + oxp_3f331c10-7882-48ab-85d9-05108490b55b/crypt/debug b0f40911-5074-4dad-bcf9-269e20793f6f in service 100 GiB none gzip-9 + oxp_5152d1aa-9045-4e06-9ef6-6eadac3696e4/crypt/debug 1f81c8ba-d0b2-4c24-b8b8-90a5a3148b2a in service 100 GiB none gzip-9 + oxp_5c0dd424-d905-4fc5-a73c-36254fdd470c/crypt/debug b489b3a7-eb94-481f-805d-c93958f566dd in service 100 GiB none gzip-9 + oxp_794df76f-bca0-4635-9eb6-773ad0108f7e/crypt/debug 903e2867-5fc0-487b-9d9c-9afe60731a6c in service 100 GiB none gzip-9 + oxp_9024d350-38a7-459b-8550-3b2c4a88b5c1/crypt/debug a02260de-3336-4cbf-ba45-ff79586b40fa in service 100 GiB none gzip-9 + oxp_95e86080-e162-4980-a589-db6bb1a95ca7/crypt/debug 667d664c-c5a1-4b77-a54c-6bbb1bcc2096 in service 100 GiB none gzip-9 + oxp_d55d36d7-df92-4615-944d-440a1f8b5001/crypt/debug 4f4ad767-8887-4892-b6c7-5bc652f3d673 in service 100 GiB none gzip-9 + oxp_db6686c8-2dd9-4032-8444-2a06b43baa68/crypt/debug f5b987f9-0a34-4394-8fc5-2ee12bf3e9bf in service 100 GiB none gzip-9 omicron zones at generation 2: @@ -203,54 +203,54 @@ to: blueprint f432fcd5-1284-4058-8b4a-9286a3de6163 datasets at generation 2: - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crucible 852963f5-4c4b-4bd9-a5b6-25ea416c25fe none none off - oxp_32456d15-f5b6-4efc-90c8-dbba979b69cb/crucible d37faff5-a0a8-4b60-bb33-508c478fe1c9 none none off - oxp_416fe9f9-5161-4b0f-9e11-c9d81563ded5/crucible c096ba5f-adbf-498d-8ea5-ba736454d9fb none none off - oxp_4c68800e-23f8-485b-b251-628fd151e445/crucible 56661c11-0041-4ffd-8a0c-72b5fc0486b9 none none off - oxp_9dd87c4d-5fb4-475a-86fa-c0da81a3e00a/crucible b6a3f4cf-27f4-4ba8-b063-b4b3c7b03cc3 none none off - oxp_be93a517-445e-46c2-aa21-3dc526d4a413/crucible f32a5631-dd04-4e2d-a9f9-b5974253601d none none off - oxp_d9344e2b-84d2-4392-84ab-41b86ed02237/crucible a15aacbb-53de-45e0-a646-a88817c929c6 none none off - oxp_eab188d0-b34a-4673-b254-12e705597654/crucible 932f321c-10ae-476a-9721-33b5e76fb989 none none off - oxp_f1e0386f-11b6-4cdf-8250-826d256db6b5/crucible ad47c2f1-68ea-413f-ad9e-0975d02a0e11 none none off - oxp_f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b/crucible 9861aeea-9a0c-4fc7-b3d7-e80f3e5c88a5 none none off - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/internal_dns a8eea986-61ba-4723-a97c-61f911210031 none none off - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone 3938e220-b204-4f50-bd73-9c835eb4dea7 none none off - oxp_32456d15-f5b6-4efc-90c8-dbba979b69cb/crypt/zone ba8d7bd5-7282-468c-bba6-28462b5400ff none none off - oxp_416fe9f9-5161-4b0f-9e11-c9d81563ded5/crypt/zone 57497a15-47dd-4eca-a52a-1ee1a3a005b4 none none off - oxp_4c68800e-23f8-485b-b251-628fd151e445/crypt/zone 44a73f30-9601-4fbd-9699-deb600252cb1 none none off - oxp_9dd87c4d-5fb4-475a-86fa-c0da81a3e00a/crypt/zone 6ce8fc11-2f6e-4c7a-b026-d2f05ee49c8f none none off - oxp_be93a517-445e-46c2-aa21-3dc526d4a413/crypt/zone babe6a59-94f6-4fbb-b49e-2fda486cc39e none none off - oxp_d9344e2b-84d2-4392-84ab-41b86ed02237/crypt/zone 69686d88-8e89-4137-9377-3e1b61995d79 none none off - oxp_eab188d0-b34a-4673-b254-12e705597654/crypt/zone f1a436b2-d773-4b72-ad3a-fc5d03ae9855 none none off - oxp_f1e0386f-11b6-4cdf-8250-826d256db6b5/crypt/zone 8196e6fd-4094-4bc9-ad43-1d774de79b25 none none off - oxp_f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b/crypt/zone de91df2d-b85b-4300-82f4-70ee5d0c8f71 none none off - oxp_32456d15-f5b6-4efc-90c8-dbba979b69cb/crypt/zone/oxz_crucible_3b49c2c6-0b0b-4a11-be95-bf94c1cb54a8 e033c975-ab2f-4d39-96e1-02fc6d95e58f none none off - oxp_d9344e2b-84d2-4392-84ab-41b86ed02237/crypt/zone/oxz_crucible_4c65501d-a08d-4fe5-9c78-2694ce6b3a43 28c2eb82-e779-4629-91af-633e4460cd21 none none off - oxp_eab188d0-b34a-4673-b254-12e705597654/crypt/zone/oxz_crucible_60e74b27-a7d7-475e-b5ce-2a92eff4fa63 362a51ca-7116-4df3-96bd-5383c32b33f3 none none off - oxp_f1e0386f-11b6-4cdf-8250-826d256db6b5/crypt/zone/oxz_crucible_68f44e7e-8231-40c0-861e-2f4d0c2eb392 1db171be-4a44-473a-bfa0-c9dda78fed77 none none off - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_crucible_74fc3000-c4b7-4687-88b5-a27584b45434 00218e6a-5e1b-450c-ad38-624ad37d2fc4 none none off - oxp_f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b/crypt/zone/oxz_crucible_83ae0625-2e61-4637-a1f9-473b21b94f72 418a8d5c-fbe8-46c0-b260-e77eb2235105 none none off - oxp_416fe9f9-5161-4b0f-9e11-c9d81563ded5/crypt/zone/oxz_crucible_9b462d74-c05a-4a7e-8d24-449c848a7b13 bea24fa2-353f-4c13-844d-3ce58d682eb7 none none off - oxp_be93a517-445e-46c2-aa21-3dc526d4a413/crypt/zone/oxz_crucible_a9ed9f72-e57d-4092-ab0e-bb2000a5459e dda0482e-cffe-4230-9370-9eebfb9c7121 none none off - oxp_4c68800e-23f8-485b-b251-628fd151e445/crypt/zone/oxz_crucible_d84bc314-4895-4331-8afb-22bffdd56699 17f7d94a-7734-4b3b-a108-dc11b114610e none none off - oxp_9dd87c4d-5fb4-475a-86fa-c0da81a3e00a/crypt/zone/oxz_crucible_f1f03b7d-916e-4c5f-8906-1e18e498184d 3f1fb9c9-8a05-44fc-af26-eb71bec3b890 none none off - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_crucible_pantry_ecdc7438-a007-4558-96b3-65bdab21a8a9 f48c22cc-5ff7-4170-bdbd-bd082c882de3 none none off - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_internal_dns_c1049e2e-7269-4de0-b96e-2e9f8edc90ea 67f5eef3-2c29-4a5c-9664-81dbd5ed55a5 none none off - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_nexus_785868d0-a003-4860-acc1-9beee9f39816 2a2e9b25-83b8-4bc3-b934-723c947f56d7 none none off - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_ntp_d5b390d3-7280-4d2b-b670-340f91d7ebd7 7b3fae75-9421-4a8d-8524-b17a540f994e none none off - oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/debug 5eb19f06-e5e9-4b96-b1c3-84355460b2ea 100 GiB none gzip-9 - oxp_32456d15-f5b6-4efc-90c8-dbba979b69cb/crypt/debug 89ab2d4a-101f-46c5-8bb8-2c93dbe2d020 100 GiB none gzip-9 - oxp_416fe9f9-5161-4b0f-9e11-c9d81563ded5/crypt/debug 12f242f1-44e6-449d-9dfd-b4c5c1bb5ddf 100 GiB none gzip-9 - oxp_4c68800e-23f8-485b-b251-628fd151e445/crypt/debug 45d68f02-6f5a-4c8b-9a59-e4554ebbeff7 100 GiB none gzip-9 - oxp_9dd87c4d-5fb4-475a-86fa-c0da81a3e00a/crypt/debug e0e621f0-62f6-4425-a4b0-ff659c63ea11 100 GiB none gzip-9 - oxp_be93a517-445e-46c2-aa21-3dc526d4a413/crypt/debug b90bbe6c-15d2-4313-9fce-c1b9ccdf38d3 100 GiB none gzip-9 - oxp_d9344e2b-84d2-4392-84ab-41b86ed02237/crypt/debug 3bae870d-ae7b-4e95-b4ea-419ba251839b 100 GiB none gzip-9 - oxp_eab188d0-b34a-4673-b254-12e705597654/crypt/debug b7284180-362b-42ba-b970-90c27a8468c5 100 GiB none gzip-9 - oxp_f1e0386f-11b6-4cdf-8250-826d256db6b5/crypt/debug d814aea1-475f-44c2-8dcc-e2cd2d335bf9 100 GiB none gzip-9 - oxp_f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b/crypt/debug fdd77b3a-5ec9-4e1a-bc62-379baa7c5552 100 GiB none gzip-9 + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crucible 852963f5-4c4b-4bd9-a5b6-25ea416c25fe in service none none off + oxp_32456d15-f5b6-4efc-90c8-dbba979b69cb/crucible d37faff5-a0a8-4b60-bb33-508c478fe1c9 in service none none off + oxp_416fe9f9-5161-4b0f-9e11-c9d81563ded5/crucible c096ba5f-adbf-498d-8ea5-ba736454d9fb in service none none off + oxp_4c68800e-23f8-485b-b251-628fd151e445/crucible 56661c11-0041-4ffd-8a0c-72b5fc0486b9 in service none none off + oxp_9dd87c4d-5fb4-475a-86fa-c0da81a3e00a/crucible b6a3f4cf-27f4-4ba8-b063-b4b3c7b03cc3 in service none none off + oxp_be93a517-445e-46c2-aa21-3dc526d4a413/crucible f32a5631-dd04-4e2d-a9f9-b5974253601d in service none none off + oxp_d9344e2b-84d2-4392-84ab-41b86ed02237/crucible a15aacbb-53de-45e0-a646-a88817c929c6 in service none none off + oxp_eab188d0-b34a-4673-b254-12e705597654/crucible 932f321c-10ae-476a-9721-33b5e76fb989 in service none none off + oxp_f1e0386f-11b6-4cdf-8250-826d256db6b5/crucible ad47c2f1-68ea-413f-ad9e-0975d02a0e11 in service none none off + oxp_f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b/crucible 9861aeea-9a0c-4fc7-b3d7-e80f3e5c88a5 in service none none off + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/internal_dns a8eea986-61ba-4723-a97c-61f911210031 in service none none off + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone 3938e220-b204-4f50-bd73-9c835eb4dea7 in service none none off + oxp_32456d15-f5b6-4efc-90c8-dbba979b69cb/crypt/zone ba8d7bd5-7282-468c-bba6-28462b5400ff in service none none off + oxp_416fe9f9-5161-4b0f-9e11-c9d81563ded5/crypt/zone 57497a15-47dd-4eca-a52a-1ee1a3a005b4 in service none none off + oxp_4c68800e-23f8-485b-b251-628fd151e445/crypt/zone 44a73f30-9601-4fbd-9699-deb600252cb1 in service none none off + oxp_9dd87c4d-5fb4-475a-86fa-c0da81a3e00a/crypt/zone 6ce8fc11-2f6e-4c7a-b026-d2f05ee49c8f in service none none off + oxp_be93a517-445e-46c2-aa21-3dc526d4a413/crypt/zone babe6a59-94f6-4fbb-b49e-2fda486cc39e in service none none off + oxp_d9344e2b-84d2-4392-84ab-41b86ed02237/crypt/zone 69686d88-8e89-4137-9377-3e1b61995d79 in service none none off + oxp_eab188d0-b34a-4673-b254-12e705597654/crypt/zone f1a436b2-d773-4b72-ad3a-fc5d03ae9855 in service none none off + oxp_f1e0386f-11b6-4cdf-8250-826d256db6b5/crypt/zone 8196e6fd-4094-4bc9-ad43-1d774de79b25 in service none none off + oxp_f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b/crypt/zone de91df2d-b85b-4300-82f4-70ee5d0c8f71 in service none none off + oxp_32456d15-f5b6-4efc-90c8-dbba979b69cb/crypt/zone/oxz_crucible_3b49c2c6-0b0b-4a11-be95-bf94c1cb54a8 e033c975-ab2f-4d39-96e1-02fc6d95e58f in service none none off + oxp_d9344e2b-84d2-4392-84ab-41b86ed02237/crypt/zone/oxz_crucible_4c65501d-a08d-4fe5-9c78-2694ce6b3a43 28c2eb82-e779-4629-91af-633e4460cd21 in service none none off + oxp_eab188d0-b34a-4673-b254-12e705597654/crypt/zone/oxz_crucible_60e74b27-a7d7-475e-b5ce-2a92eff4fa63 362a51ca-7116-4df3-96bd-5383c32b33f3 in service none none off + oxp_f1e0386f-11b6-4cdf-8250-826d256db6b5/crypt/zone/oxz_crucible_68f44e7e-8231-40c0-861e-2f4d0c2eb392 1db171be-4a44-473a-bfa0-c9dda78fed77 in service none none off + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_crucible_74fc3000-c4b7-4687-88b5-a27584b45434 00218e6a-5e1b-450c-ad38-624ad37d2fc4 in service none none off + oxp_f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b/crypt/zone/oxz_crucible_83ae0625-2e61-4637-a1f9-473b21b94f72 418a8d5c-fbe8-46c0-b260-e77eb2235105 in service none none off + oxp_416fe9f9-5161-4b0f-9e11-c9d81563ded5/crypt/zone/oxz_crucible_9b462d74-c05a-4a7e-8d24-449c848a7b13 bea24fa2-353f-4c13-844d-3ce58d682eb7 in service none none off + oxp_be93a517-445e-46c2-aa21-3dc526d4a413/crypt/zone/oxz_crucible_a9ed9f72-e57d-4092-ab0e-bb2000a5459e dda0482e-cffe-4230-9370-9eebfb9c7121 in service none none off + oxp_4c68800e-23f8-485b-b251-628fd151e445/crypt/zone/oxz_crucible_d84bc314-4895-4331-8afb-22bffdd56699 17f7d94a-7734-4b3b-a108-dc11b114610e in service none none off + oxp_9dd87c4d-5fb4-475a-86fa-c0da81a3e00a/crypt/zone/oxz_crucible_f1f03b7d-916e-4c5f-8906-1e18e498184d 3f1fb9c9-8a05-44fc-af26-eb71bec3b890 in service none none off + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_crucible_pantry_ecdc7438-a007-4558-96b3-65bdab21a8a9 f48c22cc-5ff7-4170-bdbd-bd082c882de3 in service none none off + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_internal_dns_c1049e2e-7269-4de0-b96e-2e9f8edc90ea 67f5eef3-2c29-4a5c-9664-81dbd5ed55a5 in service none none off + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_nexus_785868d0-a003-4860-acc1-9beee9f39816 2a2e9b25-83b8-4bc3-b934-723c947f56d7 in service none none off + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/zone/oxz_ntp_d5b390d3-7280-4d2b-b670-340f91d7ebd7 7b3fae75-9421-4a8d-8524-b17a540f994e in service none none off + oxp_2a94863d-16e2-4535-973b-e98dd47fd18d/crypt/debug 5eb19f06-e5e9-4b96-b1c3-84355460b2ea in service 100 GiB none gzip-9 + oxp_32456d15-f5b6-4efc-90c8-dbba979b69cb/crypt/debug 89ab2d4a-101f-46c5-8bb8-2c93dbe2d020 in service 100 GiB none gzip-9 + oxp_416fe9f9-5161-4b0f-9e11-c9d81563ded5/crypt/debug 12f242f1-44e6-449d-9dfd-b4c5c1bb5ddf in service 100 GiB none gzip-9 + oxp_4c68800e-23f8-485b-b251-628fd151e445/crypt/debug 45d68f02-6f5a-4c8b-9a59-e4554ebbeff7 in service 100 GiB none gzip-9 + oxp_9dd87c4d-5fb4-475a-86fa-c0da81a3e00a/crypt/debug e0e621f0-62f6-4425-a4b0-ff659c63ea11 in service 100 GiB none gzip-9 + oxp_be93a517-445e-46c2-aa21-3dc526d4a413/crypt/debug b90bbe6c-15d2-4313-9fce-c1b9ccdf38d3 in service 100 GiB none gzip-9 + oxp_d9344e2b-84d2-4392-84ab-41b86ed02237/crypt/debug 3bae870d-ae7b-4e95-b4ea-419ba251839b in service 100 GiB none gzip-9 + oxp_eab188d0-b34a-4673-b254-12e705597654/crypt/debug b7284180-362b-42ba-b970-90c27a8468c5 in service 100 GiB none gzip-9 + oxp_f1e0386f-11b6-4cdf-8250-826d256db6b5/crypt/debug d814aea1-475f-44c2-8dcc-e2cd2d335bf9 in service 100 GiB none gzip-9 + oxp_f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b/crypt/debug fdd77b3a-5ec9-4e1a-bc62-379baa7c5552 in service 100 GiB none gzip-9 omicron zones at generation 2: @@ -294,50 +294,50 @@ to: blueprint f432fcd5-1284-4058-8b4a-9286a3de6163 datasets generation 2 -> 3: - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_28699448-c5d9-49ea-bf7e-627800efe783/crypt/zone bd515f95-ef75-4243-b279-5448e8c56693 none none off - oxp_2c490e96-27f2-4a7f-b440-04d4bfd1e4f6/crypt/zone a5ebe3b2-007d-4cb6-a01b-519eb696dd51 none none off - oxp_4c3bb1c7-55b6-49b8-b212-516b8f2c26c2/crypt/zone 292da7cf-54f6-4d8c-a941-eebe5d47fe50 none none off - oxp_5db07562-31a8-43e3-b99e-7c7cb89754b7/crypt/zone 58573ab1-3d00-4251-9e32-1c8c94d41689 none none off - oxp_9451a5d5-b358-4719-b6c1-a0d187da217c/crypt/zone 823a6464-7317-41c4-88d1-317e6156da3b none none off - oxp_bb2e2869-9481-483a-bc49-2bdd62f515f5/crypt/zone edf02038-6f07-4788-80f7-1c9ef4537956 none none off - oxp_d5a36c66-4b2f-46e6-96f4-b82debee1a4a/crypt/zone 77234c3d-1877-4d9b-9885-cd70b05f6d3d none none off - oxp_f99ec996-ec08-4ccf-9a6e-6c5cab440fb4/crypt/zone 04ebd243-fe45-4222-a437-da51aa719c37 none none off - oxp_faccbb39-d686-42a1-a50a-0eb59ba74a87/crypt/zone b6c84399-0029-4eaa-af95-328e62813332 none none off - oxp_fdfd067b-1d86-444d-a21f-ed33709f3e4d/crypt/zone d1121115-497a-49a1-8908-2bc330bb5b98 none none off - oxp_28699448-c5d9-49ea-bf7e-627800efe783/crypt/zone/oxz_ntp_f4a71d99-95e2-484a-ae67-6f98aacee92b 2178dce4-6fba-4b15-b5ce-ece8c54083b5 none none off - oxp_28699448-c5d9-49ea-bf7e-627800efe783/crypt/debug 9c2fc653-d640-4d06-8fb0-a32ce35309b7 100 GiB none gzip-9 - oxp_2c490e96-27f2-4a7f-b440-04d4bfd1e4f6/crypt/debug 3544ad60-7696-44a4-812d-1e830e2de897 100 GiB none gzip-9 - oxp_4c3bb1c7-55b6-49b8-b212-516b8f2c26c2/crypt/debug 81d852cd-0bfd-4f3a-98b5-641657f2acda 100 GiB none gzip-9 - oxp_5db07562-31a8-43e3-b99e-7c7cb89754b7/crypt/debug fa35030d-d14d-4969-9dbf-38dfb7bd4a4d 100 GiB none gzip-9 - oxp_9451a5d5-b358-4719-b6c1-a0d187da217c/crypt/debug 2110ad2b-9665-4427-b6fb-9059d3d65070 100 GiB none gzip-9 - oxp_bb2e2869-9481-483a-bc49-2bdd62f515f5/crypt/debug c4f6dae6-d357-4ad3-becd-5e49c4dcf171 100 GiB none gzip-9 - oxp_d5a36c66-4b2f-46e6-96f4-b82debee1a4a/crypt/debug 25c84622-b39a-4c28-9dd5-1f9f33170150 100 GiB none gzip-9 - oxp_f99ec996-ec08-4ccf-9a6e-6c5cab440fb4/crypt/debug 1a88aed3-4f65-479a-8677-af5771feade4 100 GiB none gzip-9 - oxp_faccbb39-d686-42a1-a50a-0eb59ba74a87/crypt/debug 25eff656-ae3f-42bc-9bfb-8adbc9a1f146 100 GiB none gzip-9 - oxp_fdfd067b-1d86-444d-a21f-ed33709f3e4d/crypt/debug ecba8219-9446-4f43-a2fd-098f54ebdfd2 100 GiB none gzip-9 -+ oxp_28699448-c5d9-49ea-bf7e-627800efe783/crucible 3b11b123-120d-49fd-a9fc-84527b75580d none none off -+ oxp_2c490e96-27f2-4a7f-b440-04d4bfd1e4f6/crucible eaff368e-4ef0-4afd-aaec-1a3d4f296c10 none none off -+ oxp_4c3bb1c7-55b6-49b8-b212-516b8f2c26c2/crucible ff493493-2593-4864-9635-53d8bd7d1875 none none off -+ oxp_5db07562-31a8-43e3-b99e-7c7cb89754b7/crucible 8295c04b-0fe1-456b-aa4f-41aed656e041 none none off -+ oxp_9451a5d5-b358-4719-b6c1-a0d187da217c/crucible 50f55ff5-352e-44dd-9f6e-5294a49050af none none off -+ oxp_bb2e2869-9481-483a-bc49-2bdd62f515f5/crucible 9a497b55-c55d-4e8c-ac67-fc51dc626b2b none none off -+ oxp_d5a36c66-4b2f-46e6-96f4-b82debee1a4a/crucible 5fc3b305-20ca-4882-8222-00cb453e1370 none none off -+ oxp_f99ec996-ec08-4ccf-9a6e-6c5cab440fb4/crucible 027b5ae4-442d-4e44-a3af-41f1a369d2fd none none off -+ oxp_faccbb39-d686-42a1-a50a-0eb59ba74a87/crucible 6e98176b-93c2-4e70-b982-715a4af7def3 none none off -+ oxp_fdfd067b-1d86-444d-a21f-ed33709f3e4d/crucible 4a66c4d8-5448-4a01-8b3e-5aa96a383f5f none none off -+ oxp_4c3bb1c7-55b6-49b8-b212-516b8f2c26c2/crypt/zone/oxz_crucible_199d6b91-4def-46d4-a629-6e462f149d2c 51acb6aa-a707-443d-a797-591efbaed739 none none off -+ oxp_fdfd067b-1d86-444d-a21f-ed33709f3e4d/crypt/zone/oxz_crucible_1a42f499-42eb-4bbe-8248-df1432c20a44 99cd74fc-d598-4237-afe2-6099dd3e7f27 none none off -+ oxp_bb2e2869-9481-483a-bc49-2bdd62f515f5/crypt/zone/oxz_crucible_2dac1d18-171c-4c27-b4f4-dd9a04b3cd4c d3f32cce-77c1-45c9-b5fc-5946ce45d6ab none none off -+ oxp_9451a5d5-b358-4719-b6c1-a0d187da217c/crypt/zone/oxz_crucible_5cfcfcf1-fc41-4056-b681-28b822fc9ba9 cf93aa67-8057-486b-8117-fcb210113d78 none none off -+ oxp_faccbb39-d686-42a1-a50a-0eb59ba74a87/crypt/zone/oxz_crucible_639c583f-fff1-488a-83ea-9f506de5eeff f301a2d1-5a5c-4af5-92a2-eb4241b07e32 none none off -+ oxp_d5a36c66-4b2f-46e6-96f4-b82debee1a4a/crypt/zone/oxz_crucible_6a1eeaa3-4106-4765-9883-0b481d112f2f c7bc6bbf-cd8e-4d46-870a-c51269d3f938 none none off -+ oxp_28699448-c5d9-49ea-bf7e-627800efe783/crypt/zone/oxz_crucible_7faa36f4-c38e-49d9-9e50-87a2c509d1c0 6de4f5f7-41aa-4ede-b742-b814306a33cb none none off -+ oxp_5db07562-31a8-43e3-b99e-7c7cb89754b7/crypt/zone/oxz_crucible_89d9477c-0a66-4297-9333-78d421265495 9efc87a2-2990-4e9d-8636-0cc5003c78df none none off -+ oxp_2c490e96-27f2-4a7f-b440-04d4bfd1e4f6/crypt/zone/oxz_crucible_b4ddca08-a1d7-4c1e-8c65-69376ff4dd6f f9d13e2d-bcd0-416d-9a4a-fbee18fdd8d0 none none off -+ oxp_f99ec996-ec08-4ccf-9a6e-6c5cab440fb4/crypt/zone/oxz_crucible_d70466d6-ace2-4913-a62c-ad9f42a52369 dc55d9bf-2b5c-4fc4-b0b3-df4a87d32688 none none off + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + oxp_28699448-c5d9-49ea-bf7e-627800efe783/crypt/zone bd515f95-ef75-4243-b279-5448e8c56693 in service none none off + oxp_2c490e96-27f2-4a7f-b440-04d4bfd1e4f6/crypt/zone a5ebe3b2-007d-4cb6-a01b-519eb696dd51 in service none none off + oxp_4c3bb1c7-55b6-49b8-b212-516b8f2c26c2/crypt/zone 292da7cf-54f6-4d8c-a941-eebe5d47fe50 in service none none off + oxp_5db07562-31a8-43e3-b99e-7c7cb89754b7/crypt/zone 58573ab1-3d00-4251-9e32-1c8c94d41689 in service none none off + oxp_9451a5d5-b358-4719-b6c1-a0d187da217c/crypt/zone 823a6464-7317-41c4-88d1-317e6156da3b in service none none off + oxp_bb2e2869-9481-483a-bc49-2bdd62f515f5/crypt/zone edf02038-6f07-4788-80f7-1c9ef4537956 in service none none off + oxp_d5a36c66-4b2f-46e6-96f4-b82debee1a4a/crypt/zone 77234c3d-1877-4d9b-9885-cd70b05f6d3d in service none none off + oxp_f99ec996-ec08-4ccf-9a6e-6c5cab440fb4/crypt/zone 04ebd243-fe45-4222-a437-da51aa719c37 in service none none off + oxp_faccbb39-d686-42a1-a50a-0eb59ba74a87/crypt/zone b6c84399-0029-4eaa-af95-328e62813332 in service none none off + oxp_fdfd067b-1d86-444d-a21f-ed33709f3e4d/crypt/zone d1121115-497a-49a1-8908-2bc330bb5b98 in service none none off + oxp_28699448-c5d9-49ea-bf7e-627800efe783/crypt/zone/oxz_ntp_f4a71d99-95e2-484a-ae67-6f98aacee92b 2178dce4-6fba-4b15-b5ce-ece8c54083b5 in service none none off + oxp_28699448-c5d9-49ea-bf7e-627800efe783/crypt/debug 9c2fc653-d640-4d06-8fb0-a32ce35309b7 in service 100 GiB none gzip-9 + oxp_2c490e96-27f2-4a7f-b440-04d4bfd1e4f6/crypt/debug 3544ad60-7696-44a4-812d-1e830e2de897 in service 100 GiB none gzip-9 + oxp_4c3bb1c7-55b6-49b8-b212-516b8f2c26c2/crypt/debug 81d852cd-0bfd-4f3a-98b5-641657f2acda in service 100 GiB none gzip-9 + oxp_5db07562-31a8-43e3-b99e-7c7cb89754b7/crypt/debug fa35030d-d14d-4969-9dbf-38dfb7bd4a4d in service 100 GiB none gzip-9 + oxp_9451a5d5-b358-4719-b6c1-a0d187da217c/crypt/debug 2110ad2b-9665-4427-b6fb-9059d3d65070 in service 100 GiB none gzip-9 + oxp_bb2e2869-9481-483a-bc49-2bdd62f515f5/crypt/debug c4f6dae6-d357-4ad3-becd-5e49c4dcf171 in service 100 GiB none gzip-9 + oxp_d5a36c66-4b2f-46e6-96f4-b82debee1a4a/crypt/debug 25c84622-b39a-4c28-9dd5-1f9f33170150 in service 100 GiB none gzip-9 + oxp_f99ec996-ec08-4ccf-9a6e-6c5cab440fb4/crypt/debug 1a88aed3-4f65-479a-8677-af5771feade4 in service 100 GiB none gzip-9 + oxp_faccbb39-d686-42a1-a50a-0eb59ba74a87/crypt/debug 25eff656-ae3f-42bc-9bfb-8adbc9a1f146 in service 100 GiB none gzip-9 + oxp_fdfd067b-1d86-444d-a21f-ed33709f3e4d/crypt/debug ecba8219-9446-4f43-a2fd-098f54ebdfd2 in service 100 GiB none gzip-9 ++ oxp_28699448-c5d9-49ea-bf7e-627800efe783/crucible 3b11b123-120d-49fd-a9fc-84527b75580d in service none none off ++ oxp_2c490e96-27f2-4a7f-b440-04d4bfd1e4f6/crucible eaff368e-4ef0-4afd-aaec-1a3d4f296c10 in service none none off ++ oxp_4c3bb1c7-55b6-49b8-b212-516b8f2c26c2/crucible ff493493-2593-4864-9635-53d8bd7d1875 in service none none off ++ oxp_5db07562-31a8-43e3-b99e-7c7cb89754b7/crucible 8295c04b-0fe1-456b-aa4f-41aed656e041 in service none none off ++ oxp_9451a5d5-b358-4719-b6c1-a0d187da217c/crucible 50f55ff5-352e-44dd-9f6e-5294a49050af in service none none off ++ oxp_bb2e2869-9481-483a-bc49-2bdd62f515f5/crucible 9a497b55-c55d-4e8c-ac67-fc51dc626b2b in service none none off ++ oxp_d5a36c66-4b2f-46e6-96f4-b82debee1a4a/crucible 5fc3b305-20ca-4882-8222-00cb453e1370 in service none none off ++ oxp_f99ec996-ec08-4ccf-9a6e-6c5cab440fb4/crucible 027b5ae4-442d-4e44-a3af-41f1a369d2fd in service none none off ++ oxp_faccbb39-d686-42a1-a50a-0eb59ba74a87/crucible 6e98176b-93c2-4e70-b982-715a4af7def3 in service none none off ++ oxp_fdfd067b-1d86-444d-a21f-ed33709f3e4d/crucible 4a66c4d8-5448-4a01-8b3e-5aa96a383f5f in service none none off ++ oxp_4c3bb1c7-55b6-49b8-b212-516b8f2c26c2/crypt/zone/oxz_crucible_199d6b91-4def-46d4-a629-6e462f149d2c 51acb6aa-a707-443d-a797-591efbaed739 in service none none off ++ oxp_fdfd067b-1d86-444d-a21f-ed33709f3e4d/crypt/zone/oxz_crucible_1a42f499-42eb-4bbe-8248-df1432c20a44 99cd74fc-d598-4237-afe2-6099dd3e7f27 in service none none off ++ oxp_bb2e2869-9481-483a-bc49-2bdd62f515f5/crypt/zone/oxz_crucible_2dac1d18-171c-4c27-b4f4-dd9a04b3cd4c d3f32cce-77c1-45c9-b5fc-5946ce45d6ab in service none none off ++ oxp_9451a5d5-b358-4719-b6c1-a0d187da217c/crypt/zone/oxz_crucible_5cfcfcf1-fc41-4056-b681-28b822fc9ba9 cf93aa67-8057-486b-8117-fcb210113d78 in service none none off ++ oxp_faccbb39-d686-42a1-a50a-0eb59ba74a87/crypt/zone/oxz_crucible_639c583f-fff1-488a-83ea-9f506de5eeff f301a2d1-5a5c-4af5-92a2-eb4241b07e32 in service none none off ++ oxp_d5a36c66-4b2f-46e6-96f4-b82debee1a4a/crypt/zone/oxz_crucible_6a1eeaa3-4106-4765-9883-0b481d112f2f c7bc6bbf-cd8e-4d46-870a-c51269d3f938 in service none none off ++ oxp_28699448-c5d9-49ea-bf7e-627800efe783/crypt/zone/oxz_crucible_7faa36f4-c38e-49d9-9e50-87a2c509d1c0 6de4f5f7-41aa-4ede-b742-b814306a33cb in service none none off ++ oxp_5db07562-31a8-43e3-b99e-7c7cb89754b7/crypt/zone/oxz_crucible_89d9477c-0a66-4297-9333-78d421265495 9efc87a2-2990-4e9d-8636-0cc5003c78df in service none none off ++ oxp_2c490e96-27f2-4a7f-b440-04d4bfd1e4f6/crypt/zone/oxz_crucible_b4ddca08-a1d7-4c1e-8c65-69376ff4dd6f f9d13e2d-bcd0-416d-9a4a-fbee18fdd8d0 in service none none off ++ oxp_f99ec996-ec08-4ccf-9a6e-6c5cab440fb4/crypt/zone/oxz_crucible_d70466d6-ace2-4913-a62c-ad9f42a52369 dc55d9bf-2b5c-4fc4-b0b3-df4a87d32688 in service none none off omicron zones generation 2 -> 3: diff --git a/nexus/reconfigurator/planning/tests/output/planner_dataset_settings_modified_in_place_1_2.txt b/nexus/reconfigurator/planning/tests/output/planner_dataset_settings_modified_in_place_1_2.txt index 19c8d84d536..956abf486b8 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_dataset_settings_modified_in_place_1_2.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_dataset_settings_modified_in_place_1_2.txt @@ -22,63 +22,63 @@ to: blueprint fe13be30-94c2-4fa6-aad5-ae3c5028f6bb datasets generation 2 -> 3: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crucible c2b2149b-1ad7-479f-bc9f-2404cf3eec0d none none off - oxp_5192ef62-5a12-4a0c-829d-a409da87909c/crucible 74601f4f-d373-438c-808a-b9e6e94c0a67 none none off - oxp_8778bcc5-dddf-4345-9fdf-5c46a36497b0/crucible f8ffebff-ffd1-4005-9803-3bd79dd5b012 none none off - oxp_9134de8d-9ba8-4ddc-9e84-eb00ec616b53/crucible 02ab12e1-26f0-4151-b2f3-e675b8f5be44 none none off - oxp_96569b61-9e0c-4ee7-bd11-a5e0c541ca99/crucible 56e4a163-8f97-4122-a2a2-38546daffbfc none none off - oxp_ba90170e-7399-4260-910a-376254a8a9bf/crucible 25c1c3c4-88b2-4c7f-8069-1b9412d045e6 none none off - oxp_bc649720-926b-48f2-a62a-efdcff96b49e/crucible 8c3ff417-0e78-4946-b48f-f83a1a65526b none none off - oxp_d55da288-4f35-4e92-97b0-29a5e6009109/crucible 27251d6c-990a-4537-ad6d-a23eb40a61e2 none none off - oxp_f83302fc-785c-4ab3-bcca-0d040b3c3062/crucible 707bf418-524a-4a44-aaf1-fc0fe903226b none none off - oxp_f843fb62-0f04-4c7d-a56f-62531104dc77/crucible 54e1705b-2579-4319-9f96-717a4d0508da none none off - oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/clickhouse 06c210fe-97c6-40a9-b7e2-3ae2b8304523 none none off - oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/internal_dns f2999945-8940-4eea-9423-80972552a6a1 none none off - oxp_5192ef62-5a12-4a0c-829d-a409da87909c/crypt/internal_dns 86643402-4dbc-4d33-ba3e-2e475c3a9f47 none none off - oxp_8778bcc5-dddf-4345-9fdf-5c46a36497b0/crypt/internal_dns 1ddb78c9-40dd-406a-bcd0-80271360a43e none none off - oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/zone 80d1989b-2118-4b8f-887a-693c26901a63 none none off - oxp_5192ef62-5a12-4a0c-829d-a409da87909c/crypt/zone 95358c68-0461-4236-ac9a-31889f14d704 none none off - oxp_8778bcc5-dddf-4345-9fdf-5c46a36497b0/crypt/zone 11a0e954-7001-4b97-b521-2eafd179058c none none off - oxp_9134de8d-9ba8-4ddc-9e84-eb00ec616b53/crypt/zone ec5d1490-2ab1-446a-931a-83acb726fce9 none none off - oxp_96569b61-9e0c-4ee7-bd11-a5e0c541ca99/crypt/zone b7aaee47-6098-4004-8cc1-0f6ffd27b314 none none off - oxp_ba90170e-7399-4260-910a-376254a8a9bf/crypt/zone 2ad4c1d4-a8c8-4757-9c4d-b2a74aebceb0 none none off - oxp_bc649720-926b-48f2-a62a-efdcff96b49e/crypt/zone 8cfbfb7d-b024-4459-aa92-fad02c3479e5 none none off - oxp_d55da288-4f35-4e92-97b0-29a5e6009109/crypt/zone 6d88208a-9cd6-4b1c-9367-0d7a7237d2ba none none off - oxp_f83302fc-785c-4ab3-bcca-0d040b3c3062/crypt/zone 627fcb15-3896-4517-9848-6e14398ca33f none none off - oxp_f843fb62-0f04-4c7d-a56f-62531104dc77/crypt/zone b2bfbf22-be11-44c4-86ce-f4c9d7c61bca none none off - oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/zone/oxz_clickhouse_2e7dca68-90bc-42a5-b516-8872899cc38f d93a80f1-5f19-42f9-a24e-5a3bed2ecdd6 none none off - oxp_bc649720-926b-48f2-a62a-efdcff96b49e/crypt/zone/oxz_crucible_017681e7-e03e-4fc9-94b7-9963f37a5251 285b3278-0bac-48a8-b718-75ee4393f5d2 none none off - oxp_8778bcc5-dddf-4345-9fdf-5c46a36497b0/crypt/zone/oxz_crucible_0465511c-088d-45d3-8f1f-a59d196aa6c0 d6f0bfb0-b67f-474c-a45a-44f7f25c079a none none off - oxp_d55da288-4f35-4e92-97b0-29a5e6009109/crypt/zone/oxz_crucible_222b4052-a14c-435d-9d05-bd2acfb360d1 478428de-7aaf-40d7-9a50-f7a5f29ba4d6 none none off - oxp_5192ef62-5a12-4a0c-829d-a409da87909c/crypt/zone/oxz_crucible_48b34cc7-0ea1-4c7f-a44b-576c2c9aae8d 95962f35-1a28-472c-b060-04213df9648f none none off - oxp_96569b61-9e0c-4ee7-bd11-a5e0c541ca99/crypt/zone/oxz_crucible_5ca82295-48f7-4ace-805e-bcf8ff1169e6 2ec7fb3f-1c91-4633-ae2c-1538e4ead7ef none none off - oxp_f843fb62-0f04-4c7d-a56f-62531104dc77/crypt/zone/oxz_crucible_6d4baeff-b0b2-48d4-9d57-98300ca470b0 36600c7a-1488-4b99-b697-95e3e057f701 none none off - oxp_9134de8d-9ba8-4ddc-9e84-eb00ec616b53/crypt/zone/oxz_crucible_a4ed47c6-afc1-406a-a722-9c2ca18d8f15 983da03f-f39a-4c86-be8f-cd42187a0efb none none off - oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/zone/oxz_crucible_b2bd58dd-4056-4418-9adc-99133fb7340d 472883c8-a687-415a-9400-963dc4ebfb23 none none off - oxp_ba90170e-7399-4260-910a-376254a8a9bf/crypt/zone/oxz_crucible_b9871e7b-e158-4541-b590-f2388518a629 a0584b79-723b-47fb-a375-6270893e4034 none none off - oxp_f83302fc-785c-4ab3-bcca-0d040b3c3062/crypt/zone/oxz_crucible_d845b03f-a140-46fd-b81a-3d930f804db2 391a1adf-4b07-4838-bc63-3f2ca17d54c7 none none off - oxp_5192ef62-5a12-4a0c-829d-a409da87909c/crypt/zone/oxz_crucible_pantry_4ce5fadc-ed9a-4fc0-adc2-816ba38ac0ff 6ac03c83-58f0-4472-9946-fa8284d6ce22 none none off - oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/zone/oxz_crucible_pantry_62817fb3-3432-4d29-a7f0-0c430d91e70b 4fd8f841-8ced-4c14-9a54-1651b8c827b1 none none off - oxp_8778bcc5-dddf-4345-9fdf-5c46a36497b0/crypt/zone/oxz_crucible_pantry_f40b4b52-a596-4c8b-ac14-a1a4608e48ad 82674874-7065-4219-903c-f9215896fb38 none none off - oxp_8778bcc5-dddf-4345-9fdf-5c46a36497b0/crypt/zone/oxz_internal_dns_0f5fa763-0f32-4b4d-9160-ed03d92ae886 167519d0-d053-455b-a545-ad6f9b51856d none none off - oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/zone/oxz_internal_dns_a2b1dbad-c401-434a-b1a3-d390e3d582c7 e32a6b3b-2cec-4213-bb19-bdd05730959c none none off - oxp_5192ef62-5a12-4a0c-829d-a409da87909c/crypt/zone/oxz_internal_dns_ed5dafdf-9ff6-47ef-a90a-c4d44ac225df dd90bad1-a07d-4d19-920f-7adfa7c7277c none none off - oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/zone/oxz_nexus_244029bd-c704-4894-8667-0c7af6bd62c1 c94b54db-b218-4cc5-938e-a12688dc1811 none none off - oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/zone/oxz_ntp_1bcf8d76-a533-4f21-a4e1-4b8af4b3e80a 301aaff5-4531-42a7-abec-be6169ad1922 none none off - oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/debug 8674ab89-23a1-46b5-bb40-bfd938d3c026 100 GiB none gzip-9 - oxp_5192ef62-5a12-4a0c-829d-a409da87909c/crypt/debug 3463b0a5-8e0f-41b5-bac9-1be5186ffe13 100 GiB none gzip-9 - oxp_8778bcc5-dddf-4345-9fdf-5c46a36497b0/crypt/debug 435c0ab4-c566-4f0f-a8e3-399465075174 100 GiB none gzip-9 - oxp_9134de8d-9ba8-4ddc-9e84-eb00ec616b53/crypt/debug b2ba48cd-52b7-489d-a877-88da2392067b 100 GiB none gzip-9 - oxp_96569b61-9e0c-4ee7-bd11-a5e0c541ca99/crypt/debug 702cbaf8-3e09-45b7-ba07-b610a95b3546 100 GiB none gzip-9 - oxp_ba90170e-7399-4260-910a-376254a8a9bf/crypt/debug 5b1b49c7-83c4-44e4-8d54-4d1336cd5b6a 100 GiB none gzip-9 - oxp_bc649720-926b-48f2-a62a-efdcff96b49e/crypt/debug e70e6fa1-185f-4932-959f-8ddc1d52d995 100 GiB none gzip-9 - oxp_f83302fc-785c-4ab3-bcca-0d040b3c3062/crypt/debug 35748580-b8b2-4882-ab41-cdc16ec52d05 100 GiB none gzip-9 - oxp_f843fb62-0f04-4c7d-a56f-62531104dc77/crypt/debug 97b89a78-8a3b-4026-b3a9-88434389a2d7 100 GiB none gzip-9 -* oxp_d55da288-4f35-4e92-97b0-29a5e6009109/crypt/debug 029a51d9-e7e7-418c-a55e-3f6982f1fe14 - none - 1 GiB gzip-9 - └─ + 100 GiB + none + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crucible c2b2149b-1ad7-479f-bc9f-2404cf3eec0d in service none none off + oxp_5192ef62-5a12-4a0c-829d-a409da87909c/crucible 74601f4f-d373-438c-808a-b9e6e94c0a67 in service none none off + oxp_8778bcc5-dddf-4345-9fdf-5c46a36497b0/crucible f8ffebff-ffd1-4005-9803-3bd79dd5b012 in service none none off + oxp_9134de8d-9ba8-4ddc-9e84-eb00ec616b53/crucible 02ab12e1-26f0-4151-b2f3-e675b8f5be44 in service none none off + oxp_96569b61-9e0c-4ee7-bd11-a5e0c541ca99/crucible 56e4a163-8f97-4122-a2a2-38546daffbfc in service none none off + oxp_ba90170e-7399-4260-910a-376254a8a9bf/crucible 25c1c3c4-88b2-4c7f-8069-1b9412d045e6 in service none none off + oxp_bc649720-926b-48f2-a62a-efdcff96b49e/crucible 8c3ff417-0e78-4946-b48f-f83a1a65526b in service none none off + oxp_d55da288-4f35-4e92-97b0-29a5e6009109/crucible 27251d6c-990a-4537-ad6d-a23eb40a61e2 in service none none off + oxp_f83302fc-785c-4ab3-bcca-0d040b3c3062/crucible 707bf418-524a-4a44-aaf1-fc0fe903226b in service none none off + oxp_f843fb62-0f04-4c7d-a56f-62531104dc77/crucible 54e1705b-2579-4319-9f96-717a4d0508da in service none none off + oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/clickhouse 06c210fe-97c6-40a9-b7e2-3ae2b8304523 in service none none off + oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/internal_dns f2999945-8940-4eea-9423-80972552a6a1 in service none none off + oxp_5192ef62-5a12-4a0c-829d-a409da87909c/crypt/internal_dns 86643402-4dbc-4d33-ba3e-2e475c3a9f47 in service none none off + oxp_8778bcc5-dddf-4345-9fdf-5c46a36497b0/crypt/internal_dns 1ddb78c9-40dd-406a-bcd0-80271360a43e in service none none off + oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/zone 80d1989b-2118-4b8f-887a-693c26901a63 in service none none off + oxp_5192ef62-5a12-4a0c-829d-a409da87909c/crypt/zone 95358c68-0461-4236-ac9a-31889f14d704 in service none none off + oxp_8778bcc5-dddf-4345-9fdf-5c46a36497b0/crypt/zone 11a0e954-7001-4b97-b521-2eafd179058c in service none none off + oxp_9134de8d-9ba8-4ddc-9e84-eb00ec616b53/crypt/zone ec5d1490-2ab1-446a-931a-83acb726fce9 in service none none off + oxp_96569b61-9e0c-4ee7-bd11-a5e0c541ca99/crypt/zone b7aaee47-6098-4004-8cc1-0f6ffd27b314 in service none none off + oxp_ba90170e-7399-4260-910a-376254a8a9bf/crypt/zone 2ad4c1d4-a8c8-4757-9c4d-b2a74aebceb0 in service none none off + oxp_bc649720-926b-48f2-a62a-efdcff96b49e/crypt/zone 8cfbfb7d-b024-4459-aa92-fad02c3479e5 in service none none off + oxp_d55da288-4f35-4e92-97b0-29a5e6009109/crypt/zone 6d88208a-9cd6-4b1c-9367-0d7a7237d2ba in service none none off + oxp_f83302fc-785c-4ab3-bcca-0d040b3c3062/crypt/zone 627fcb15-3896-4517-9848-6e14398ca33f in service none none off + oxp_f843fb62-0f04-4c7d-a56f-62531104dc77/crypt/zone b2bfbf22-be11-44c4-86ce-f4c9d7c61bca in service none none off + oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/zone/oxz_clickhouse_2e7dca68-90bc-42a5-b516-8872899cc38f d93a80f1-5f19-42f9-a24e-5a3bed2ecdd6 in service none none off + oxp_bc649720-926b-48f2-a62a-efdcff96b49e/crypt/zone/oxz_crucible_017681e7-e03e-4fc9-94b7-9963f37a5251 285b3278-0bac-48a8-b718-75ee4393f5d2 in service none none off + oxp_8778bcc5-dddf-4345-9fdf-5c46a36497b0/crypt/zone/oxz_crucible_0465511c-088d-45d3-8f1f-a59d196aa6c0 d6f0bfb0-b67f-474c-a45a-44f7f25c079a in service none none off + oxp_d55da288-4f35-4e92-97b0-29a5e6009109/crypt/zone/oxz_crucible_222b4052-a14c-435d-9d05-bd2acfb360d1 478428de-7aaf-40d7-9a50-f7a5f29ba4d6 in service none none off + oxp_5192ef62-5a12-4a0c-829d-a409da87909c/crypt/zone/oxz_crucible_48b34cc7-0ea1-4c7f-a44b-576c2c9aae8d 95962f35-1a28-472c-b060-04213df9648f in service none none off + oxp_96569b61-9e0c-4ee7-bd11-a5e0c541ca99/crypt/zone/oxz_crucible_5ca82295-48f7-4ace-805e-bcf8ff1169e6 2ec7fb3f-1c91-4633-ae2c-1538e4ead7ef in service none none off + oxp_f843fb62-0f04-4c7d-a56f-62531104dc77/crypt/zone/oxz_crucible_6d4baeff-b0b2-48d4-9d57-98300ca470b0 36600c7a-1488-4b99-b697-95e3e057f701 in service none none off + oxp_9134de8d-9ba8-4ddc-9e84-eb00ec616b53/crypt/zone/oxz_crucible_a4ed47c6-afc1-406a-a722-9c2ca18d8f15 983da03f-f39a-4c86-be8f-cd42187a0efb in service none none off + oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/zone/oxz_crucible_b2bd58dd-4056-4418-9adc-99133fb7340d 472883c8-a687-415a-9400-963dc4ebfb23 in service none none off + oxp_ba90170e-7399-4260-910a-376254a8a9bf/crypt/zone/oxz_crucible_b9871e7b-e158-4541-b590-f2388518a629 a0584b79-723b-47fb-a375-6270893e4034 in service none none off + oxp_f83302fc-785c-4ab3-bcca-0d040b3c3062/crypt/zone/oxz_crucible_d845b03f-a140-46fd-b81a-3d930f804db2 391a1adf-4b07-4838-bc63-3f2ca17d54c7 in service none none off + oxp_5192ef62-5a12-4a0c-829d-a409da87909c/crypt/zone/oxz_crucible_pantry_4ce5fadc-ed9a-4fc0-adc2-816ba38ac0ff 6ac03c83-58f0-4472-9946-fa8284d6ce22 in service none none off + oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/zone/oxz_crucible_pantry_62817fb3-3432-4d29-a7f0-0c430d91e70b 4fd8f841-8ced-4c14-9a54-1651b8c827b1 in service none none off + oxp_8778bcc5-dddf-4345-9fdf-5c46a36497b0/crypt/zone/oxz_crucible_pantry_f40b4b52-a596-4c8b-ac14-a1a4608e48ad 82674874-7065-4219-903c-f9215896fb38 in service none none off + oxp_8778bcc5-dddf-4345-9fdf-5c46a36497b0/crypt/zone/oxz_internal_dns_0f5fa763-0f32-4b4d-9160-ed03d92ae886 167519d0-d053-455b-a545-ad6f9b51856d in service none none off + oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/zone/oxz_internal_dns_a2b1dbad-c401-434a-b1a3-d390e3d582c7 e32a6b3b-2cec-4213-bb19-bdd05730959c in service none none off + oxp_5192ef62-5a12-4a0c-829d-a409da87909c/crypt/zone/oxz_internal_dns_ed5dafdf-9ff6-47ef-a90a-c4d44ac225df dd90bad1-a07d-4d19-920f-7adfa7c7277c in service none none off + oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/zone/oxz_nexus_244029bd-c704-4894-8667-0c7af6bd62c1 c94b54db-b218-4cc5-938e-a12688dc1811 in service none none off + oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/zone/oxz_ntp_1bcf8d76-a533-4f21-a4e1-4b8af4b3e80a 301aaff5-4531-42a7-abec-be6169ad1922 in service none none off + oxp_3b6e2ade-57fc-4f9d-85c3-38fca27f1df6/crypt/debug 8674ab89-23a1-46b5-bb40-bfd938d3c026 in service 100 GiB none gzip-9 + oxp_5192ef62-5a12-4a0c-829d-a409da87909c/crypt/debug 3463b0a5-8e0f-41b5-bac9-1be5186ffe13 in service 100 GiB none gzip-9 + oxp_8778bcc5-dddf-4345-9fdf-5c46a36497b0/crypt/debug 435c0ab4-c566-4f0f-a8e3-399465075174 in service 100 GiB none gzip-9 + oxp_9134de8d-9ba8-4ddc-9e84-eb00ec616b53/crypt/debug b2ba48cd-52b7-489d-a877-88da2392067b in service 100 GiB none gzip-9 + oxp_96569b61-9e0c-4ee7-bd11-a5e0c541ca99/crypt/debug 702cbaf8-3e09-45b7-ba07-b610a95b3546 in service 100 GiB none gzip-9 + oxp_ba90170e-7399-4260-910a-376254a8a9bf/crypt/debug 5b1b49c7-83c4-44e4-8d54-4d1336cd5b6a in service 100 GiB none gzip-9 + oxp_bc649720-926b-48f2-a62a-efdcff96b49e/crypt/debug e70e6fa1-185f-4932-959f-8ddc1d52d995 in service 100 GiB none gzip-9 + oxp_f83302fc-785c-4ab3-bcca-0d040b3c3062/crypt/debug 35748580-b8b2-4882-ab41-cdc16ec52d05 in service 100 GiB none gzip-9 + oxp_f843fb62-0f04-4c7d-a56f-62531104dc77/crypt/debug 97b89a78-8a3b-4026-b3a9-88434389a2d7 in service 100 GiB none gzip-9 +* oxp_d55da288-4f35-4e92-97b0-29a5e6009109/crypt/debug 029a51d9-e7e7-418c-a55e-3f6982f1fe14 in service - none - 1 GiB gzip-9 + └─ + 100 GiB + none omicron zones at generation 2: diff --git a/nexus/reconfigurator/planning/tests/output/planner_decommissions_sleds_1_2.txt b/nexus/reconfigurator/planning/tests/output/planner_decommissions_sleds_1_2.txt index 86e1b301531..eef55f53bb2 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_decommissions_sleds_1_2.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_decommissions_sleds_1_2.txt @@ -22,56 +22,56 @@ to: blueprint 1ac2d88f-27dd-4506-8585-6b2be832528e datasets from generation 2: - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- oxp_069446b4-7881-49dc-838a-63a782d4896d/crucible 6c3dbdf9-0871-48d5-b32d-f93dbc0adef9 none none off -- oxp_20eba316-dffe-4516-9703-af561da19b0b/crucible 16cedd55-3841-489b-8268-b60d42f3aa26 none none off -- oxp_426f4b6d-4a82-4106-bf4b-64ee86a2a5a4/crucible 64222170-0027-4f28-a934-387689d63ac8 none none off -- oxp_82daeef2-8641-4bf5-ac66-f7b5f62c48b6/crucible b6b8607b-1639-458d-9c27-6adb9d6eaebd none none off -- oxp_8e5feeb2-14f1-440f-a909-3c34aa8e129b/crucible 5191937e-a424-4b1b-aef9-2f8a1065b874 none none off -- oxp_942e2123-7c4e-4f6b-9317-1341fe212647/crucible c3bb341f-09c5-4f6d-b4ed-6689f46ebf86 none none off -- oxp_97a5ce17-df5b-47e7-baf8-80ae710ce18e/crucible 5cee7433-4662-42a0-948c-26c96580bc27 none none off -- oxp_debc9fb6-bd58-4e4f-b8b8-6a9a07fcf25d/crucible b6d4ceab-9815-4672-9359-073b6c5e5678 none none off -- oxp_f63a32a9-0659-43cf-8efc-8f34e7af9d45/crucible 7d3ce847-80bb-48cd-9e7a-588f67303326 none none off -- oxp_ffea118f-7715-4e21-8fc5-bb23cd0f59e8/crucible 28439e9e-4972-4c63-83e9-a6b575275361 none none off -- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/clickhouse dca7679a-b028-40fe-bf45-54f53d15850d none none off -- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/internal_dns aa1b3c0b-2cde-4ed2-8a36-679aacb3f6f8 none none off -- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/zone dd41720e-4936-45d0-8fb2-926d8066ea02 none none off -- oxp_20eba316-dffe-4516-9703-af561da19b0b/crypt/zone 704d24de-9d71-4834-8cd5-72cda2745c62 none none off -- oxp_426f4b6d-4a82-4106-bf4b-64ee86a2a5a4/crypt/zone bf13115d-7900-4f67-8071-ff7acc7fa30f none none off -- oxp_82daeef2-8641-4bf5-ac66-f7b5f62c48b6/crypt/zone b1adb353-1eb1-4093-b5e3-dda3baf09a27 none none off -- oxp_8e5feeb2-14f1-440f-a909-3c34aa8e129b/crypt/zone 214b02d1-d63e-49c4-acfb-3fff1254961e none none off -- oxp_942e2123-7c4e-4f6b-9317-1341fe212647/crypt/zone 24778f3d-473d-4c03-8e33-cfef2c11f783 none none off -- oxp_97a5ce17-df5b-47e7-baf8-80ae710ce18e/crypt/zone fe0dc780-8237-4eb5-b6ba-6e0dffdc90a8 none none off -- oxp_debc9fb6-bd58-4e4f-b8b8-6a9a07fcf25d/crypt/zone 752c2113-c084-4297-be5a-900abc9d091b none none off -- oxp_f63a32a9-0659-43cf-8efc-8f34e7af9d45/crypt/zone 565a1a74-53a9-40b5-8de0-66c0b1cc5b24 none none off -- oxp_ffea118f-7715-4e21-8fc5-bb23cd0f59e8/crypt/zone 16d104de-5149-4a2f-90c4-517252ffa112 none none off -- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/zone/oxz_clickhouse_3fd081ea-93f1-417e-bcb1-405854435f28 426ee766-c13a-42cb-9a08-9c5af90cf559 none none off -- oxp_ffea118f-7715-4e21-8fc5-bb23cd0f59e8/crypt/zone/oxz_crucible_290e7e97-c4b3-47da-9f40-8d909397fbae 4fa44ded-a308-4f69-b0ba-ea60e2a2319a none none off -- oxp_942e2123-7c4e-4f6b-9317-1341fe212647/crypt/zone/oxz_crucible_29bbe4ad-e6e8-4e05-b188-a811a793ccbb c35c1a79-41a2-45dc-a0dd-a9bbabf34462 none none off -- oxp_8e5feeb2-14f1-440f-a909-3c34aa8e129b/crypt/zone/oxz_crucible_8500a060-a426-4324-ba40-a66dd4b89bc6 8ef95c11-2ec4-4764-ba85-d78f3c4cacf0 none none off -- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/zone/oxz_crucible_92b7abd8-3e34-49dd-9c56-19a314e97d49 364f8c8d-4924-468e-851c-42b504ab87ae none none off -- oxp_20eba316-dffe-4516-9703-af561da19b0b/crypt/zone/oxz_crucible_b320954e-6c66-4540-9bf4-3d976f21ee1b 0059c701-30b8-4f30-85b1-60ce6265978b none none off -- oxp_426f4b6d-4a82-4106-bf4b-64ee86a2a5a4/crypt/zone/oxz_crucible_bc3e4495-7e51-46b6-9f55-026ea1da39dd e46deb07-6509-4f5d-b0b7-fbeff03bdedf none none off -- oxp_82daeef2-8641-4bf5-ac66-f7b5f62c48b6/crypt/zone/oxz_crucible_cfb7595b-280c-40f5-b1aa-6e154adf280b dbfdcc07-9c21-4231-bcc7-bb5933412e46 none none off -- oxp_debc9fb6-bd58-4e4f-b8b8-6a9a07fcf25d/crypt/zone/oxz_crucible_d6b6ea5a-3f29-4815-aa42-b1afeb11dfc5 dd090f1e-bb4b-4f1b-a295-53e94fb880e7 none none off -- oxp_97a5ce17-df5b-47e7-baf8-80ae710ce18e/crypt/zone/oxz_crucible_d6b77c1f-8c9e-406d-944e-c97a57b3984d 4b5e0d5a-b6ff-4ca7-821f-bc96a2686df7 none none off -- oxp_f63a32a9-0659-43cf-8efc-8f34e7af9d45/crypt/zone/oxz_crucible_ecc03801-b315-4495-9b2c-49e0eead1283 56654da3-2657-4392-94f1-1d4f6853d178 none none off -- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/zone/oxz_crucible_pantry_ecebab45-11e7-47ab-8bc2-ab9114c6e2bc 42d694ba-0a83-4a27-96a5-166dbf0b2440 none none off -- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/zone/oxz_internal_dns_96b7a45b-be74-44e8-b68a-e530cfa81830 8a4183fd-c357-4857-9717-a577dbb8b5a4 none none off -- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/zone/oxz_nexus_bc0f4342-f88d-49cc-bb44-b555d9b8ca12 238cbec5-a63d-41b6-93d0-1fdd2b789872 none none off -- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/zone/oxz_ntp_b3dbc671-0e4d-49ff-9f4f-71b249d21f57 4ea6474a-6e19-487f-877a-8f18d085bfd3 none none off -- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/debug 47b590b2-dba4-4cd6-b0ec-91ef84697d9c 100 GiB none gzip-9 -- oxp_20eba316-dffe-4516-9703-af561da19b0b/crypt/debug 69c1e2e4-1038-4c8b-8c86-2b254e100915 100 GiB none gzip-9 -- oxp_426f4b6d-4a82-4106-bf4b-64ee86a2a5a4/crypt/debug f6d25d99-0ee3-4f25-a94f-e2b1353abe3f 100 GiB none gzip-9 -- oxp_82daeef2-8641-4bf5-ac66-f7b5f62c48b6/crypt/debug bdbefa26-d30a-480e-8a22-f7c93421d6e0 100 GiB none gzip-9 -- oxp_8e5feeb2-14f1-440f-a909-3c34aa8e129b/crypt/debug b5a777ab-6722-4511-b35a-8dbd099968c6 100 GiB none gzip-9 -- oxp_942e2123-7c4e-4f6b-9317-1341fe212647/crypt/debug 48828e8f-eaf5-4ec4-a5ec-5cbf5d616cb3 100 GiB none gzip-9 -- oxp_97a5ce17-df5b-47e7-baf8-80ae710ce18e/crypt/debug e02c001d-9270-4788-ad91-576470e751de 100 GiB none gzip-9 -- oxp_debc9fb6-bd58-4e4f-b8b8-6a9a07fcf25d/crypt/debug 7a39606c-fbed-4aec-ac06-6ad7d5a2c7d4 100 GiB none gzip-9 -- oxp_f63a32a9-0659-43cf-8efc-8f34e7af9d45/crypt/debug 31802082-7903-4270-983e-5681228436be 100 GiB none gzip-9 -- oxp_ffea118f-7715-4e21-8fc5-bb23cd0f59e8/crypt/debug d7eaf6f8-440a-405e-9234-35ba00e09e85 100 GiB none gzip-9 + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +- oxp_069446b4-7881-49dc-838a-63a782d4896d/crucible 6c3dbdf9-0871-48d5-b32d-f93dbc0adef9 in service none none off +- oxp_20eba316-dffe-4516-9703-af561da19b0b/crucible 16cedd55-3841-489b-8268-b60d42f3aa26 in service none none off +- oxp_426f4b6d-4a82-4106-bf4b-64ee86a2a5a4/crucible 64222170-0027-4f28-a934-387689d63ac8 in service none none off +- oxp_82daeef2-8641-4bf5-ac66-f7b5f62c48b6/crucible b6b8607b-1639-458d-9c27-6adb9d6eaebd in service none none off +- oxp_8e5feeb2-14f1-440f-a909-3c34aa8e129b/crucible 5191937e-a424-4b1b-aef9-2f8a1065b874 in service none none off +- oxp_942e2123-7c4e-4f6b-9317-1341fe212647/crucible c3bb341f-09c5-4f6d-b4ed-6689f46ebf86 in service none none off +- oxp_97a5ce17-df5b-47e7-baf8-80ae710ce18e/crucible 5cee7433-4662-42a0-948c-26c96580bc27 in service none none off +- oxp_debc9fb6-bd58-4e4f-b8b8-6a9a07fcf25d/crucible b6d4ceab-9815-4672-9359-073b6c5e5678 in service none none off +- oxp_f63a32a9-0659-43cf-8efc-8f34e7af9d45/crucible 7d3ce847-80bb-48cd-9e7a-588f67303326 in service none none off +- oxp_ffea118f-7715-4e21-8fc5-bb23cd0f59e8/crucible 28439e9e-4972-4c63-83e9-a6b575275361 in service none none off +- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/clickhouse dca7679a-b028-40fe-bf45-54f53d15850d in service none none off +- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/internal_dns aa1b3c0b-2cde-4ed2-8a36-679aacb3f6f8 in service none none off +- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/zone dd41720e-4936-45d0-8fb2-926d8066ea02 in service none none off +- oxp_20eba316-dffe-4516-9703-af561da19b0b/crypt/zone 704d24de-9d71-4834-8cd5-72cda2745c62 in service none none off +- oxp_426f4b6d-4a82-4106-bf4b-64ee86a2a5a4/crypt/zone bf13115d-7900-4f67-8071-ff7acc7fa30f in service none none off +- oxp_82daeef2-8641-4bf5-ac66-f7b5f62c48b6/crypt/zone b1adb353-1eb1-4093-b5e3-dda3baf09a27 in service none none off +- oxp_8e5feeb2-14f1-440f-a909-3c34aa8e129b/crypt/zone 214b02d1-d63e-49c4-acfb-3fff1254961e in service none none off +- oxp_942e2123-7c4e-4f6b-9317-1341fe212647/crypt/zone 24778f3d-473d-4c03-8e33-cfef2c11f783 in service none none off +- oxp_97a5ce17-df5b-47e7-baf8-80ae710ce18e/crypt/zone fe0dc780-8237-4eb5-b6ba-6e0dffdc90a8 in service none none off +- oxp_debc9fb6-bd58-4e4f-b8b8-6a9a07fcf25d/crypt/zone 752c2113-c084-4297-be5a-900abc9d091b in service none none off +- oxp_f63a32a9-0659-43cf-8efc-8f34e7af9d45/crypt/zone 565a1a74-53a9-40b5-8de0-66c0b1cc5b24 in service none none off +- oxp_ffea118f-7715-4e21-8fc5-bb23cd0f59e8/crypt/zone 16d104de-5149-4a2f-90c4-517252ffa112 in service none none off +- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/zone/oxz_clickhouse_3fd081ea-93f1-417e-bcb1-405854435f28 426ee766-c13a-42cb-9a08-9c5af90cf559 in service none none off +- oxp_ffea118f-7715-4e21-8fc5-bb23cd0f59e8/crypt/zone/oxz_crucible_290e7e97-c4b3-47da-9f40-8d909397fbae 4fa44ded-a308-4f69-b0ba-ea60e2a2319a in service none none off +- oxp_942e2123-7c4e-4f6b-9317-1341fe212647/crypt/zone/oxz_crucible_29bbe4ad-e6e8-4e05-b188-a811a793ccbb c35c1a79-41a2-45dc-a0dd-a9bbabf34462 in service none none off +- oxp_8e5feeb2-14f1-440f-a909-3c34aa8e129b/crypt/zone/oxz_crucible_8500a060-a426-4324-ba40-a66dd4b89bc6 8ef95c11-2ec4-4764-ba85-d78f3c4cacf0 in service none none off +- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/zone/oxz_crucible_92b7abd8-3e34-49dd-9c56-19a314e97d49 364f8c8d-4924-468e-851c-42b504ab87ae in service none none off +- oxp_20eba316-dffe-4516-9703-af561da19b0b/crypt/zone/oxz_crucible_b320954e-6c66-4540-9bf4-3d976f21ee1b 0059c701-30b8-4f30-85b1-60ce6265978b in service none none off +- oxp_426f4b6d-4a82-4106-bf4b-64ee86a2a5a4/crypt/zone/oxz_crucible_bc3e4495-7e51-46b6-9f55-026ea1da39dd e46deb07-6509-4f5d-b0b7-fbeff03bdedf in service none none off +- oxp_82daeef2-8641-4bf5-ac66-f7b5f62c48b6/crypt/zone/oxz_crucible_cfb7595b-280c-40f5-b1aa-6e154adf280b dbfdcc07-9c21-4231-bcc7-bb5933412e46 in service none none off +- oxp_debc9fb6-bd58-4e4f-b8b8-6a9a07fcf25d/crypt/zone/oxz_crucible_d6b6ea5a-3f29-4815-aa42-b1afeb11dfc5 dd090f1e-bb4b-4f1b-a295-53e94fb880e7 in service none none off +- oxp_97a5ce17-df5b-47e7-baf8-80ae710ce18e/crypt/zone/oxz_crucible_d6b77c1f-8c9e-406d-944e-c97a57b3984d 4b5e0d5a-b6ff-4ca7-821f-bc96a2686df7 in service none none off +- oxp_f63a32a9-0659-43cf-8efc-8f34e7af9d45/crypt/zone/oxz_crucible_ecc03801-b315-4495-9b2c-49e0eead1283 56654da3-2657-4392-94f1-1d4f6853d178 in service none none off +- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/zone/oxz_crucible_pantry_ecebab45-11e7-47ab-8bc2-ab9114c6e2bc 42d694ba-0a83-4a27-96a5-166dbf0b2440 in service none none off +- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/zone/oxz_internal_dns_96b7a45b-be74-44e8-b68a-e530cfa81830 8a4183fd-c357-4857-9717-a577dbb8b5a4 in service none none off +- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/zone/oxz_nexus_bc0f4342-f88d-49cc-bb44-b555d9b8ca12 238cbec5-a63d-41b6-93d0-1fdd2b789872 in service none none off +- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/zone/oxz_ntp_b3dbc671-0e4d-49ff-9f4f-71b249d21f57 4ea6474a-6e19-487f-877a-8f18d085bfd3 in service none none off +- oxp_069446b4-7881-49dc-838a-63a782d4896d/crypt/debug 47b590b2-dba4-4cd6-b0ec-91ef84697d9c in service 100 GiB none gzip-9 +- oxp_20eba316-dffe-4516-9703-af561da19b0b/crypt/debug 69c1e2e4-1038-4c8b-8c86-2b254e100915 in service 100 GiB none gzip-9 +- oxp_426f4b6d-4a82-4106-bf4b-64ee86a2a5a4/crypt/debug f6d25d99-0ee3-4f25-a94f-e2b1353abe3f in service 100 GiB none gzip-9 +- oxp_82daeef2-8641-4bf5-ac66-f7b5f62c48b6/crypt/debug bdbefa26-d30a-480e-8a22-f7c93421d6e0 in service 100 GiB none gzip-9 +- oxp_8e5feeb2-14f1-440f-a909-3c34aa8e129b/crypt/debug b5a777ab-6722-4511-b35a-8dbd099968c6 in service 100 GiB none gzip-9 +- oxp_942e2123-7c4e-4f6b-9317-1341fe212647/crypt/debug 48828e8f-eaf5-4ec4-a5ec-5cbf5d616cb3 in service 100 GiB none gzip-9 +- oxp_97a5ce17-df5b-47e7-baf8-80ae710ce18e/crypt/debug e02c001d-9270-4788-ad91-576470e751de in service 100 GiB none gzip-9 +- oxp_debc9fb6-bd58-4e4f-b8b8-6a9a07fcf25d/crypt/debug 7a39606c-fbed-4aec-ac06-6ad7d5a2c7d4 in service 100 GiB none gzip-9 +- oxp_f63a32a9-0659-43cf-8efc-8f34e7af9d45/crypt/debug 31802082-7903-4270-983e-5681228436be in service 100 GiB none gzip-9 +- oxp_ffea118f-7715-4e21-8fc5-bb23cd0f59e8/crypt/debug d7eaf6f8-440a-405e-9234-35ba00e09e85 in service 100 GiB none gzip-9 omicron zones generation 2 -> 3: @@ -129,56 +129,56 @@ to: blueprint 1ac2d88f-27dd-4506-8585-6b2be832528e datasets generation 2 -> 3: - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crucible 6faaf132-5e10-43a9-926c-abc32ad8b2fe none none off - oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crucible cbb904a8-0871-4038-933c-7393bbc0738c none none off - oxp_4e91d4a3-bb6c-44bb-bd4e-bf8913c1ba2b/crucible 75b0260f-d857-434f-b0a6-d1b0b23702e2 none none off - oxp_67de3a80-29cb-4066-b743-e285a2ca1f4e/crucible 80f92c60-b0f3-4841-ae1d-350f9263c51f none none off - oxp_9139b70f-c1d3-475d-8f02-7c9acba52b2b/crucible ec3fcfea-8287-4e80-8f53-7967a939db01 none none off - oxp_95fbb110-5272-4646-ab50-21b31b7cde23/crucible 9cc9e83b-d758-4be4-b9c5-5ab4e0d0c201 none none off - oxp_9bf35cd7-4938-4c34-8189-288b3195cb64/crucible 4e7dac6e-b754-4911-89c1-1c9cd6a68ace none none off - oxp_9d833141-18a1-4f24-8a34-6076c026aa87/crucible 4f33ef0a-829e-48c1-b5b9-a4e11f0f38c3 none none off - oxp_a279461f-a7b9-413f-a79f-cb4dab4c3fce/crucible 259a9726-27bc-495e-b7d2-29c884561005 none none off - oxp_ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59/crucible df77d6ef-0910-433c-a7a5-baef6c34fc86 none none off - oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/internal_dns e43ceee2-3657-4145-8e8f-fac08f34573b none none off - oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone dc72e5ba-059c-4075-9d2c-7c69116e17ec none none off - oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crypt/zone 64a09f6f-3aa2-416d-a133-bfa44af9e83c none none off - oxp_4e91d4a3-bb6c-44bb-bd4e-bf8913c1ba2b/crypt/zone 48679db3-ca47-4bde-8ee7-6a6b2ab2afdb none none off - oxp_67de3a80-29cb-4066-b743-e285a2ca1f4e/crypt/zone 4177690d-bf09-45a1-add0-6c25f4d4806e none none off - oxp_9139b70f-c1d3-475d-8f02-7c9acba52b2b/crypt/zone 94e76685-337a-45ba-946f-e3ec5408c58a none none off - oxp_95fbb110-5272-4646-ab50-21b31b7cde23/crypt/zone bc07535b-996c-402d-b488-d6b959c7c267 none none off - oxp_9bf35cd7-4938-4c34-8189-288b3195cb64/crypt/zone 5e6eb3f4-a68a-418a-917b-3beafd068acd none none off - oxp_9d833141-18a1-4f24-8a34-6076c026aa87/crypt/zone 34f23c48-7d0a-4d83-98f8-4746e14a3315 none none off - oxp_a279461f-a7b9-413f-a79f-cb4dab4c3fce/crypt/zone 70723c5d-41ba-47db-bb36-47ccc07325de none none off - oxp_ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59/crypt/zone f33074db-c35d-4cd8-a701-c28334be71d8 none none off - oxp_ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59/crypt/zone/oxz_crucible_052553cb-8a1a-42a4-a6cb-97a913e78877 7f96c7eb-3117-4d62-92ff-04ca0b4d4a93 none none off - oxp_67de3a80-29cb-4066-b743-e285a2ca1f4e/crypt/zone/oxz_crucible_1bd2301a-acd3-4a9c-82d7-b0c19a3c5597 973ab9e7-2437-4d00-b6d4-61f19e352a2e none none off - oxp_9d833141-18a1-4f24-8a34-6076c026aa87/crypt/zone/oxz_crucible_7975aa01-6fa9-4622-a8ba-8bfcf000f8eb 3c378515-facd-4c9f-b2b3-0920fe04456d none none off - oxp_9139b70f-c1d3-475d-8f02-7c9acba52b2b/crypt/zone/oxz_crucible_85286e23-2498-4034-9999-c5263fc0295f 5eaa35c8-c0b4-40ad-ba1d-2ba9286b1acd none none off - oxp_a279461f-a7b9-413f-a79f-cb4dab4c3fce/crypt/zone/oxz_crucible_a320b746-b5f6-4027-9c3c-d41e099f2def 0e65e617-9258-4b02-a0a5-76ce1b5c65d9 none none off - oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crypt/zone/oxz_crucible_dcd393d4-d16c-41a8-8c16-48e0ab80d2e2 c2de0977-abf7-4c6c-b8ce-425c10d8da09 none none off - oxp_4e91d4a3-bb6c-44bb-bd4e-bf8913c1ba2b/crypt/zone/oxz_crucible_de34e868-675e-4291-a2f7-c0b24e2e18a1 6afaa452-d2ff-4ea9-ad6e-b0b59183ef2b none none off - oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone/oxz_crucible_e11dd8a6-951a-4019-8775-bed3a2092aaa b3cd735d-4d94-412a-9a25-06b9fab912e0 none none off - oxp_9bf35cd7-4938-4c34-8189-288b3195cb64/crypt/zone/oxz_crucible_f8cdd98e-4ab4-46bb-b621-7590808582cc 4befe2e1-3d46-4b61-a92a-66f27db0df0e none none off - oxp_95fbb110-5272-4646-ab50-21b31b7cde23/crypt/zone/oxz_crucible_fcccf363-d190-441c-ba40-58e24f8a9cb3 82c66769-fc0d-49df-bb32-bc7f61892134 none none off - oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone/oxz_crucible_pantry_a22472df-5df2-4c1f-ad1f-439a4164984f 2b22a609-539c-478a-939e-ba25068d31ee none none off - oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone/oxz_internal_dns_936b1cbb-84e5-48ab-bc59-3bbd7830a421 1f4d6d18-0bdf-4e39-b838-b82fb1eac0e0 none none off - oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone/oxz_nexus_33ef9872-ee9a-4478-89b9-b22b78e00d3a 7924cb4a-4be3-4346-820a-04bfdb3c03a8 none none off - oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone/oxz_ntp_52031fcc-eb18-45f5-ae6c-65c7858b5e93 44dce497-2648-40ab-9a0f-d896c9b61db1 none none off - oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/debug a5a387a4-2e8d-4038-b386-bf1dffc96d41 100 GiB none gzip-9 - oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crypt/debug c61256ce-c152-4658-8e49-b31f65b615e8 100 GiB none gzip-9 - oxp_4e91d4a3-bb6c-44bb-bd4e-bf8913c1ba2b/crypt/debug 52828e06-cdaf-4291-9d1c-b5b1f42515af 100 GiB none gzip-9 - oxp_67de3a80-29cb-4066-b743-e285a2ca1f4e/crypt/debug 4173e69d-fb09-4068-a3f9-23638e968082 100 GiB none gzip-9 - oxp_9139b70f-c1d3-475d-8f02-7c9acba52b2b/crypt/debug bf42b426-4b74-433b-bc3e-7d4e7f1afba4 100 GiB none gzip-9 - oxp_95fbb110-5272-4646-ab50-21b31b7cde23/crypt/debug 250aa09f-3953-4ce6-8160-67ecabc98add 100 GiB none gzip-9 - oxp_9bf35cd7-4938-4c34-8189-288b3195cb64/crypt/debug 34a79944-be59-4246-afda-b676e91afddb 100 GiB none gzip-9 - oxp_9d833141-18a1-4f24-8a34-6076c026aa87/crypt/debug 9d168de0-6b87-405d-b4fc-926b381b0c45 100 GiB none gzip-9 - oxp_a279461f-a7b9-413f-a79f-cb4dab4c3fce/crypt/debug 9ace6e03-ed94-4444-b524-c3978461964c 100 GiB none gzip-9 - oxp_ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59/crypt/debug f43393b3-98ce-48b7-9c97-cb25b5a93130 100 GiB none gzip-9 -+ oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crypt/zone/oxz_crucible_pantry_6b6843d6-062c-4400-8fd9-d11b5d138fe6 204afeeb-fde3-400f-b809-e1acfc11bf7e none none off -+ oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crypt/zone/oxz_nexus_75fb916b-4793-4cd0-873b-573768b1efe5 9a3ecdfc-970b-4376-8f89-7fe8751ae9f5 none none off + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crucible 6faaf132-5e10-43a9-926c-abc32ad8b2fe in service none none off + oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crucible cbb904a8-0871-4038-933c-7393bbc0738c in service none none off + oxp_4e91d4a3-bb6c-44bb-bd4e-bf8913c1ba2b/crucible 75b0260f-d857-434f-b0a6-d1b0b23702e2 in service none none off + oxp_67de3a80-29cb-4066-b743-e285a2ca1f4e/crucible 80f92c60-b0f3-4841-ae1d-350f9263c51f in service none none off + oxp_9139b70f-c1d3-475d-8f02-7c9acba52b2b/crucible ec3fcfea-8287-4e80-8f53-7967a939db01 in service none none off + oxp_95fbb110-5272-4646-ab50-21b31b7cde23/crucible 9cc9e83b-d758-4be4-b9c5-5ab4e0d0c201 in service none none off + oxp_9bf35cd7-4938-4c34-8189-288b3195cb64/crucible 4e7dac6e-b754-4911-89c1-1c9cd6a68ace in service none none off + oxp_9d833141-18a1-4f24-8a34-6076c026aa87/crucible 4f33ef0a-829e-48c1-b5b9-a4e11f0f38c3 in service none none off + oxp_a279461f-a7b9-413f-a79f-cb4dab4c3fce/crucible 259a9726-27bc-495e-b7d2-29c884561005 in service none none off + oxp_ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59/crucible df77d6ef-0910-433c-a7a5-baef6c34fc86 in service none none off + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/internal_dns e43ceee2-3657-4145-8e8f-fac08f34573b in service none none off + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone dc72e5ba-059c-4075-9d2c-7c69116e17ec in service none none off + oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crypt/zone 64a09f6f-3aa2-416d-a133-bfa44af9e83c in service none none off + oxp_4e91d4a3-bb6c-44bb-bd4e-bf8913c1ba2b/crypt/zone 48679db3-ca47-4bde-8ee7-6a6b2ab2afdb in service none none off + oxp_67de3a80-29cb-4066-b743-e285a2ca1f4e/crypt/zone 4177690d-bf09-45a1-add0-6c25f4d4806e in service none none off + oxp_9139b70f-c1d3-475d-8f02-7c9acba52b2b/crypt/zone 94e76685-337a-45ba-946f-e3ec5408c58a in service none none off + oxp_95fbb110-5272-4646-ab50-21b31b7cde23/crypt/zone bc07535b-996c-402d-b488-d6b959c7c267 in service none none off + oxp_9bf35cd7-4938-4c34-8189-288b3195cb64/crypt/zone 5e6eb3f4-a68a-418a-917b-3beafd068acd in service none none off + oxp_9d833141-18a1-4f24-8a34-6076c026aa87/crypt/zone 34f23c48-7d0a-4d83-98f8-4746e14a3315 in service none none off + oxp_a279461f-a7b9-413f-a79f-cb4dab4c3fce/crypt/zone 70723c5d-41ba-47db-bb36-47ccc07325de in service none none off + oxp_ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59/crypt/zone f33074db-c35d-4cd8-a701-c28334be71d8 in service none none off + oxp_ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59/crypt/zone/oxz_crucible_052553cb-8a1a-42a4-a6cb-97a913e78877 7f96c7eb-3117-4d62-92ff-04ca0b4d4a93 in service none none off + oxp_67de3a80-29cb-4066-b743-e285a2ca1f4e/crypt/zone/oxz_crucible_1bd2301a-acd3-4a9c-82d7-b0c19a3c5597 973ab9e7-2437-4d00-b6d4-61f19e352a2e in service none none off + oxp_9d833141-18a1-4f24-8a34-6076c026aa87/crypt/zone/oxz_crucible_7975aa01-6fa9-4622-a8ba-8bfcf000f8eb 3c378515-facd-4c9f-b2b3-0920fe04456d in service none none off + oxp_9139b70f-c1d3-475d-8f02-7c9acba52b2b/crypt/zone/oxz_crucible_85286e23-2498-4034-9999-c5263fc0295f 5eaa35c8-c0b4-40ad-ba1d-2ba9286b1acd in service none none off + oxp_a279461f-a7b9-413f-a79f-cb4dab4c3fce/crypt/zone/oxz_crucible_a320b746-b5f6-4027-9c3c-d41e099f2def 0e65e617-9258-4b02-a0a5-76ce1b5c65d9 in service none none off + oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crypt/zone/oxz_crucible_dcd393d4-d16c-41a8-8c16-48e0ab80d2e2 c2de0977-abf7-4c6c-b8ce-425c10d8da09 in service none none off + oxp_4e91d4a3-bb6c-44bb-bd4e-bf8913c1ba2b/crypt/zone/oxz_crucible_de34e868-675e-4291-a2f7-c0b24e2e18a1 6afaa452-d2ff-4ea9-ad6e-b0b59183ef2b in service none none off + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone/oxz_crucible_e11dd8a6-951a-4019-8775-bed3a2092aaa b3cd735d-4d94-412a-9a25-06b9fab912e0 in service none none off + oxp_9bf35cd7-4938-4c34-8189-288b3195cb64/crypt/zone/oxz_crucible_f8cdd98e-4ab4-46bb-b621-7590808582cc 4befe2e1-3d46-4b61-a92a-66f27db0df0e in service none none off + oxp_95fbb110-5272-4646-ab50-21b31b7cde23/crypt/zone/oxz_crucible_fcccf363-d190-441c-ba40-58e24f8a9cb3 82c66769-fc0d-49df-bb32-bc7f61892134 in service none none off + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone/oxz_crucible_pantry_a22472df-5df2-4c1f-ad1f-439a4164984f 2b22a609-539c-478a-939e-ba25068d31ee in service none none off + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone/oxz_internal_dns_936b1cbb-84e5-48ab-bc59-3bbd7830a421 1f4d6d18-0bdf-4e39-b838-b82fb1eac0e0 in service none none off + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone/oxz_nexus_33ef9872-ee9a-4478-89b9-b22b78e00d3a 7924cb4a-4be3-4346-820a-04bfdb3c03a8 in service none none off + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone/oxz_ntp_52031fcc-eb18-45f5-ae6c-65c7858b5e93 44dce497-2648-40ab-9a0f-d896c9b61db1 in service none none off + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/debug a5a387a4-2e8d-4038-b386-bf1dffc96d41 in service 100 GiB none gzip-9 + oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crypt/debug c61256ce-c152-4658-8e49-b31f65b615e8 in service 100 GiB none gzip-9 + oxp_4e91d4a3-bb6c-44bb-bd4e-bf8913c1ba2b/crypt/debug 52828e06-cdaf-4291-9d1c-b5b1f42515af in service 100 GiB none gzip-9 + oxp_67de3a80-29cb-4066-b743-e285a2ca1f4e/crypt/debug 4173e69d-fb09-4068-a3f9-23638e968082 in service 100 GiB none gzip-9 + oxp_9139b70f-c1d3-475d-8f02-7c9acba52b2b/crypt/debug bf42b426-4b74-433b-bc3e-7d4e7f1afba4 in service 100 GiB none gzip-9 + oxp_95fbb110-5272-4646-ab50-21b31b7cde23/crypt/debug 250aa09f-3953-4ce6-8160-67ecabc98add in service 100 GiB none gzip-9 + oxp_9bf35cd7-4938-4c34-8189-288b3195cb64/crypt/debug 34a79944-be59-4246-afda-b676e91afddb in service 100 GiB none gzip-9 + oxp_9d833141-18a1-4f24-8a34-6076c026aa87/crypt/debug 9d168de0-6b87-405d-b4fc-926b381b0c45 in service 100 GiB none gzip-9 + oxp_a279461f-a7b9-413f-a79f-cb4dab4c3fce/crypt/debug 9ace6e03-ed94-4444-b524-c3978461964c in service 100 GiB none gzip-9 + oxp_ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59/crypt/debug f43393b3-98ce-48b7-9c97-cb25b5a93130 in service 100 GiB none gzip-9 ++ oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crypt/zone/oxz_crucible_pantry_6b6843d6-062c-4400-8fd9-d11b5d138fe6 204afeeb-fde3-400f-b809-e1acfc11bf7e in service none none off ++ oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crypt/zone/oxz_nexus_75fb916b-4793-4cd0-873b-573768b1efe5 9a3ecdfc-970b-4376-8f89-7fe8751ae9f5 in service none none off omicron zones generation 2 -> 3: @@ -222,58 +222,58 @@ to: blueprint 1ac2d88f-27dd-4506-8585-6b2be832528e datasets generation 2 -> 3: - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_07068f19-1ff2-48da-8e72-874780df2339/crucible 43cd1a3a-7dcf-47a2-bf7f-1042c9ed4461 none none off - oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crucible b934756b-aff6-4435-bf59-42fcdb5433ef none none off - oxp_0fdb4a39-3cd5-47a0-9064-e7f3c285af61/crucible 476e6363-ef7a-4538-9906-61380605378a none none off - oxp_13572832-83ad-40d6-896a-751f7e53f4f6/crucible 3b15616c-0339-4816-a057-1c9ca76bc5d9 none none off - oxp_3602bdd9-f7bb-4490-87a6-8f061f7712f5/crucible 3fa34ab2-ae9e-4633-bf8f-e0b985591f55 none none off - oxp_65707837-95a4-45d7-84e6-8b9a4da215f1/crucible 86cbb449-770b-4ef0-bbdd-e66c96abecb9 none none off - oxp_7a43b2b0-3846-401c-8317-d555715a00f7/crucible 912ebbe4-bef6-4cf7-92a5-e21eb72fbf87 none none off - oxp_855e3ef1-6929-4e21-8451-0e62bd93c7c9/crucible 4ff0cc73-4531-4717-a130-cb28345ddea2 none none off - oxp_8adcf329-4cee-4075-b798-28b5add1edf5/crucible 3d95ffb6-833e-4e1a-a660-6f1544221ed5 none none off - oxp_99e926d6-bd42-4cde-9f63-5ecc7ea14322/crucible bc0f19c5-73af-4c32-97e4-51bee5a874de none none off - oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/internal_dns 5fe43d44-e28d-4343-b09b-06115e410cfc none none off - oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone 19c47885-6b4a-45c6-8dd6-8f3530737df1 none none off - oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crypt/zone 1ffa3016-9c49-47f1-a443-429cc5ee72ff none none off - oxp_0fdb4a39-3cd5-47a0-9064-e7f3c285af61/crypt/zone f21e6928-e9c2-4eff-a710-1e6034948aad none none off - oxp_13572832-83ad-40d6-896a-751f7e53f4f6/crypt/zone ec753ba9-fa33-4e83-9cd2-7a0eb75f3825 none none off - oxp_3602bdd9-f7bb-4490-87a6-8f061f7712f5/crypt/zone 08a7b1b4-2fe9-4412-b847-de67413835d8 none none off - oxp_65707837-95a4-45d7-84e6-8b9a4da215f1/crypt/zone d1404c52-a67c-4d5a-82ee-381fc43e7906 none none off - oxp_7a43b2b0-3846-401c-8317-d555715a00f7/crypt/zone ddef09d3-762e-40b1-b484-03bfa2da3bd9 none none off - oxp_855e3ef1-6929-4e21-8451-0e62bd93c7c9/crypt/zone 51d6f7a3-386d-4d17-9898-ccc9e8da2b2b none none off - oxp_8adcf329-4cee-4075-b798-28b5add1edf5/crypt/zone 21095495-e67e-4f2f-ad5a-3382350b51b9 none none off - oxp_99e926d6-bd42-4cde-9f63-5ecc7ea14322/crypt/zone 36b5605c-d6c0-4963-a4eb-5090988da393 none none off - oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_crucible_40f9f06b-eed5-47b9-9925-8afd5540d9f5 73f22559-8377-43cf-b028-4164d68826c9 none none off - oxp_13572832-83ad-40d6-896a-751f7e53f4f6/crypt/zone/oxz_crucible_4561a213-e297-41d2-b40d-995b35715ede c49aa53a-775f-4d2f-bb60-931e82c9d837 none none off - oxp_99e926d6-bd42-4cde-9f63-5ecc7ea14322/crypt/zone/oxz_crucible_5e41815b-3aa2-4507-b3ea-3694c0e05b34 da3da14c-05b9-4922-b7a4-be05f23d1da8 none none off - oxp_7a43b2b0-3846-401c-8317-d555715a00f7/crypt/zone/oxz_crucible_619451af-30b4-4252-9688-379be6555534 da3ab91c-ffa8-46e4-8a4a-de8a56e02315 none none off - oxp_0fdb4a39-3cd5-47a0-9064-e7f3c285af61/crypt/zone/oxz_crucible_64f9bfcb-c1d5-4f15-a877-778ba83c4ada 07c46767-93f4-43df-8dcd-25abf3aaf296 none none off - oxp_8adcf329-4cee-4075-b798-28b5add1edf5/crypt/zone/oxz_crucible_a6ac7172-669b-4ac1-9532-2848bcb80545 dc27c769-7880-439e-84c7-29c92880a219 none none off - oxp_65707837-95a4-45d7-84e6-8b9a4da215f1/crypt/zone/oxz_crucible_e65276c2-baeb-4ab1-9a37-e48786f14dad dceafe94-f4df-4556-9a46-560c59069e46 none none off - oxp_3602bdd9-f7bb-4490-87a6-8f061f7712f5/crypt/zone/oxz_crucible_e6788bd0-ac6e-4125-93d0-aacbc6380f04 d730d05e-7a17-442e-9959-2e0ea58860c5 none none off - oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crypt/zone/oxz_crucible_ea37e4ab-65c6-463a-a2d4-9cf8f0ccbd00 4035218d-b1ed-422a-a202-4f4fd19767b6 none none off - oxp_855e3ef1-6929-4e21-8451-0e62bd93c7c9/crypt/zone/oxz_crucible_f52b4e76-5989-42cf-9208-60548c34b487 a8d1ad8b-946f-46e9-8bc3-4aaae1ca31f6 none none off - oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_crucible_pantry_4c1e95a8-7fae-4a3a-8651-9272ef7c9a88 53123c3d-64d2-432d-b72c-9e0c41ffa805 none none off - oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_internal_dns_7b2bb1aa-639b-4aaa-bd80-9c680e4be5fc f24ddc4e-2569-4447-ad1a-e1e0da2e7b41 none none off - oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_nexus_294379f6-502c-465b-b32d-771c415a38af 61bd7f63-49c5-481e-8f1e-075642b59fa9 none none off - oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_ntp_064ec0c2-a320-4efb-b006-9e0e1d942d8e 701a8f75-31f5-404f-ad44-1659106f80dd none none off - oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/debug ba8224f4-9d26-4fa8-89ac-830e5734c58e 100 GiB none gzip-9 - oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crypt/debug 73d82f70-9ae4-4212-bc41-42aa7cd6d5c2 100 GiB none gzip-9 - oxp_0fdb4a39-3cd5-47a0-9064-e7f3c285af61/crypt/debug 71bbed5f-6b13-41f8-87e1-1dff19e2680f 100 GiB none gzip-9 - oxp_13572832-83ad-40d6-896a-751f7e53f4f6/crypt/debug bd2e7c19-590f-476e-9eb1-b1cabe99600a 100 GiB none gzip-9 - oxp_3602bdd9-f7bb-4490-87a6-8f061f7712f5/crypt/debug 12b10546-bc67-43c4-993b-adcc04aa2b3f 100 GiB none gzip-9 - oxp_65707837-95a4-45d7-84e6-8b9a4da215f1/crypt/debug 08d9c58d-fe91-4b9c-9db8-0b32e3b7f4e0 100 GiB none gzip-9 - oxp_7a43b2b0-3846-401c-8317-d555715a00f7/crypt/debug e7e5170c-5547-4733-885b-3fc385e97941 100 GiB none gzip-9 - oxp_855e3ef1-6929-4e21-8451-0e62bd93c7c9/crypt/debug 1097db6f-ea2d-46cb-9a1f-be933677f4ea 100 GiB none gzip-9 - oxp_8adcf329-4cee-4075-b798-28b5add1edf5/crypt/debug 10e453e2-115f-42dd-a575-10a593b56762 100 GiB none gzip-9 - oxp_99e926d6-bd42-4cde-9f63-5ecc7ea14322/crypt/debug a5162371-5108-497f-a3de-2b95a0dfafbe 100 GiB none gzip-9 -+ oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/clickhouse dd8bc8e6-1103-4425-82da-0f7df6951581 none none off -+ oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crypt/internal_dns a1b355d4-5b1d-406d-960f-e61e30c2aa2a none none off -+ oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_clickhouse_a5813480-2b89-4e18-a09b-c9e5b6b317cc c113e4ea-c33e-4df0-957b-5f7a856d5214 none none off -+ oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crypt/zone/oxz_internal_dns_d74f14f1-0a19-4d92-b76f-1b3a6e630b2c 672e989c-aec3-4fd9-b7f9-f2af75b3bc01 none none off + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_07068f19-1ff2-48da-8e72-874780df2339/crucible 43cd1a3a-7dcf-47a2-bf7f-1042c9ed4461 in service none none off + oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crucible b934756b-aff6-4435-bf59-42fcdb5433ef in service none none off + oxp_0fdb4a39-3cd5-47a0-9064-e7f3c285af61/crucible 476e6363-ef7a-4538-9906-61380605378a in service none none off + oxp_13572832-83ad-40d6-896a-751f7e53f4f6/crucible 3b15616c-0339-4816-a057-1c9ca76bc5d9 in service none none off + oxp_3602bdd9-f7bb-4490-87a6-8f061f7712f5/crucible 3fa34ab2-ae9e-4633-bf8f-e0b985591f55 in service none none off + oxp_65707837-95a4-45d7-84e6-8b9a4da215f1/crucible 86cbb449-770b-4ef0-bbdd-e66c96abecb9 in service none none off + oxp_7a43b2b0-3846-401c-8317-d555715a00f7/crucible 912ebbe4-bef6-4cf7-92a5-e21eb72fbf87 in service none none off + oxp_855e3ef1-6929-4e21-8451-0e62bd93c7c9/crucible 4ff0cc73-4531-4717-a130-cb28345ddea2 in service none none off + oxp_8adcf329-4cee-4075-b798-28b5add1edf5/crucible 3d95ffb6-833e-4e1a-a660-6f1544221ed5 in service none none off + oxp_99e926d6-bd42-4cde-9f63-5ecc7ea14322/crucible bc0f19c5-73af-4c32-97e4-51bee5a874de in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/internal_dns 5fe43d44-e28d-4343-b09b-06115e410cfc in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone 19c47885-6b4a-45c6-8dd6-8f3530737df1 in service none none off + oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crypt/zone 1ffa3016-9c49-47f1-a443-429cc5ee72ff in service none none off + oxp_0fdb4a39-3cd5-47a0-9064-e7f3c285af61/crypt/zone f21e6928-e9c2-4eff-a710-1e6034948aad in service none none off + oxp_13572832-83ad-40d6-896a-751f7e53f4f6/crypt/zone ec753ba9-fa33-4e83-9cd2-7a0eb75f3825 in service none none off + oxp_3602bdd9-f7bb-4490-87a6-8f061f7712f5/crypt/zone 08a7b1b4-2fe9-4412-b847-de67413835d8 in service none none off + oxp_65707837-95a4-45d7-84e6-8b9a4da215f1/crypt/zone d1404c52-a67c-4d5a-82ee-381fc43e7906 in service none none off + oxp_7a43b2b0-3846-401c-8317-d555715a00f7/crypt/zone ddef09d3-762e-40b1-b484-03bfa2da3bd9 in service none none off + oxp_855e3ef1-6929-4e21-8451-0e62bd93c7c9/crypt/zone 51d6f7a3-386d-4d17-9898-ccc9e8da2b2b in service none none off + oxp_8adcf329-4cee-4075-b798-28b5add1edf5/crypt/zone 21095495-e67e-4f2f-ad5a-3382350b51b9 in service none none off + oxp_99e926d6-bd42-4cde-9f63-5ecc7ea14322/crypt/zone 36b5605c-d6c0-4963-a4eb-5090988da393 in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_crucible_40f9f06b-eed5-47b9-9925-8afd5540d9f5 73f22559-8377-43cf-b028-4164d68826c9 in service none none off + oxp_13572832-83ad-40d6-896a-751f7e53f4f6/crypt/zone/oxz_crucible_4561a213-e297-41d2-b40d-995b35715ede c49aa53a-775f-4d2f-bb60-931e82c9d837 in service none none off + oxp_99e926d6-bd42-4cde-9f63-5ecc7ea14322/crypt/zone/oxz_crucible_5e41815b-3aa2-4507-b3ea-3694c0e05b34 da3da14c-05b9-4922-b7a4-be05f23d1da8 in service none none off + oxp_7a43b2b0-3846-401c-8317-d555715a00f7/crypt/zone/oxz_crucible_619451af-30b4-4252-9688-379be6555534 da3ab91c-ffa8-46e4-8a4a-de8a56e02315 in service none none off + oxp_0fdb4a39-3cd5-47a0-9064-e7f3c285af61/crypt/zone/oxz_crucible_64f9bfcb-c1d5-4f15-a877-778ba83c4ada 07c46767-93f4-43df-8dcd-25abf3aaf296 in service none none off + oxp_8adcf329-4cee-4075-b798-28b5add1edf5/crypt/zone/oxz_crucible_a6ac7172-669b-4ac1-9532-2848bcb80545 dc27c769-7880-439e-84c7-29c92880a219 in service none none off + oxp_65707837-95a4-45d7-84e6-8b9a4da215f1/crypt/zone/oxz_crucible_e65276c2-baeb-4ab1-9a37-e48786f14dad dceafe94-f4df-4556-9a46-560c59069e46 in service none none off + oxp_3602bdd9-f7bb-4490-87a6-8f061f7712f5/crypt/zone/oxz_crucible_e6788bd0-ac6e-4125-93d0-aacbc6380f04 d730d05e-7a17-442e-9959-2e0ea58860c5 in service none none off + oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crypt/zone/oxz_crucible_ea37e4ab-65c6-463a-a2d4-9cf8f0ccbd00 4035218d-b1ed-422a-a202-4f4fd19767b6 in service none none off + oxp_855e3ef1-6929-4e21-8451-0e62bd93c7c9/crypt/zone/oxz_crucible_f52b4e76-5989-42cf-9208-60548c34b487 a8d1ad8b-946f-46e9-8bc3-4aaae1ca31f6 in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_crucible_pantry_4c1e95a8-7fae-4a3a-8651-9272ef7c9a88 53123c3d-64d2-432d-b72c-9e0c41ffa805 in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_internal_dns_7b2bb1aa-639b-4aaa-bd80-9c680e4be5fc f24ddc4e-2569-4447-ad1a-e1e0da2e7b41 in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_nexus_294379f6-502c-465b-b32d-771c415a38af 61bd7f63-49c5-481e-8f1e-075642b59fa9 in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_ntp_064ec0c2-a320-4efb-b006-9e0e1d942d8e 701a8f75-31f5-404f-ad44-1659106f80dd in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/debug ba8224f4-9d26-4fa8-89ac-830e5734c58e in service 100 GiB none gzip-9 + oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crypt/debug 73d82f70-9ae4-4212-bc41-42aa7cd6d5c2 in service 100 GiB none gzip-9 + oxp_0fdb4a39-3cd5-47a0-9064-e7f3c285af61/crypt/debug 71bbed5f-6b13-41f8-87e1-1dff19e2680f in service 100 GiB none gzip-9 + oxp_13572832-83ad-40d6-896a-751f7e53f4f6/crypt/debug bd2e7c19-590f-476e-9eb1-b1cabe99600a in service 100 GiB none gzip-9 + oxp_3602bdd9-f7bb-4490-87a6-8f061f7712f5/crypt/debug 12b10546-bc67-43c4-993b-adcc04aa2b3f in service 100 GiB none gzip-9 + oxp_65707837-95a4-45d7-84e6-8b9a4da215f1/crypt/debug 08d9c58d-fe91-4b9c-9db8-0b32e3b7f4e0 in service 100 GiB none gzip-9 + oxp_7a43b2b0-3846-401c-8317-d555715a00f7/crypt/debug e7e5170c-5547-4733-885b-3fc385e97941 in service 100 GiB none gzip-9 + oxp_855e3ef1-6929-4e21-8451-0e62bd93c7c9/crypt/debug 1097db6f-ea2d-46cb-9a1f-be933677f4ea in service 100 GiB none gzip-9 + oxp_8adcf329-4cee-4075-b798-28b5add1edf5/crypt/debug 10e453e2-115f-42dd-a575-10a593b56762 in service 100 GiB none gzip-9 + oxp_99e926d6-bd42-4cde-9f63-5ecc7ea14322/crypt/debug a5162371-5108-497f-a3de-2b95a0dfafbe in service 100 GiB none gzip-9 ++ oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/clickhouse dd8bc8e6-1103-4425-82da-0f7df6951581 in service none none off ++ oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crypt/internal_dns a1b355d4-5b1d-406d-960f-e61e30c2aa2a in service none none off ++ oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_clickhouse_a5813480-2b89-4e18-a09b-c9e5b6b317cc c113e4ea-c33e-4df0-957b-5f7a856d5214 in service none none off ++ oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crypt/zone/oxz_internal_dns_d74f14f1-0a19-4d92-b76f-1b3a6e630b2c 672e989c-aec3-4fd9-b7f9-f2af75b3bc01 in service none none off omicron zones generation 2 -> 3: diff --git a/nexus/reconfigurator/planning/tests/output/planner_deploy_all_keeper_nodes_1_2.txt b/nexus/reconfigurator/planning/tests/output/planner_deploy_all_keeper_nodes_1_2.txt index 60d5c9fe354..0bde24adbaf 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_deploy_all_keeper_nodes_1_2.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_deploy_all_keeper_nodes_1_2.txt @@ -22,58 +22,58 @@ to: blueprint 31ef2071-2ec9-49d9-8827-fd83b17a0e3d datasets generation 2 -> 3: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crucible 723e4ec2-5f4a-48a9-a6a1-cb523dc47d3d none none off - oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crucible b2796e6b-ad7d-41a5-82a6-947b96e42d47 none none off - oxp_736d4cab-c262-485e-89c2-07e6543f0855/crucible c993b4da-bea9-4010-a8d6-17d733698f07 none none off - oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crucible 4f497ece-88c1-4557-a8b4-0e990f9941a9 none none off - oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crucible 43a16c22-e79a-4bea-bcf6-682099a728dd none none off - oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crucible b6bbb45b-68fc-4fa5-86cc-b59b0f797fb2 none none off - oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crucible e4838ed0-304f-475e-a282-9f644f2ba3e5 none none off - oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crucible 046f2730-768d-4bcc-8ebf-4b5f5597151c none none off - oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crucible 0830fc6d-ed82-41de-9389-0bd3fd4677ea none none off - oxp_fbf997ef-52d3-438a-b036-b9117322e569/crucible d9662141-585e-4e18-a461-9627097f02a2 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/clickhouse a4f84c49-4303-411f-bb1b-08877d828946 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/internal_dns 2edca3dc-a0e5-4d34-b8a2-065be4cca767 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone 87cd9f37-3de3-457c-9412-d0dc5678eda8 none none off - oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/zone 3a164f36-1f53-45b3-b190-ad8a2817bc69 none none off - oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/zone 407556ed-09ab-430e-bc8f-8291b8f8c8fe none none off - oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/zone 99d57d61-f12a-4b56-8114-86ba92d07649 none none off - oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/zone da1eb596-8764-4268-a60b-f4705b4f615b none none off - oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/zone d555bf19-887c-48d2-8144-47c2eac9a9e8 none none off - oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/zone 9785e77a-9422-4b46-a4ae-8b9a155eb121 none none off - oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/zone 1192a37c-a871-4c48-905d-03c3d6035bdc none none off - oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/zone 7bf1c7ec-5465-4bfd-b1d9-939f05336012 none none off - oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/zone be526b44-2c78-49ec-8ab4-73e161e27f22 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_clickhouse_35e8d4b6-ea92-45cf-923c-3f566a0b1fe5 cd7e5c3a-2328-4568-b8f8-cf349f0cdd12 none none off - oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/zone/oxz_crucible_044d074d-7905-4024-82ff-68d76221db68 98fd0f42-7337-4ce7-814e-f988304b8873 none none off - oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/zone/oxz_crucible_28826473-ac0b-41ea-8c54-72b782db1bcb bbda84d8-c4ca-4f52-a766-681872fa06f0 none none off - oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/zone/oxz_crucible_2d3ff798-dda9-4ccf-8f91-070a20f06d55 e9c77dbd-c56a-404c-8ff9-6504b3f92556 none none off - oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/zone/oxz_crucible_7538d29b-69f2-43e8-8509-505b25cb1c84 19110f8a-6267-41ed-ac7d-539cd0fe3511 none none off - oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/zone/oxz_crucible_8234bbd2-4b31-4f6b-8dcc-4744b1d14e64 0fe4f647-ffd2-4845-805a-c069096560ee none none off - oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/zone/oxz_crucible_85358363-cee8-4bc3-af66-4d89e5cd714f a1daa561-2448-4afb-8233-ec149d2bd7f4 none none off - oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/zone/oxz_crucible_9b58d04f-85bf-4f5e-8c6a-5d855062d5c4 69812f66-4b59-4590-9e1f-bce3e93b3b08 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_crucible_e7da0aec-c6b6-4a56-9525-35385b9c62a2 36e58025-88e2-4eb9-8af0-ed9a98dda1b9 none none off - oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/zone/oxz_crucible_f3f977cc-7eca-4491-9b07-82b6284eb169 482fad9a-d83f-4025-8f0b-d3adea6ae2cf none none off - oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/zone/oxz_crucible_fef381d2-8368-4a2d-96a1-c956ed011f7b b1937368-4019-40c4-af02-9811dc7eb143 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_crucible_pantry_fe63bfd3-3128-4675-8118-cf6968293471 e3b31ef3-6b54-4901-aec4-0c672de62c7f none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_internal_dns_b6b0689e-ef48-484d-b3c7-3c596edad20c 501e0672-2897-4992-8911-600e0283f04c none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_nexus_46ecde76-fef7-4394-93dd-d22b003148e9 53655959-866b-4fee-bcf9-1e35504ad625 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_ntp_4d009155-44fb-45b9-afed-f89cb57ce8da 0590facf-202a-463b-81be-b6e88c47da76 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/debug 8f7f16c1-d9fb-4405-9dcf-68bfbaa7bf8c 100 GiB none gzip-9 - oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/debug 6482f332-801a-473f-a77d-e07d30e2a5b7 100 GiB none gzip-9 - oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/debug 0bb0541f-2c64-487b-a8af-162454207504 100 GiB none gzip-9 - oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/debug 902a6889-244f-4b67-baa4-b245f3d622c8 100 GiB none gzip-9 - oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/debug 667ffd3c-6735-4b50-bc3b-cfa32fcc811e 100 GiB none gzip-9 - oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/debug cf48ba87-a4bb-435f-999b-bca46cfd6a89 100 GiB none gzip-9 - oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/debug 7d64cab3-7311-4519-ae4a-1af6b320fa9b 100 GiB none gzip-9 - oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/debug d3e957fd-5f26-498a-8fa3-deaea4dc5820 100 GiB none gzip-9 - oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/debug 4da77f4a-5e41-4604-af30-8cf568c38428 100 GiB none gzip-9 - oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/debug 03935cb1-ce06-4594-b2fe-23e127d1cd9d 100 GiB none gzip-9 -+ oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/clickhouse_keeper 04ee4b4b-fcbe-4224-86fd-30144a4f2592 none none off -+ oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_clickhouse_keeper_dd5ab8b1-e6e7-40e0-9ea6-b6a16f485b52 a51fb98f-3fff-4c0a-82f0-7a4aad82096b none none off + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crucible 723e4ec2-5f4a-48a9-a6a1-cb523dc47d3d in service none none off + oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crucible b2796e6b-ad7d-41a5-82a6-947b96e42d47 in service none none off + oxp_736d4cab-c262-485e-89c2-07e6543f0855/crucible c993b4da-bea9-4010-a8d6-17d733698f07 in service none none off + oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crucible 4f497ece-88c1-4557-a8b4-0e990f9941a9 in service none none off + oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crucible 43a16c22-e79a-4bea-bcf6-682099a728dd in service none none off + oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crucible b6bbb45b-68fc-4fa5-86cc-b59b0f797fb2 in service none none off + oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crucible e4838ed0-304f-475e-a282-9f644f2ba3e5 in service none none off + oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crucible 046f2730-768d-4bcc-8ebf-4b5f5597151c in service none none off + oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crucible 0830fc6d-ed82-41de-9389-0bd3fd4677ea in service none none off + oxp_fbf997ef-52d3-438a-b036-b9117322e569/crucible d9662141-585e-4e18-a461-9627097f02a2 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/clickhouse a4f84c49-4303-411f-bb1b-08877d828946 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/internal_dns 2edca3dc-a0e5-4d34-b8a2-065be4cca767 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone 87cd9f37-3de3-457c-9412-d0dc5678eda8 in service none none off + oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/zone 3a164f36-1f53-45b3-b190-ad8a2817bc69 in service none none off + oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/zone 407556ed-09ab-430e-bc8f-8291b8f8c8fe in service none none off + oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/zone 99d57d61-f12a-4b56-8114-86ba92d07649 in service none none off + oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/zone da1eb596-8764-4268-a60b-f4705b4f615b in service none none off + oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/zone d555bf19-887c-48d2-8144-47c2eac9a9e8 in service none none off + oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/zone 9785e77a-9422-4b46-a4ae-8b9a155eb121 in service none none off + oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/zone 1192a37c-a871-4c48-905d-03c3d6035bdc in service none none off + oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/zone 7bf1c7ec-5465-4bfd-b1d9-939f05336012 in service none none off + oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/zone be526b44-2c78-49ec-8ab4-73e161e27f22 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_clickhouse_35e8d4b6-ea92-45cf-923c-3f566a0b1fe5 cd7e5c3a-2328-4568-b8f8-cf349f0cdd12 in service none none off + oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/zone/oxz_crucible_044d074d-7905-4024-82ff-68d76221db68 98fd0f42-7337-4ce7-814e-f988304b8873 in service none none off + oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/zone/oxz_crucible_28826473-ac0b-41ea-8c54-72b782db1bcb bbda84d8-c4ca-4f52-a766-681872fa06f0 in service none none off + oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/zone/oxz_crucible_2d3ff798-dda9-4ccf-8f91-070a20f06d55 e9c77dbd-c56a-404c-8ff9-6504b3f92556 in service none none off + oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/zone/oxz_crucible_7538d29b-69f2-43e8-8509-505b25cb1c84 19110f8a-6267-41ed-ac7d-539cd0fe3511 in service none none off + oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/zone/oxz_crucible_8234bbd2-4b31-4f6b-8dcc-4744b1d14e64 0fe4f647-ffd2-4845-805a-c069096560ee in service none none off + oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/zone/oxz_crucible_85358363-cee8-4bc3-af66-4d89e5cd714f a1daa561-2448-4afb-8233-ec149d2bd7f4 in service none none off + oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/zone/oxz_crucible_9b58d04f-85bf-4f5e-8c6a-5d855062d5c4 69812f66-4b59-4590-9e1f-bce3e93b3b08 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_crucible_e7da0aec-c6b6-4a56-9525-35385b9c62a2 36e58025-88e2-4eb9-8af0-ed9a98dda1b9 in service none none off + oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/zone/oxz_crucible_f3f977cc-7eca-4491-9b07-82b6284eb169 482fad9a-d83f-4025-8f0b-d3adea6ae2cf in service none none off + oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/zone/oxz_crucible_fef381d2-8368-4a2d-96a1-c956ed011f7b b1937368-4019-40c4-af02-9811dc7eb143 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_crucible_pantry_fe63bfd3-3128-4675-8118-cf6968293471 e3b31ef3-6b54-4901-aec4-0c672de62c7f in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_internal_dns_b6b0689e-ef48-484d-b3c7-3c596edad20c 501e0672-2897-4992-8911-600e0283f04c in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_nexus_46ecde76-fef7-4394-93dd-d22b003148e9 53655959-866b-4fee-bcf9-1e35504ad625 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_ntp_4d009155-44fb-45b9-afed-f89cb57ce8da 0590facf-202a-463b-81be-b6e88c47da76 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/debug 8f7f16c1-d9fb-4405-9dcf-68bfbaa7bf8c in service 100 GiB none gzip-9 + oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/debug 6482f332-801a-473f-a77d-e07d30e2a5b7 in service 100 GiB none gzip-9 + oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/debug 0bb0541f-2c64-487b-a8af-162454207504 in service 100 GiB none gzip-9 + oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/debug 902a6889-244f-4b67-baa4-b245f3d622c8 in service 100 GiB none gzip-9 + oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/debug 667ffd3c-6735-4b50-bc3b-cfa32fcc811e in service 100 GiB none gzip-9 + oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/debug cf48ba87-a4bb-435f-999b-bca46cfd6a89 in service 100 GiB none gzip-9 + oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/debug 7d64cab3-7311-4519-ae4a-1af6b320fa9b in service 100 GiB none gzip-9 + oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/debug d3e957fd-5f26-498a-8fa3-deaea4dc5820 in service 100 GiB none gzip-9 + oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/debug 4da77f4a-5e41-4604-af30-8cf568c38428 in service 100 GiB none gzip-9 + oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/debug 03935cb1-ce06-4594-b2fe-23e127d1cd9d in service 100 GiB none gzip-9 ++ oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/clickhouse_keeper 04ee4b4b-fcbe-4224-86fd-30144a4f2592 in service none none off ++ oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_clickhouse_keeper_dd5ab8b1-e6e7-40e0-9ea6-b6a16f485b52 a51fb98f-3fff-4c0a-82f0-7a4aad82096b in service none none off omicron zones generation 2 -> 3: @@ -117,58 +117,58 @@ to: blueprint 31ef2071-2ec9-49d9-8827-fd83b17a0e3d datasets generation 2 -> 3: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crucible f18270c8-a39b-4579-be20-d2d1b80bba42 none none off - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crucible 06c2af14-055c-4041-aa26-9155f9f42661 none none off - oxp_44484c44-477a-4676-8266-b98a00e80d79/crucible 9deffea6-d340-4432-be3c-fad135dc29a5 none none off - oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crucible 47ca08b9-b962-43e2-99d7-c2e0556c0f52 none none off - oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crucible b2e54e29-6915-4b6d-bc76-6f72e5c7c55a none none off - oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crucible cb992d4e-7a69-4bcd-96c8-fe6e40989e24 none none off - oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crucible 68338fc3-2d8b-4419-b33d-4cce6fe9380d none none off - oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crucible 5294b99c-3eac-40e1-a35b-1f1cf2f0d6bf none none off - oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crucible 31718dcf-ebd5-432c-a9e5-40abcb40931c none none off - oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crucible ff7ff4a9-21c4-499e-9ceb-8a00a4bb21bc none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/internal_dns 56a1af5d-de86-46c5-9504-2d1ee70587c5 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone 003c1d4e-15bb-4fca-aa71-a7dff507b124 none none off - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone bf35a148-62f0-4f88-8f60-0a13747daba2 none none off - oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/zone 9b1bf42e-6f06-44cc-af5b-bff65d929322 none none off - oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/zone 2c9d6bce-0293-4364-b8c9-4bdea345490e none none off - oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/zone 11726c79-6590-4831-8480-cf50e6322c8a none none off - oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/zone b463f0c2-3ae4-45f7-a38c-110731fcc5cb none none off - oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/zone 626abe12-321d-439b-ad8f-f8dfb2022f25 none none off - oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/zone 4200e2a7-0fd6-4631-9d60-21fd821193fe none none off - oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/zone 85f34c02-a35d-404e-8cde-bedf3e193b1c none none off - oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/zone dd19c2c5-0bc9-48de-a116-b92503569092 none none off - oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/zone/oxz_crucible_06b45c33-9a90-408b-8534-f94ab6df8a42 9e0a360d-c158-417f-a45f-9d29ee67cdce none none off - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone/oxz_crucible_32999e20-ed5c-4c25-b4bd-41a3fbaf1445 dd7a45b8-3175-4744-8b99-ce19b22bb8ce none none off - oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/zone/oxz_crucible_4a037563-f969-4028-8384-164bdf308c3c 0d5b2580-7190-4bcc-9982-5012dac51f05 none none off - oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/zone/oxz_crucible_6564394d-2c51-4252-b3b1-f5f88a72d7c3 26a1cc86-f717-4a12-b644-5acd168843aa none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_crucible_87427b40-5114-49cd-96bd-63edd61fce90 e7364079-58e3-4b36-81a7-b9e08f2a8fff none none off - oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/zone/oxz_crucible_8acdc189-d4da-45a7-b306-23b43e86f695 6fa84a9c-0161-40c9-b596-f3b2c679ef99 none none off - oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/zone/oxz_crucible_971ce633-cdc4-48cf-983e-dc272c1639eb cb8ca8a6-6a00-4aae-8702-1493e1c3b166 none none off - oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/zone/oxz_crucible_cfa6af7a-bf53-4fe6-bf1a-7ce3812d15c4 27323e49-f61e-4a73-bc87-f8d9f5082143 none none off - oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/zone/oxz_crucible_e145fb8e-df12-4df9-8049-b146ae0275be 35c46d33-4e08-4fad-90d2-3da719538ef2 none none off - oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/zone/oxz_crucible_f1d08ae7-68fe-4799-8f31-f1100887c6f0 02863a62-7624-4017-9269-412910ab73f0 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_crucible_pantry_f9e18694-fdff-46a3-b40d-570d43206f48 3cb3f346-9879-4023-b919-55c4172bbf23 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_internal_dns_a00d8ae3-d1db-4aef-9174-3ff867af5e9e c2d9b145-5e15-47be-a835-7e1f51f27679 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_nexus_8ccafc1f-97f9-4da7-bb04-d346213387ce dcc3603b-b160-42d9-a743-11075c3b6941 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_ntp_a1797f1d-2d2a-4396-9ab5-044630b41c35 5a70b3fe-9fad-4c17-982b-272b8595c2e8 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/debug 4e4b2f99-dc01-4793-a37a-072d942da264 100 GiB none gzip-9 - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/debug 8573903d-9610-4084-b0c6-ffcbb5d96c39 100 GiB none gzip-9 - oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/debug 540272e1-99d2-4d2e-9d3d-032014b0e6d9 100 GiB none gzip-9 - oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/debug 4adf2ef6-2694-4aac-aabe-688bca767092 100 GiB none gzip-9 - oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/debug 7e9d012a-6d8e-475e-805e-65985a66ffcd 100 GiB none gzip-9 - oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/debug 2189574d-9a73-4d25-858e-1084d57b59a8 100 GiB none gzip-9 - oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/debug 3cf0580b-4e1d-4ff9-bc22-4dc51ca9a53b 100 GiB none gzip-9 - oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/debug f499c5f8-b62f-493d-858a-8d33f7db81ff 100 GiB none gzip-9 - oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/debug c16ff3c0-3282-46de-a620-49c6b1e3f882 100 GiB none gzip-9 - oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/debug 8dde6eee-f28e-4b55-8c11-525884ec81e5 100 GiB none gzip-9 -+ oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/clickhouse_keeper 473adeb2-a57a-4240-82e9-88f2bebc1245 none none off -+ oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/clickhouse_server 4363b5f8-9a67-49af-b49d-585e532fa7bc none none off -+ oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_clickhouse_keeper_31a66e47-6252-4f38-aa92-f48637da152c 49f52cc5-74df-4cfa-b7f0-07c7e810940d none none off -+ oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_clickhouse_server_6fedfc94-2ae6-4cc7-a968-5185207284f4 f1143eb2-0685-4708-a471-968a58f93bad none none off + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crucible f18270c8-a39b-4579-be20-d2d1b80bba42 in service none none off + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crucible 06c2af14-055c-4041-aa26-9155f9f42661 in service none none off + oxp_44484c44-477a-4676-8266-b98a00e80d79/crucible 9deffea6-d340-4432-be3c-fad135dc29a5 in service none none off + oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crucible 47ca08b9-b962-43e2-99d7-c2e0556c0f52 in service none none off + oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crucible b2e54e29-6915-4b6d-bc76-6f72e5c7c55a in service none none off + oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crucible cb992d4e-7a69-4bcd-96c8-fe6e40989e24 in service none none off + oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crucible 68338fc3-2d8b-4419-b33d-4cce6fe9380d in service none none off + oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crucible 5294b99c-3eac-40e1-a35b-1f1cf2f0d6bf in service none none off + oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crucible 31718dcf-ebd5-432c-a9e5-40abcb40931c in service none none off + oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crucible ff7ff4a9-21c4-499e-9ceb-8a00a4bb21bc in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/internal_dns 56a1af5d-de86-46c5-9504-2d1ee70587c5 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone 003c1d4e-15bb-4fca-aa71-a7dff507b124 in service none none off + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone bf35a148-62f0-4f88-8f60-0a13747daba2 in service none none off + oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/zone 9b1bf42e-6f06-44cc-af5b-bff65d929322 in service none none off + oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/zone 2c9d6bce-0293-4364-b8c9-4bdea345490e in service none none off + oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/zone 11726c79-6590-4831-8480-cf50e6322c8a in service none none off + oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/zone b463f0c2-3ae4-45f7-a38c-110731fcc5cb in service none none off + oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/zone 626abe12-321d-439b-ad8f-f8dfb2022f25 in service none none off + oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/zone 4200e2a7-0fd6-4631-9d60-21fd821193fe in service none none off + oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/zone 85f34c02-a35d-404e-8cde-bedf3e193b1c in service none none off + oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/zone dd19c2c5-0bc9-48de-a116-b92503569092 in service none none off + oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/zone/oxz_crucible_06b45c33-9a90-408b-8534-f94ab6df8a42 9e0a360d-c158-417f-a45f-9d29ee67cdce in service none none off + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone/oxz_crucible_32999e20-ed5c-4c25-b4bd-41a3fbaf1445 dd7a45b8-3175-4744-8b99-ce19b22bb8ce in service none none off + oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/zone/oxz_crucible_4a037563-f969-4028-8384-164bdf308c3c 0d5b2580-7190-4bcc-9982-5012dac51f05 in service none none off + oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/zone/oxz_crucible_6564394d-2c51-4252-b3b1-f5f88a72d7c3 26a1cc86-f717-4a12-b644-5acd168843aa in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_crucible_87427b40-5114-49cd-96bd-63edd61fce90 e7364079-58e3-4b36-81a7-b9e08f2a8fff in service none none off + oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/zone/oxz_crucible_8acdc189-d4da-45a7-b306-23b43e86f695 6fa84a9c-0161-40c9-b596-f3b2c679ef99 in service none none off + oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/zone/oxz_crucible_971ce633-cdc4-48cf-983e-dc272c1639eb cb8ca8a6-6a00-4aae-8702-1493e1c3b166 in service none none off + oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/zone/oxz_crucible_cfa6af7a-bf53-4fe6-bf1a-7ce3812d15c4 27323e49-f61e-4a73-bc87-f8d9f5082143 in service none none off + oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/zone/oxz_crucible_e145fb8e-df12-4df9-8049-b146ae0275be 35c46d33-4e08-4fad-90d2-3da719538ef2 in service none none off + oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/zone/oxz_crucible_f1d08ae7-68fe-4799-8f31-f1100887c6f0 02863a62-7624-4017-9269-412910ab73f0 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_crucible_pantry_f9e18694-fdff-46a3-b40d-570d43206f48 3cb3f346-9879-4023-b919-55c4172bbf23 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_internal_dns_a00d8ae3-d1db-4aef-9174-3ff867af5e9e c2d9b145-5e15-47be-a835-7e1f51f27679 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_nexus_8ccafc1f-97f9-4da7-bb04-d346213387ce dcc3603b-b160-42d9-a743-11075c3b6941 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_ntp_a1797f1d-2d2a-4396-9ab5-044630b41c35 5a70b3fe-9fad-4c17-982b-272b8595c2e8 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/debug 4e4b2f99-dc01-4793-a37a-072d942da264 in service 100 GiB none gzip-9 + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/debug 8573903d-9610-4084-b0c6-ffcbb5d96c39 in service 100 GiB none gzip-9 + oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/debug 540272e1-99d2-4d2e-9d3d-032014b0e6d9 in service 100 GiB none gzip-9 + oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/debug 4adf2ef6-2694-4aac-aabe-688bca767092 in service 100 GiB none gzip-9 + oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/debug 7e9d012a-6d8e-475e-805e-65985a66ffcd in service 100 GiB none gzip-9 + oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/debug 2189574d-9a73-4d25-858e-1084d57b59a8 in service 100 GiB none gzip-9 + oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/debug 3cf0580b-4e1d-4ff9-bc22-4dc51ca9a53b in service 100 GiB none gzip-9 + oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/debug f499c5f8-b62f-493d-858a-8d33f7db81ff in service 100 GiB none gzip-9 + oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/debug c16ff3c0-3282-46de-a620-49c6b1e3f882 in service 100 GiB none gzip-9 + oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/debug 8dde6eee-f28e-4b55-8c11-525884ec81e5 in service 100 GiB none gzip-9 ++ oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/clickhouse_keeper 473adeb2-a57a-4240-82e9-88f2bebc1245 in service none none off ++ oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/clickhouse_server 4363b5f8-9a67-49af-b49d-585e532fa7bc in service none none off ++ oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_clickhouse_keeper_31a66e47-6252-4f38-aa92-f48637da152c 49f52cc5-74df-4cfa-b7f0-07c7e810940d in service none none off ++ oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_clickhouse_server_6fedfc94-2ae6-4cc7-a968-5185207284f4 f1143eb2-0685-4708-a471-968a58f93bad in service none none off omicron zones generation 2 -> 3: @@ -212,58 +212,58 @@ to: blueprint 31ef2071-2ec9-49d9-8827-fd83b17a0e3d datasets generation 2 -> 3: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crucible c73b47ac-ad1f-4cd1-b449-f220b5ad8104 none none off - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crucible 813c7aac-695b-49ce-8bc5-f4cdbfc04b38 none none off - oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crucible e5da836d-fffb-4435-8500-889c05b04689 none none off - oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crucible 9f8d056c-3e84-4474-b9c7-5b7a890a8a7b none none off - oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crucible e93cfc01-9581-4f6e-b77c-eb6300ca6ffb none none off - oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crucible f54d6e59-67a1-458b-8e66-6dc3b2adb755 none none off - oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crucible 6604dd1b-5f21-475d-952a-894717512d1b none none off - oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crucible 05cb728f-f6b9-4132-922d-fe249b1ba736 none none off - oxp_db16345e-427a-4c8e-9032-17270f729308/crucible 500f8d46-a32d-4bd1-8f2c-cb9d36822660 none none off - oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crucible 66c673a1-e8d8-4863-b368-a7ea292555fb none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/internal_dns 03de030d-d958-4ce5-86d2-368fa88e0bd8 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone 4c3c89bd-21cf-4986-b012-e89e4e1c1ac4 none none off - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone ff4a77a2-528a-4c70-a5b9-f0093c95697b none none off - oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/zone 676fc8c5-743b-48ca-99fd-2f2379c83890 none none off - oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/zone 63362c89-4b42-4649-9ebe-43e19a5c0e51 none none off - oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/zone 6f83a31e-1181-418f-92b0-d0534e9ae6dd none none off - oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/zone 260ffd7d-4da5-4657-9158-ba7e1eae5971 none none off - oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/zone ed4c8570-3951-4f79-b27e-da73150609be none none off - oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/zone e5dcf165-3ebb-40a2-b16f-a07b036a6533 none none off - oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/zone dd27be6b-214d-4022-a99d-2a7d12e7d8bb none none off - oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/zone b7500d95-2499-48fc-a7d6-2460d61e197a none none off - oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/zone/oxz_crucible_0b0e12fd-2800-4203-acb6-24e6e976271c cf46ee68-f945-4af6-a647-4d612c1f05be none none off - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone/oxz_crucible_1a02d419-10c4-4326-b34e-eb2b1bd90bd7 2a439799-3f16-46df-ba1b-7ea29edd392d none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_crucible_56e18c31-f630-4643-ad5c-1fede34f35de c30be90e-20cf-46c6-bb4a-b65d2c407878 none none off - oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/zone/oxz_crucible_5ea86015-8f62-40aa-b3b2-c659f17ee510 6289ea03-b2c9-4470-b7ba-b935450aa764 none none off - oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/zone/oxz_crucible_78965849-e6e3-4250-a66a-dc50512fad34 43b36ba3-e516-4732-be8b-8cd2ca9de93c none none off - oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/zone/oxz_crucible_90c484e5-69d3-4636-9c64-6a878f593d33 7cc8018e-323f-4d35-bb33-fcf557b9dace none none off - oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/zone/oxz_crucible_a3901043-fa2a-4ef7-a40e-6ef0e5fd189f 88fd4e5a-50fd-43c7-8a75-0ad4376bd564 none none off - oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/zone/oxz_crucible_be9fd98a-6422-4890-a32b-42d42d1c8957 932cbb0d-b1d0-423d-87b6-9dce8ddb6338 none none off - oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/zone/oxz_crucible_bf71d1a8-9e65-479d-8920-0be8e3422ac5 fd0ce816-4da0-4490-be32-4d38fb78c13c none none off - oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/zone/oxz_crucible_eb4176ea-456b-48f6-b284-7b76da0bf4a1 704ea6b5-0ffc-443f-ae8a-482666f8277c none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_crucible_pantry_417c97a4-fe25-439d-8359-3f7062981923 8957a276-6d4e-4c58-a856-d7c5433806e1 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_internal_dns_f2bbaa79-0eab-4b91-a404-dad4c19b58c2 fe0f566f-3cff-43ef-960c-649c27746c56 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_nexus_33ba37c4-2535-4095-a7e9-c69937fc584d 77d0cd16-b6e3-484d-962f-0477cd242482 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_ntp_47eab17a-4dd4-4467-90b2-f643f465cf34 4eaf1849-1fe4-415c-bdc7-4cc04cac20ce none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/debug c5b8f4f9-bd10-45b8-a9f3-93adf1402ecc 100 GiB none gzip-9 - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/debug 43abf982-d457-46d1-8566-8047d2a78a41 100 GiB none gzip-9 - oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/debug 1b6a1722-d9f7-48ea-b351-5bc8bad4fd07 100 GiB none gzip-9 - oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/debug 8be43fb0-00e7-4748-9a1a-ace9772d8a83 100 GiB none gzip-9 - oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/debug 2ccb3aa9-f0ef-4fd4-9fd7-43b4a88b8d6b 100 GiB none gzip-9 - oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/debug 56759eb6-69e9-46a3-b44c-fc748cd506aa 100 GiB none gzip-9 - oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/debug 76fffbd2-9c74-46b5-8033-f442be1256f5 100 GiB none gzip-9 - oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/debug c13a3d71-1241-42d1-95a8-d720c20ee2c4 100 GiB none gzip-9 - oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/debug f030ef33-cad2-4760-9431-1907b797161b 100 GiB none gzip-9 - oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/debug 947b2823-3dca-4b56-9324-f476e2c1c6da 100 GiB none gzip-9 -+ oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/clickhouse_keeper 6c5a6622-5f75-45a0-a9e8-4b513f5ac352 none none off -+ oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/clickhouse_server f8706468-85ac-4f9f-b41d-ff7c3a17ee5f none none off -+ oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_clickhouse_keeper_7aa82b80-0c37-4f20-9398-bfce4707f327 0bf9cddb-1911-495b-8aad-09b7eea5fff4 none none off -+ oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_clickhouse_server_812be70a-f237-47d5-ab49-f9450fe948db 292f53fc-27bb-4cc4-a61b-7d02c978149c none none off + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crucible c73b47ac-ad1f-4cd1-b449-f220b5ad8104 in service none none off + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crucible 813c7aac-695b-49ce-8bc5-f4cdbfc04b38 in service none none off + oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crucible e5da836d-fffb-4435-8500-889c05b04689 in service none none off + oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crucible 9f8d056c-3e84-4474-b9c7-5b7a890a8a7b in service none none off + oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crucible e93cfc01-9581-4f6e-b77c-eb6300ca6ffb in service none none off + oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crucible f54d6e59-67a1-458b-8e66-6dc3b2adb755 in service none none off + oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crucible 6604dd1b-5f21-475d-952a-894717512d1b in service none none off + oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crucible 05cb728f-f6b9-4132-922d-fe249b1ba736 in service none none off + oxp_db16345e-427a-4c8e-9032-17270f729308/crucible 500f8d46-a32d-4bd1-8f2c-cb9d36822660 in service none none off + oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crucible 66c673a1-e8d8-4863-b368-a7ea292555fb in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/internal_dns 03de030d-d958-4ce5-86d2-368fa88e0bd8 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone 4c3c89bd-21cf-4986-b012-e89e4e1c1ac4 in service none none off + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone ff4a77a2-528a-4c70-a5b9-f0093c95697b in service none none off + oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/zone 676fc8c5-743b-48ca-99fd-2f2379c83890 in service none none off + oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/zone 63362c89-4b42-4649-9ebe-43e19a5c0e51 in service none none off + oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/zone 6f83a31e-1181-418f-92b0-d0534e9ae6dd in service none none off + oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/zone 260ffd7d-4da5-4657-9158-ba7e1eae5971 in service none none off + oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/zone ed4c8570-3951-4f79-b27e-da73150609be in service none none off + oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/zone e5dcf165-3ebb-40a2-b16f-a07b036a6533 in service none none off + oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/zone dd27be6b-214d-4022-a99d-2a7d12e7d8bb in service none none off + oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/zone b7500d95-2499-48fc-a7d6-2460d61e197a in service none none off + oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/zone/oxz_crucible_0b0e12fd-2800-4203-acb6-24e6e976271c cf46ee68-f945-4af6-a647-4d612c1f05be in service none none off + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone/oxz_crucible_1a02d419-10c4-4326-b34e-eb2b1bd90bd7 2a439799-3f16-46df-ba1b-7ea29edd392d in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_crucible_56e18c31-f630-4643-ad5c-1fede34f35de c30be90e-20cf-46c6-bb4a-b65d2c407878 in service none none off + oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/zone/oxz_crucible_5ea86015-8f62-40aa-b3b2-c659f17ee510 6289ea03-b2c9-4470-b7ba-b935450aa764 in service none none off + oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/zone/oxz_crucible_78965849-e6e3-4250-a66a-dc50512fad34 43b36ba3-e516-4732-be8b-8cd2ca9de93c in service none none off + oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/zone/oxz_crucible_90c484e5-69d3-4636-9c64-6a878f593d33 7cc8018e-323f-4d35-bb33-fcf557b9dace in service none none off + oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/zone/oxz_crucible_a3901043-fa2a-4ef7-a40e-6ef0e5fd189f 88fd4e5a-50fd-43c7-8a75-0ad4376bd564 in service none none off + oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/zone/oxz_crucible_be9fd98a-6422-4890-a32b-42d42d1c8957 932cbb0d-b1d0-423d-87b6-9dce8ddb6338 in service none none off + oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/zone/oxz_crucible_bf71d1a8-9e65-479d-8920-0be8e3422ac5 fd0ce816-4da0-4490-be32-4d38fb78c13c in service none none off + oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/zone/oxz_crucible_eb4176ea-456b-48f6-b284-7b76da0bf4a1 704ea6b5-0ffc-443f-ae8a-482666f8277c in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_crucible_pantry_417c97a4-fe25-439d-8359-3f7062981923 8957a276-6d4e-4c58-a856-d7c5433806e1 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_internal_dns_f2bbaa79-0eab-4b91-a404-dad4c19b58c2 fe0f566f-3cff-43ef-960c-649c27746c56 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_nexus_33ba37c4-2535-4095-a7e9-c69937fc584d 77d0cd16-b6e3-484d-962f-0477cd242482 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_ntp_47eab17a-4dd4-4467-90b2-f643f465cf34 4eaf1849-1fe4-415c-bdc7-4cc04cac20ce in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/debug c5b8f4f9-bd10-45b8-a9f3-93adf1402ecc in service 100 GiB none gzip-9 + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/debug 43abf982-d457-46d1-8566-8047d2a78a41 in service 100 GiB none gzip-9 + oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/debug 1b6a1722-d9f7-48ea-b351-5bc8bad4fd07 in service 100 GiB none gzip-9 + oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/debug 8be43fb0-00e7-4748-9a1a-ace9772d8a83 in service 100 GiB none gzip-9 + oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/debug 2ccb3aa9-f0ef-4fd4-9fd7-43b4a88b8d6b in service 100 GiB none gzip-9 + oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/debug 56759eb6-69e9-46a3-b44c-fc748cd506aa in service 100 GiB none gzip-9 + oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/debug 76fffbd2-9c74-46b5-8033-f442be1256f5 in service 100 GiB none gzip-9 + oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/debug c13a3d71-1241-42d1-95a8-d720c20ee2c4 in service 100 GiB none gzip-9 + oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/debug f030ef33-cad2-4760-9431-1907b797161b in service 100 GiB none gzip-9 + oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/debug 947b2823-3dca-4b56-9324-f476e2c1c6da in service 100 GiB none gzip-9 ++ oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/clickhouse_keeper 6c5a6622-5f75-45a0-a9e8-4b513f5ac352 in service none none off ++ oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/clickhouse_server f8706468-85ac-4f9f-b41d-ff7c3a17ee5f in service none none off ++ oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_clickhouse_keeper_7aa82b80-0c37-4f20-9398-bfce4707f327 0bf9cddb-1911-495b-8aad-09b7eea5fff4 in service none none off ++ oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_clickhouse_server_812be70a-f237-47d5-ab49-f9450fe948db 292f53fc-27bb-4cc4-a61b-7d02c978149c in service none none off omicron zones generation 2 -> 3: diff --git a/nexus/reconfigurator/planning/tests/output/planner_deploy_all_keeper_nodes_3_4.txt b/nexus/reconfigurator/planning/tests/output/planner_deploy_all_keeper_nodes_3_4.txt index 06a18aa493a..c94a43a79ef 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_deploy_all_keeper_nodes_3_4.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_deploy_all_keeper_nodes_3_4.txt @@ -22,58 +22,58 @@ to: blueprint 92fa943c-7dd4-48c3-9447-c9d0665744b6 datasets at generation 3: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crucible 723e4ec2-5f4a-48a9-a6a1-cb523dc47d3d none none off - oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crucible b2796e6b-ad7d-41a5-82a6-947b96e42d47 none none off - oxp_736d4cab-c262-485e-89c2-07e6543f0855/crucible c993b4da-bea9-4010-a8d6-17d733698f07 none none off - oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crucible 4f497ece-88c1-4557-a8b4-0e990f9941a9 none none off - oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crucible 43a16c22-e79a-4bea-bcf6-682099a728dd none none off - oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crucible b6bbb45b-68fc-4fa5-86cc-b59b0f797fb2 none none off - oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crucible e4838ed0-304f-475e-a282-9f644f2ba3e5 none none off - oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crucible 046f2730-768d-4bcc-8ebf-4b5f5597151c none none off - oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crucible 0830fc6d-ed82-41de-9389-0bd3fd4677ea none none off - oxp_fbf997ef-52d3-438a-b036-b9117322e569/crucible d9662141-585e-4e18-a461-9627097f02a2 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/clickhouse a4f84c49-4303-411f-bb1b-08877d828946 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/clickhouse_keeper 04ee4b4b-fcbe-4224-86fd-30144a4f2592 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/internal_dns 2edca3dc-a0e5-4d34-b8a2-065be4cca767 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone 87cd9f37-3de3-457c-9412-d0dc5678eda8 none none off - oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/zone 3a164f36-1f53-45b3-b190-ad8a2817bc69 none none off - oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/zone 407556ed-09ab-430e-bc8f-8291b8f8c8fe none none off - oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/zone 99d57d61-f12a-4b56-8114-86ba92d07649 none none off - oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/zone da1eb596-8764-4268-a60b-f4705b4f615b none none off - oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/zone d555bf19-887c-48d2-8144-47c2eac9a9e8 none none off - oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/zone 9785e77a-9422-4b46-a4ae-8b9a155eb121 none none off - oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/zone 1192a37c-a871-4c48-905d-03c3d6035bdc none none off - oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/zone 7bf1c7ec-5465-4bfd-b1d9-939f05336012 none none off - oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/zone be526b44-2c78-49ec-8ab4-73e161e27f22 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_clickhouse_35e8d4b6-ea92-45cf-923c-3f566a0b1fe5 cd7e5c3a-2328-4568-b8f8-cf349f0cdd12 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_clickhouse_keeper_dd5ab8b1-e6e7-40e0-9ea6-b6a16f485b52 a51fb98f-3fff-4c0a-82f0-7a4aad82096b none none off - oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/zone/oxz_crucible_044d074d-7905-4024-82ff-68d76221db68 98fd0f42-7337-4ce7-814e-f988304b8873 none none off - oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/zone/oxz_crucible_28826473-ac0b-41ea-8c54-72b782db1bcb bbda84d8-c4ca-4f52-a766-681872fa06f0 none none off - oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/zone/oxz_crucible_2d3ff798-dda9-4ccf-8f91-070a20f06d55 e9c77dbd-c56a-404c-8ff9-6504b3f92556 none none off - oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/zone/oxz_crucible_7538d29b-69f2-43e8-8509-505b25cb1c84 19110f8a-6267-41ed-ac7d-539cd0fe3511 none none off - oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/zone/oxz_crucible_8234bbd2-4b31-4f6b-8dcc-4744b1d14e64 0fe4f647-ffd2-4845-805a-c069096560ee none none off - oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/zone/oxz_crucible_85358363-cee8-4bc3-af66-4d89e5cd714f a1daa561-2448-4afb-8233-ec149d2bd7f4 none none off - oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/zone/oxz_crucible_9b58d04f-85bf-4f5e-8c6a-5d855062d5c4 69812f66-4b59-4590-9e1f-bce3e93b3b08 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_crucible_e7da0aec-c6b6-4a56-9525-35385b9c62a2 36e58025-88e2-4eb9-8af0-ed9a98dda1b9 none none off - oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/zone/oxz_crucible_f3f977cc-7eca-4491-9b07-82b6284eb169 482fad9a-d83f-4025-8f0b-d3adea6ae2cf none none off - oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/zone/oxz_crucible_fef381d2-8368-4a2d-96a1-c956ed011f7b b1937368-4019-40c4-af02-9811dc7eb143 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_crucible_pantry_fe63bfd3-3128-4675-8118-cf6968293471 e3b31ef3-6b54-4901-aec4-0c672de62c7f none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_internal_dns_b6b0689e-ef48-484d-b3c7-3c596edad20c 501e0672-2897-4992-8911-600e0283f04c none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_nexus_46ecde76-fef7-4394-93dd-d22b003148e9 53655959-866b-4fee-bcf9-1e35504ad625 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_ntp_4d009155-44fb-45b9-afed-f89cb57ce8da 0590facf-202a-463b-81be-b6e88c47da76 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/debug 8f7f16c1-d9fb-4405-9dcf-68bfbaa7bf8c 100 GiB none gzip-9 - oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/debug 6482f332-801a-473f-a77d-e07d30e2a5b7 100 GiB none gzip-9 - oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/debug 0bb0541f-2c64-487b-a8af-162454207504 100 GiB none gzip-9 - oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/debug 902a6889-244f-4b67-baa4-b245f3d622c8 100 GiB none gzip-9 - oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/debug 667ffd3c-6735-4b50-bc3b-cfa32fcc811e 100 GiB none gzip-9 - oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/debug cf48ba87-a4bb-435f-999b-bca46cfd6a89 100 GiB none gzip-9 - oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/debug 7d64cab3-7311-4519-ae4a-1af6b320fa9b 100 GiB none gzip-9 - oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/debug d3e957fd-5f26-498a-8fa3-deaea4dc5820 100 GiB none gzip-9 - oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/debug 4da77f4a-5e41-4604-af30-8cf568c38428 100 GiB none gzip-9 - oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/debug 03935cb1-ce06-4594-b2fe-23e127d1cd9d 100 GiB none gzip-9 + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crucible 723e4ec2-5f4a-48a9-a6a1-cb523dc47d3d in service none none off + oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crucible b2796e6b-ad7d-41a5-82a6-947b96e42d47 in service none none off + oxp_736d4cab-c262-485e-89c2-07e6543f0855/crucible c993b4da-bea9-4010-a8d6-17d733698f07 in service none none off + oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crucible 4f497ece-88c1-4557-a8b4-0e990f9941a9 in service none none off + oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crucible 43a16c22-e79a-4bea-bcf6-682099a728dd in service none none off + oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crucible b6bbb45b-68fc-4fa5-86cc-b59b0f797fb2 in service none none off + oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crucible e4838ed0-304f-475e-a282-9f644f2ba3e5 in service none none off + oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crucible 046f2730-768d-4bcc-8ebf-4b5f5597151c in service none none off + oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crucible 0830fc6d-ed82-41de-9389-0bd3fd4677ea in service none none off + oxp_fbf997ef-52d3-438a-b036-b9117322e569/crucible d9662141-585e-4e18-a461-9627097f02a2 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/clickhouse a4f84c49-4303-411f-bb1b-08877d828946 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/clickhouse_keeper 04ee4b4b-fcbe-4224-86fd-30144a4f2592 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/internal_dns 2edca3dc-a0e5-4d34-b8a2-065be4cca767 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone 87cd9f37-3de3-457c-9412-d0dc5678eda8 in service none none off + oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/zone 3a164f36-1f53-45b3-b190-ad8a2817bc69 in service none none off + oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/zone 407556ed-09ab-430e-bc8f-8291b8f8c8fe in service none none off + oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/zone 99d57d61-f12a-4b56-8114-86ba92d07649 in service none none off + oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/zone da1eb596-8764-4268-a60b-f4705b4f615b in service none none off + oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/zone d555bf19-887c-48d2-8144-47c2eac9a9e8 in service none none off + oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/zone 9785e77a-9422-4b46-a4ae-8b9a155eb121 in service none none off + oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/zone 1192a37c-a871-4c48-905d-03c3d6035bdc in service none none off + oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/zone 7bf1c7ec-5465-4bfd-b1d9-939f05336012 in service none none off + oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/zone be526b44-2c78-49ec-8ab4-73e161e27f22 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_clickhouse_35e8d4b6-ea92-45cf-923c-3f566a0b1fe5 cd7e5c3a-2328-4568-b8f8-cf349f0cdd12 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_clickhouse_keeper_dd5ab8b1-e6e7-40e0-9ea6-b6a16f485b52 a51fb98f-3fff-4c0a-82f0-7a4aad82096b in service none none off + oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/zone/oxz_crucible_044d074d-7905-4024-82ff-68d76221db68 98fd0f42-7337-4ce7-814e-f988304b8873 in service none none off + oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/zone/oxz_crucible_28826473-ac0b-41ea-8c54-72b782db1bcb bbda84d8-c4ca-4f52-a766-681872fa06f0 in service none none off + oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/zone/oxz_crucible_2d3ff798-dda9-4ccf-8f91-070a20f06d55 e9c77dbd-c56a-404c-8ff9-6504b3f92556 in service none none off + oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/zone/oxz_crucible_7538d29b-69f2-43e8-8509-505b25cb1c84 19110f8a-6267-41ed-ac7d-539cd0fe3511 in service none none off + oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/zone/oxz_crucible_8234bbd2-4b31-4f6b-8dcc-4744b1d14e64 0fe4f647-ffd2-4845-805a-c069096560ee in service none none off + oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/zone/oxz_crucible_85358363-cee8-4bc3-af66-4d89e5cd714f a1daa561-2448-4afb-8233-ec149d2bd7f4 in service none none off + oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/zone/oxz_crucible_9b58d04f-85bf-4f5e-8c6a-5d855062d5c4 69812f66-4b59-4590-9e1f-bce3e93b3b08 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_crucible_e7da0aec-c6b6-4a56-9525-35385b9c62a2 36e58025-88e2-4eb9-8af0-ed9a98dda1b9 in service none none off + oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/zone/oxz_crucible_f3f977cc-7eca-4491-9b07-82b6284eb169 482fad9a-d83f-4025-8f0b-d3adea6ae2cf in service none none off + oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/zone/oxz_crucible_fef381d2-8368-4a2d-96a1-c956ed011f7b b1937368-4019-40c4-af02-9811dc7eb143 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_crucible_pantry_fe63bfd3-3128-4675-8118-cf6968293471 e3b31ef3-6b54-4901-aec4-0c672de62c7f in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_internal_dns_b6b0689e-ef48-484d-b3c7-3c596edad20c 501e0672-2897-4992-8911-600e0283f04c in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_nexus_46ecde76-fef7-4394-93dd-d22b003148e9 53655959-866b-4fee-bcf9-1e35504ad625 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_ntp_4d009155-44fb-45b9-afed-f89cb57ce8da 0590facf-202a-463b-81be-b6e88c47da76 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/debug 8f7f16c1-d9fb-4405-9dcf-68bfbaa7bf8c in service 100 GiB none gzip-9 + oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/debug 6482f332-801a-473f-a77d-e07d30e2a5b7 in service 100 GiB none gzip-9 + oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/debug 0bb0541f-2c64-487b-a8af-162454207504 in service 100 GiB none gzip-9 + oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/debug 902a6889-244f-4b67-baa4-b245f3d622c8 in service 100 GiB none gzip-9 + oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/debug 667ffd3c-6735-4b50-bc3b-cfa32fcc811e in service 100 GiB none gzip-9 + oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/debug cf48ba87-a4bb-435f-999b-bca46cfd6a89 in service 100 GiB none gzip-9 + oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/debug 7d64cab3-7311-4519-ae4a-1af6b320fa9b in service 100 GiB none gzip-9 + oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/debug d3e957fd-5f26-498a-8fa3-deaea4dc5820 in service 100 GiB none gzip-9 + oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/debug 4da77f4a-5e41-4604-af30-8cf568c38428 in service 100 GiB none gzip-9 + oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/debug 03935cb1-ce06-4594-b2fe-23e127d1cd9d in service 100 GiB none gzip-9 omicron zones at generation 3: @@ -117,58 +117,58 @@ to: blueprint 92fa943c-7dd4-48c3-9447-c9d0665744b6 datasets at generation 3: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crucible f18270c8-a39b-4579-be20-d2d1b80bba42 none none off - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crucible 06c2af14-055c-4041-aa26-9155f9f42661 none none off - oxp_44484c44-477a-4676-8266-b98a00e80d79/crucible 9deffea6-d340-4432-be3c-fad135dc29a5 none none off - oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crucible 47ca08b9-b962-43e2-99d7-c2e0556c0f52 none none off - oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crucible b2e54e29-6915-4b6d-bc76-6f72e5c7c55a none none off - oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crucible cb992d4e-7a69-4bcd-96c8-fe6e40989e24 none none off - oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crucible 68338fc3-2d8b-4419-b33d-4cce6fe9380d none none off - oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crucible 5294b99c-3eac-40e1-a35b-1f1cf2f0d6bf none none off - oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crucible 31718dcf-ebd5-432c-a9e5-40abcb40931c none none off - oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crucible ff7ff4a9-21c4-499e-9ceb-8a00a4bb21bc none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/clickhouse_keeper 473adeb2-a57a-4240-82e9-88f2bebc1245 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/clickhouse_server 4363b5f8-9a67-49af-b49d-585e532fa7bc none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/internal_dns 56a1af5d-de86-46c5-9504-2d1ee70587c5 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone 003c1d4e-15bb-4fca-aa71-a7dff507b124 none none off - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone bf35a148-62f0-4f88-8f60-0a13747daba2 none none off - oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/zone 9b1bf42e-6f06-44cc-af5b-bff65d929322 none none off - oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/zone 2c9d6bce-0293-4364-b8c9-4bdea345490e none none off - oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/zone 11726c79-6590-4831-8480-cf50e6322c8a none none off - oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/zone b463f0c2-3ae4-45f7-a38c-110731fcc5cb none none off - oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/zone 626abe12-321d-439b-ad8f-f8dfb2022f25 none none off - oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/zone 4200e2a7-0fd6-4631-9d60-21fd821193fe none none off - oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/zone 85f34c02-a35d-404e-8cde-bedf3e193b1c none none off - oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/zone dd19c2c5-0bc9-48de-a116-b92503569092 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_clickhouse_keeper_31a66e47-6252-4f38-aa92-f48637da152c 49f52cc5-74df-4cfa-b7f0-07c7e810940d none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_clickhouse_server_6fedfc94-2ae6-4cc7-a968-5185207284f4 f1143eb2-0685-4708-a471-968a58f93bad none none off - oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/zone/oxz_crucible_06b45c33-9a90-408b-8534-f94ab6df8a42 9e0a360d-c158-417f-a45f-9d29ee67cdce none none off - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone/oxz_crucible_32999e20-ed5c-4c25-b4bd-41a3fbaf1445 dd7a45b8-3175-4744-8b99-ce19b22bb8ce none none off - oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/zone/oxz_crucible_4a037563-f969-4028-8384-164bdf308c3c 0d5b2580-7190-4bcc-9982-5012dac51f05 none none off - oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/zone/oxz_crucible_6564394d-2c51-4252-b3b1-f5f88a72d7c3 26a1cc86-f717-4a12-b644-5acd168843aa none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_crucible_87427b40-5114-49cd-96bd-63edd61fce90 e7364079-58e3-4b36-81a7-b9e08f2a8fff none none off - oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/zone/oxz_crucible_8acdc189-d4da-45a7-b306-23b43e86f695 6fa84a9c-0161-40c9-b596-f3b2c679ef99 none none off - oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/zone/oxz_crucible_971ce633-cdc4-48cf-983e-dc272c1639eb cb8ca8a6-6a00-4aae-8702-1493e1c3b166 none none off - oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/zone/oxz_crucible_cfa6af7a-bf53-4fe6-bf1a-7ce3812d15c4 27323e49-f61e-4a73-bc87-f8d9f5082143 none none off - oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/zone/oxz_crucible_e145fb8e-df12-4df9-8049-b146ae0275be 35c46d33-4e08-4fad-90d2-3da719538ef2 none none off - oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/zone/oxz_crucible_f1d08ae7-68fe-4799-8f31-f1100887c6f0 02863a62-7624-4017-9269-412910ab73f0 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_crucible_pantry_f9e18694-fdff-46a3-b40d-570d43206f48 3cb3f346-9879-4023-b919-55c4172bbf23 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_internal_dns_a00d8ae3-d1db-4aef-9174-3ff867af5e9e c2d9b145-5e15-47be-a835-7e1f51f27679 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_nexus_8ccafc1f-97f9-4da7-bb04-d346213387ce dcc3603b-b160-42d9-a743-11075c3b6941 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_ntp_a1797f1d-2d2a-4396-9ab5-044630b41c35 5a70b3fe-9fad-4c17-982b-272b8595c2e8 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/debug 4e4b2f99-dc01-4793-a37a-072d942da264 100 GiB none gzip-9 - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/debug 8573903d-9610-4084-b0c6-ffcbb5d96c39 100 GiB none gzip-9 - oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/debug 540272e1-99d2-4d2e-9d3d-032014b0e6d9 100 GiB none gzip-9 - oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/debug 4adf2ef6-2694-4aac-aabe-688bca767092 100 GiB none gzip-9 - oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/debug 7e9d012a-6d8e-475e-805e-65985a66ffcd 100 GiB none gzip-9 - oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/debug 2189574d-9a73-4d25-858e-1084d57b59a8 100 GiB none gzip-9 - oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/debug 3cf0580b-4e1d-4ff9-bc22-4dc51ca9a53b 100 GiB none gzip-9 - oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/debug f499c5f8-b62f-493d-858a-8d33f7db81ff 100 GiB none gzip-9 - oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/debug c16ff3c0-3282-46de-a620-49c6b1e3f882 100 GiB none gzip-9 - oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/debug 8dde6eee-f28e-4b55-8c11-525884ec81e5 100 GiB none gzip-9 + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crucible f18270c8-a39b-4579-be20-d2d1b80bba42 in service none none off + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crucible 06c2af14-055c-4041-aa26-9155f9f42661 in service none none off + oxp_44484c44-477a-4676-8266-b98a00e80d79/crucible 9deffea6-d340-4432-be3c-fad135dc29a5 in service none none off + oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crucible 47ca08b9-b962-43e2-99d7-c2e0556c0f52 in service none none off + oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crucible b2e54e29-6915-4b6d-bc76-6f72e5c7c55a in service none none off + oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crucible cb992d4e-7a69-4bcd-96c8-fe6e40989e24 in service none none off + oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crucible 68338fc3-2d8b-4419-b33d-4cce6fe9380d in service none none off + oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crucible 5294b99c-3eac-40e1-a35b-1f1cf2f0d6bf in service none none off + oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crucible 31718dcf-ebd5-432c-a9e5-40abcb40931c in service none none off + oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crucible ff7ff4a9-21c4-499e-9ceb-8a00a4bb21bc in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/clickhouse_keeper 473adeb2-a57a-4240-82e9-88f2bebc1245 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/clickhouse_server 4363b5f8-9a67-49af-b49d-585e532fa7bc in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/internal_dns 56a1af5d-de86-46c5-9504-2d1ee70587c5 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone 003c1d4e-15bb-4fca-aa71-a7dff507b124 in service none none off + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone bf35a148-62f0-4f88-8f60-0a13747daba2 in service none none off + oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/zone 9b1bf42e-6f06-44cc-af5b-bff65d929322 in service none none off + oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/zone 2c9d6bce-0293-4364-b8c9-4bdea345490e in service none none off + oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/zone 11726c79-6590-4831-8480-cf50e6322c8a in service none none off + oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/zone b463f0c2-3ae4-45f7-a38c-110731fcc5cb in service none none off + oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/zone 626abe12-321d-439b-ad8f-f8dfb2022f25 in service none none off + oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/zone 4200e2a7-0fd6-4631-9d60-21fd821193fe in service none none off + oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/zone 85f34c02-a35d-404e-8cde-bedf3e193b1c in service none none off + oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/zone dd19c2c5-0bc9-48de-a116-b92503569092 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_clickhouse_keeper_31a66e47-6252-4f38-aa92-f48637da152c 49f52cc5-74df-4cfa-b7f0-07c7e810940d in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_clickhouse_server_6fedfc94-2ae6-4cc7-a968-5185207284f4 f1143eb2-0685-4708-a471-968a58f93bad in service none none off + oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/zone/oxz_crucible_06b45c33-9a90-408b-8534-f94ab6df8a42 9e0a360d-c158-417f-a45f-9d29ee67cdce in service none none off + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone/oxz_crucible_32999e20-ed5c-4c25-b4bd-41a3fbaf1445 dd7a45b8-3175-4744-8b99-ce19b22bb8ce in service none none off + oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/zone/oxz_crucible_4a037563-f969-4028-8384-164bdf308c3c 0d5b2580-7190-4bcc-9982-5012dac51f05 in service none none off + oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/zone/oxz_crucible_6564394d-2c51-4252-b3b1-f5f88a72d7c3 26a1cc86-f717-4a12-b644-5acd168843aa in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_crucible_87427b40-5114-49cd-96bd-63edd61fce90 e7364079-58e3-4b36-81a7-b9e08f2a8fff in service none none off + oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/zone/oxz_crucible_8acdc189-d4da-45a7-b306-23b43e86f695 6fa84a9c-0161-40c9-b596-f3b2c679ef99 in service none none off + oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/zone/oxz_crucible_971ce633-cdc4-48cf-983e-dc272c1639eb cb8ca8a6-6a00-4aae-8702-1493e1c3b166 in service none none off + oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/zone/oxz_crucible_cfa6af7a-bf53-4fe6-bf1a-7ce3812d15c4 27323e49-f61e-4a73-bc87-f8d9f5082143 in service none none off + oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/zone/oxz_crucible_e145fb8e-df12-4df9-8049-b146ae0275be 35c46d33-4e08-4fad-90d2-3da719538ef2 in service none none off + oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/zone/oxz_crucible_f1d08ae7-68fe-4799-8f31-f1100887c6f0 02863a62-7624-4017-9269-412910ab73f0 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_crucible_pantry_f9e18694-fdff-46a3-b40d-570d43206f48 3cb3f346-9879-4023-b919-55c4172bbf23 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_internal_dns_a00d8ae3-d1db-4aef-9174-3ff867af5e9e c2d9b145-5e15-47be-a835-7e1f51f27679 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_nexus_8ccafc1f-97f9-4da7-bb04-d346213387ce dcc3603b-b160-42d9-a743-11075c3b6941 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_ntp_a1797f1d-2d2a-4396-9ab5-044630b41c35 5a70b3fe-9fad-4c17-982b-272b8595c2e8 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/debug 4e4b2f99-dc01-4793-a37a-072d942da264 in service 100 GiB none gzip-9 + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/debug 8573903d-9610-4084-b0c6-ffcbb5d96c39 in service 100 GiB none gzip-9 + oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/debug 540272e1-99d2-4d2e-9d3d-032014b0e6d9 in service 100 GiB none gzip-9 + oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/debug 4adf2ef6-2694-4aac-aabe-688bca767092 in service 100 GiB none gzip-9 + oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/debug 7e9d012a-6d8e-475e-805e-65985a66ffcd in service 100 GiB none gzip-9 + oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/debug 2189574d-9a73-4d25-858e-1084d57b59a8 in service 100 GiB none gzip-9 + oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/debug 3cf0580b-4e1d-4ff9-bc22-4dc51ca9a53b in service 100 GiB none gzip-9 + oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/debug f499c5f8-b62f-493d-858a-8d33f7db81ff in service 100 GiB none gzip-9 + oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/debug c16ff3c0-3282-46de-a620-49c6b1e3f882 in service 100 GiB none gzip-9 + oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/debug 8dde6eee-f28e-4b55-8c11-525884ec81e5 in service 100 GiB none gzip-9 omicron zones at generation 3: @@ -212,58 +212,58 @@ to: blueprint 92fa943c-7dd4-48c3-9447-c9d0665744b6 datasets at generation 3: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crucible c73b47ac-ad1f-4cd1-b449-f220b5ad8104 none none off - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crucible 813c7aac-695b-49ce-8bc5-f4cdbfc04b38 none none off - oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crucible e5da836d-fffb-4435-8500-889c05b04689 none none off - oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crucible 9f8d056c-3e84-4474-b9c7-5b7a890a8a7b none none off - oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crucible e93cfc01-9581-4f6e-b77c-eb6300ca6ffb none none off - oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crucible f54d6e59-67a1-458b-8e66-6dc3b2adb755 none none off - oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crucible 6604dd1b-5f21-475d-952a-894717512d1b none none off - oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crucible 05cb728f-f6b9-4132-922d-fe249b1ba736 none none off - oxp_db16345e-427a-4c8e-9032-17270f729308/crucible 500f8d46-a32d-4bd1-8f2c-cb9d36822660 none none off - oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crucible 66c673a1-e8d8-4863-b368-a7ea292555fb none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/clickhouse_keeper 6c5a6622-5f75-45a0-a9e8-4b513f5ac352 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/clickhouse_server f8706468-85ac-4f9f-b41d-ff7c3a17ee5f none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/internal_dns 03de030d-d958-4ce5-86d2-368fa88e0bd8 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone 4c3c89bd-21cf-4986-b012-e89e4e1c1ac4 none none off - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone ff4a77a2-528a-4c70-a5b9-f0093c95697b none none off - oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/zone 676fc8c5-743b-48ca-99fd-2f2379c83890 none none off - oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/zone 63362c89-4b42-4649-9ebe-43e19a5c0e51 none none off - oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/zone 6f83a31e-1181-418f-92b0-d0534e9ae6dd none none off - oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/zone 260ffd7d-4da5-4657-9158-ba7e1eae5971 none none off - oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/zone ed4c8570-3951-4f79-b27e-da73150609be none none off - oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/zone e5dcf165-3ebb-40a2-b16f-a07b036a6533 none none off - oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/zone dd27be6b-214d-4022-a99d-2a7d12e7d8bb none none off - oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/zone b7500d95-2499-48fc-a7d6-2460d61e197a none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_clickhouse_keeper_7aa82b80-0c37-4f20-9398-bfce4707f327 0bf9cddb-1911-495b-8aad-09b7eea5fff4 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_clickhouse_server_812be70a-f237-47d5-ab49-f9450fe948db 292f53fc-27bb-4cc4-a61b-7d02c978149c none none off - oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/zone/oxz_crucible_0b0e12fd-2800-4203-acb6-24e6e976271c cf46ee68-f945-4af6-a647-4d612c1f05be none none off - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone/oxz_crucible_1a02d419-10c4-4326-b34e-eb2b1bd90bd7 2a439799-3f16-46df-ba1b-7ea29edd392d none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_crucible_56e18c31-f630-4643-ad5c-1fede34f35de c30be90e-20cf-46c6-bb4a-b65d2c407878 none none off - oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/zone/oxz_crucible_5ea86015-8f62-40aa-b3b2-c659f17ee510 6289ea03-b2c9-4470-b7ba-b935450aa764 none none off - oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/zone/oxz_crucible_78965849-e6e3-4250-a66a-dc50512fad34 43b36ba3-e516-4732-be8b-8cd2ca9de93c none none off - oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/zone/oxz_crucible_90c484e5-69d3-4636-9c64-6a878f593d33 7cc8018e-323f-4d35-bb33-fcf557b9dace none none off - oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/zone/oxz_crucible_a3901043-fa2a-4ef7-a40e-6ef0e5fd189f 88fd4e5a-50fd-43c7-8a75-0ad4376bd564 none none off - oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/zone/oxz_crucible_be9fd98a-6422-4890-a32b-42d42d1c8957 932cbb0d-b1d0-423d-87b6-9dce8ddb6338 none none off - oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/zone/oxz_crucible_bf71d1a8-9e65-479d-8920-0be8e3422ac5 fd0ce816-4da0-4490-be32-4d38fb78c13c none none off - oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/zone/oxz_crucible_eb4176ea-456b-48f6-b284-7b76da0bf4a1 704ea6b5-0ffc-443f-ae8a-482666f8277c none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_crucible_pantry_417c97a4-fe25-439d-8359-3f7062981923 8957a276-6d4e-4c58-a856-d7c5433806e1 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_internal_dns_f2bbaa79-0eab-4b91-a404-dad4c19b58c2 fe0f566f-3cff-43ef-960c-649c27746c56 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_nexus_33ba37c4-2535-4095-a7e9-c69937fc584d 77d0cd16-b6e3-484d-962f-0477cd242482 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_ntp_47eab17a-4dd4-4467-90b2-f643f465cf34 4eaf1849-1fe4-415c-bdc7-4cc04cac20ce none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/debug c5b8f4f9-bd10-45b8-a9f3-93adf1402ecc 100 GiB none gzip-9 - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/debug 43abf982-d457-46d1-8566-8047d2a78a41 100 GiB none gzip-9 - oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/debug 1b6a1722-d9f7-48ea-b351-5bc8bad4fd07 100 GiB none gzip-9 - oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/debug 8be43fb0-00e7-4748-9a1a-ace9772d8a83 100 GiB none gzip-9 - oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/debug 2ccb3aa9-f0ef-4fd4-9fd7-43b4a88b8d6b 100 GiB none gzip-9 - oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/debug 56759eb6-69e9-46a3-b44c-fc748cd506aa 100 GiB none gzip-9 - oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/debug 76fffbd2-9c74-46b5-8033-f442be1256f5 100 GiB none gzip-9 - oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/debug c13a3d71-1241-42d1-95a8-d720c20ee2c4 100 GiB none gzip-9 - oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/debug f030ef33-cad2-4760-9431-1907b797161b 100 GiB none gzip-9 - oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/debug 947b2823-3dca-4b56-9324-f476e2c1c6da 100 GiB none gzip-9 + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crucible c73b47ac-ad1f-4cd1-b449-f220b5ad8104 in service none none off + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crucible 813c7aac-695b-49ce-8bc5-f4cdbfc04b38 in service none none off + oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crucible e5da836d-fffb-4435-8500-889c05b04689 in service none none off + oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crucible 9f8d056c-3e84-4474-b9c7-5b7a890a8a7b in service none none off + oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crucible e93cfc01-9581-4f6e-b77c-eb6300ca6ffb in service none none off + oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crucible f54d6e59-67a1-458b-8e66-6dc3b2adb755 in service none none off + oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crucible 6604dd1b-5f21-475d-952a-894717512d1b in service none none off + oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crucible 05cb728f-f6b9-4132-922d-fe249b1ba736 in service none none off + oxp_db16345e-427a-4c8e-9032-17270f729308/crucible 500f8d46-a32d-4bd1-8f2c-cb9d36822660 in service none none off + oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crucible 66c673a1-e8d8-4863-b368-a7ea292555fb in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/clickhouse_keeper 6c5a6622-5f75-45a0-a9e8-4b513f5ac352 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/clickhouse_server f8706468-85ac-4f9f-b41d-ff7c3a17ee5f in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/internal_dns 03de030d-d958-4ce5-86d2-368fa88e0bd8 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone 4c3c89bd-21cf-4986-b012-e89e4e1c1ac4 in service none none off + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone ff4a77a2-528a-4c70-a5b9-f0093c95697b in service none none off + oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/zone 676fc8c5-743b-48ca-99fd-2f2379c83890 in service none none off + oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/zone 63362c89-4b42-4649-9ebe-43e19a5c0e51 in service none none off + oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/zone 6f83a31e-1181-418f-92b0-d0534e9ae6dd in service none none off + oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/zone 260ffd7d-4da5-4657-9158-ba7e1eae5971 in service none none off + oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/zone ed4c8570-3951-4f79-b27e-da73150609be in service none none off + oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/zone e5dcf165-3ebb-40a2-b16f-a07b036a6533 in service none none off + oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/zone dd27be6b-214d-4022-a99d-2a7d12e7d8bb in service none none off + oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/zone b7500d95-2499-48fc-a7d6-2460d61e197a in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_clickhouse_keeper_7aa82b80-0c37-4f20-9398-bfce4707f327 0bf9cddb-1911-495b-8aad-09b7eea5fff4 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_clickhouse_server_812be70a-f237-47d5-ab49-f9450fe948db 292f53fc-27bb-4cc4-a61b-7d02c978149c in service none none off + oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/zone/oxz_crucible_0b0e12fd-2800-4203-acb6-24e6e976271c cf46ee68-f945-4af6-a647-4d612c1f05be in service none none off + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone/oxz_crucible_1a02d419-10c4-4326-b34e-eb2b1bd90bd7 2a439799-3f16-46df-ba1b-7ea29edd392d in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_crucible_56e18c31-f630-4643-ad5c-1fede34f35de c30be90e-20cf-46c6-bb4a-b65d2c407878 in service none none off + oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/zone/oxz_crucible_5ea86015-8f62-40aa-b3b2-c659f17ee510 6289ea03-b2c9-4470-b7ba-b935450aa764 in service none none off + oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/zone/oxz_crucible_78965849-e6e3-4250-a66a-dc50512fad34 43b36ba3-e516-4732-be8b-8cd2ca9de93c in service none none off + oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/zone/oxz_crucible_90c484e5-69d3-4636-9c64-6a878f593d33 7cc8018e-323f-4d35-bb33-fcf557b9dace in service none none off + oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/zone/oxz_crucible_a3901043-fa2a-4ef7-a40e-6ef0e5fd189f 88fd4e5a-50fd-43c7-8a75-0ad4376bd564 in service none none off + oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/zone/oxz_crucible_be9fd98a-6422-4890-a32b-42d42d1c8957 932cbb0d-b1d0-423d-87b6-9dce8ddb6338 in service none none off + oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/zone/oxz_crucible_bf71d1a8-9e65-479d-8920-0be8e3422ac5 fd0ce816-4da0-4490-be32-4d38fb78c13c in service none none off + oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/zone/oxz_crucible_eb4176ea-456b-48f6-b284-7b76da0bf4a1 704ea6b5-0ffc-443f-ae8a-482666f8277c in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_crucible_pantry_417c97a4-fe25-439d-8359-3f7062981923 8957a276-6d4e-4c58-a856-d7c5433806e1 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_internal_dns_f2bbaa79-0eab-4b91-a404-dad4c19b58c2 fe0f566f-3cff-43ef-960c-649c27746c56 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_nexus_33ba37c4-2535-4095-a7e9-c69937fc584d 77d0cd16-b6e3-484d-962f-0477cd242482 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_ntp_47eab17a-4dd4-4467-90b2-f643f465cf34 4eaf1849-1fe4-415c-bdc7-4cc04cac20ce in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/debug c5b8f4f9-bd10-45b8-a9f3-93adf1402ecc in service 100 GiB none gzip-9 + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/debug 43abf982-d457-46d1-8566-8047d2a78a41 in service 100 GiB none gzip-9 + oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/debug 1b6a1722-d9f7-48ea-b351-5bc8bad4fd07 in service 100 GiB none gzip-9 + oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/debug 8be43fb0-00e7-4748-9a1a-ace9772d8a83 in service 100 GiB none gzip-9 + oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/debug 2ccb3aa9-f0ef-4fd4-9fd7-43b4a88b8d6b in service 100 GiB none gzip-9 + oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/debug 56759eb6-69e9-46a3-b44c-fc748cd506aa in service 100 GiB none gzip-9 + oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/debug 76fffbd2-9c74-46b5-8033-f442be1256f5 in service 100 GiB none gzip-9 + oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/debug c13a3d71-1241-42d1-95a8-d720c20ee2c4 in service 100 GiB none gzip-9 + oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/debug f030ef33-cad2-4760-9431-1907b797161b in service 100 GiB none gzip-9 + oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/debug 947b2823-3dca-4b56-9324-f476e2c1c6da in service 100 GiB none gzip-9 omicron zones at generation 3: diff --git a/nexus/reconfigurator/planning/tests/output/planner_deploy_all_keeper_nodes_4_5.txt b/nexus/reconfigurator/planning/tests/output/planner_deploy_all_keeper_nodes_4_5.txt index 95b0da3a904..e86629f97a1 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_deploy_all_keeper_nodes_4_5.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_deploy_all_keeper_nodes_4_5.txt @@ -22,58 +22,58 @@ to: blueprint 2886dab5-61a2-46b4-87af-bc7aeb44cccb datasets at generation 3: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crucible 723e4ec2-5f4a-48a9-a6a1-cb523dc47d3d none none off - oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crucible b2796e6b-ad7d-41a5-82a6-947b96e42d47 none none off - oxp_736d4cab-c262-485e-89c2-07e6543f0855/crucible c993b4da-bea9-4010-a8d6-17d733698f07 none none off - oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crucible 4f497ece-88c1-4557-a8b4-0e990f9941a9 none none off - oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crucible 43a16c22-e79a-4bea-bcf6-682099a728dd none none off - oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crucible b6bbb45b-68fc-4fa5-86cc-b59b0f797fb2 none none off - oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crucible e4838ed0-304f-475e-a282-9f644f2ba3e5 none none off - oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crucible 046f2730-768d-4bcc-8ebf-4b5f5597151c none none off - oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crucible 0830fc6d-ed82-41de-9389-0bd3fd4677ea none none off - oxp_fbf997ef-52d3-438a-b036-b9117322e569/crucible d9662141-585e-4e18-a461-9627097f02a2 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/clickhouse a4f84c49-4303-411f-bb1b-08877d828946 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/clickhouse_keeper 04ee4b4b-fcbe-4224-86fd-30144a4f2592 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/internal_dns 2edca3dc-a0e5-4d34-b8a2-065be4cca767 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone 87cd9f37-3de3-457c-9412-d0dc5678eda8 none none off - oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/zone 3a164f36-1f53-45b3-b190-ad8a2817bc69 none none off - oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/zone 407556ed-09ab-430e-bc8f-8291b8f8c8fe none none off - oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/zone 99d57d61-f12a-4b56-8114-86ba92d07649 none none off - oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/zone da1eb596-8764-4268-a60b-f4705b4f615b none none off - oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/zone d555bf19-887c-48d2-8144-47c2eac9a9e8 none none off - oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/zone 9785e77a-9422-4b46-a4ae-8b9a155eb121 none none off - oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/zone 1192a37c-a871-4c48-905d-03c3d6035bdc none none off - oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/zone 7bf1c7ec-5465-4bfd-b1d9-939f05336012 none none off - oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/zone be526b44-2c78-49ec-8ab4-73e161e27f22 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_clickhouse_35e8d4b6-ea92-45cf-923c-3f566a0b1fe5 cd7e5c3a-2328-4568-b8f8-cf349f0cdd12 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_clickhouse_keeper_dd5ab8b1-e6e7-40e0-9ea6-b6a16f485b52 a51fb98f-3fff-4c0a-82f0-7a4aad82096b none none off - oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/zone/oxz_crucible_044d074d-7905-4024-82ff-68d76221db68 98fd0f42-7337-4ce7-814e-f988304b8873 none none off - oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/zone/oxz_crucible_28826473-ac0b-41ea-8c54-72b782db1bcb bbda84d8-c4ca-4f52-a766-681872fa06f0 none none off - oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/zone/oxz_crucible_2d3ff798-dda9-4ccf-8f91-070a20f06d55 e9c77dbd-c56a-404c-8ff9-6504b3f92556 none none off - oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/zone/oxz_crucible_7538d29b-69f2-43e8-8509-505b25cb1c84 19110f8a-6267-41ed-ac7d-539cd0fe3511 none none off - oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/zone/oxz_crucible_8234bbd2-4b31-4f6b-8dcc-4744b1d14e64 0fe4f647-ffd2-4845-805a-c069096560ee none none off - oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/zone/oxz_crucible_85358363-cee8-4bc3-af66-4d89e5cd714f a1daa561-2448-4afb-8233-ec149d2bd7f4 none none off - oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/zone/oxz_crucible_9b58d04f-85bf-4f5e-8c6a-5d855062d5c4 69812f66-4b59-4590-9e1f-bce3e93b3b08 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_crucible_e7da0aec-c6b6-4a56-9525-35385b9c62a2 36e58025-88e2-4eb9-8af0-ed9a98dda1b9 none none off - oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/zone/oxz_crucible_f3f977cc-7eca-4491-9b07-82b6284eb169 482fad9a-d83f-4025-8f0b-d3adea6ae2cf none none off - oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/zone/oxz_crucible_fef381d2-8368-4a2d-96a1-c956ed011f7b b1937368-4019-40c4-af02-9811dc7eb143 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_crucible_pantry_fe63bfd3-3128-4675-8118-cf6968293471 e3b31ef3-6b54-4901-aec4-0c672de62c7f none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_internal_dns_b6b0689e-ef48-484d-b3c7-3c596edad20c 501e0672-2897-4992-8911-600e0283f04c none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_nexus_46ecde76-fef7-4394-93dd-d22b003148e9 53655959-866b-4fee-bcf9-1e35504ad625 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_ntp_4d009155-44fb-45b9-afed-f89cb57ce8da 0590facf-202a-463b-81be-b6e88c47da76 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/debug 8f7f16c1-d9fb-4405-9dcf-68bfbaa7bf8c 100 GiB none gzip-9 - oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/debug 6482f332-801a-473f-a77d-e07d30e2a5b7 100 GiB none gzip-9 - oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/debug 0bb0541f-2c64-487b-a8af-162454207504 100 GiB none gzip-9 - oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/debug 902a6889-244f-4b67-baa4-b245f3d622c8 100 GiB none gzip-9 - oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/debug 667ffd3c-6735-4b50-bc3b-cfa32fcc811e 100 GiB none gzip-9 - oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/debug cf48ba87-a4bb-435f-999b-bca46cfd6a89 100 GiB none gzip-9 - oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/debug 7d64cab3-7311-4519-ae4a-1af6b320fa9b 100 GiB none gzip-9 - oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/debug d3e957fd-5f26-498a-8fa3-deaea4dc5820 100 GiB none gzip-9 - oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/debug 4da77f4a-5e41-4604-af30-8cf568c38428 100 GiB none gzip-9 - oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/debug 03935cb1-ce06-4594-b2fe-23e127d1cd9d 100 GiB none gzip-9 + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crucible 723e4ec2-5f4a-48a9-a6a1-cb523dc47d3d in service none none off + oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crucible b2796e6b-ad7d-41a5-82a6-947b96e42d47 in service none none off + oxp_736d4cab-c262-485e-89c2-07e6543f0855/crucible c993b4da-bea9-4010-a8d6-17d733698f07 in service none none off + oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crucible 4f497ece-88c1-4557-a8b4-0e990f9941a9 in service none none off + oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crucible 43a16c22-e79a-4bea-bcf6-682099a728dd in service none none off + oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crucible b6bbb45b-68fc-4fa5-86cc-b59b0f797fb2 in service none none off + oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crucible e4838ed0-304f-475e-a282-9f644f2ba3e5 in service none none off + oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crucible 046f2730-768d-4bcc-8ebf-4b5f5597151c in service none none off + oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crucible 0830fc6d-ed82-41de-9389-0bd3fd4677ea in service none none off + oxp_fbf997ef-52d3-438a-b036-b9117322e569/crucible d9662141-585e-4e18-a461-9627097f02a2 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/clickhouse a4f84c49-4303-411f-bb1b-08877d828946 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/clickhouse_keeper 04ee4b4b-fcbe-4224-86fd-30144a4f2592 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/internal_dns 2edca3dc-a0e5-4d34-b8a2-065be4cca767 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone 87cd9f37-3de3-457c-9412-d0dc5678eda8 in service none none off + oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/zone 3a164f36-1f53-45b3-b190-ad8a2817bc69 in service none none off + oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/zone 407556ed-09ab-430e-bc8f-8291b8f8c8fe in service none none off + oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/zone 99d57d61-f12a-4b56-8114-86ba92d07649 in service none none off + oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/zone da1eb596-8764-4268-a60b-f4705b4f615b in service none none off + oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/zone d555bf19-887c-48d2-8144-47c2eac9a9e8 in service none none off + oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/zone 9785e77a-9422-4b46-a4ae-8b9a155eb121 in service none none off + oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/zone 1192a37c-a871-4c48-905d-03c3d6035bdc in service none none off + oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/zone 7bf1c7ec-5465-4bfd-b1d9-939f05336012 in service none none off + oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/zone be526b44-2c78-49ec-8ab4-73e161e27f22 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_clickhouse_35e8d4b6-ea92-45cf-923c-3f566a0b1fe5 cd7e5c3a-2328-4568-b8f8-cf349f0cdd12 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_clickhouse_keeper_dd5ab8b1-e6e7-40e0-9ea6-b6a16f485b52 a51fb98f-3fff-4c0a-82f0-7a4aad82096b in service none none off + oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/zone/oxz_crucible_044d074d-7905-4024-82ff-68d76221db68 98fd0f42-7337-4ce7-814e-f988304b8873 in service none none off + oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/zone/oxz_crucible_28826473-ac0b-41ea-8c54-72b782db1bcb bbda84d8-c4ca-4f52-a766-681872fa06f0 in service none none off + oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/zone/oxz_crucible_2d3ff798-dda9-4ccf-8f91-070a20f06d55 e9c77dbd-c56a-404c-8ff9-6504b3f92556 in service none none off + oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/zone/oxz_crucible_7538d29b-69f2-43e8-8509-505b25cb1c84 19110f8a-6267-41ed-ac7d-539cd0fe3511 in service none none off + oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/zone/oxz_crucible_8234bbd2-4b31-4f6b-8dcc-4744b1d14e64 0fe4f647-ffd2-4845-805a-c069096560ee in service none none off + oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/zone/oxz_crucible_85358363-cee8-4bc3-af66-4d89e5cd714f a1daa561-2448-4afb-8233-ec149d2bd7f4 in service none none off + oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/zone/oxz_crucible_9b58d04f-85bf-4f5e-8c6a-5d855062d5c4 69812f66-4b59-4590-9e1f-bce3e93b3b08 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_crucible_e7da0aec-c6b6-4a56-9525-35385b9c62a2 36e58025-88e2-4eb9-8af0-ed9a98dda1b9 in service none none off + oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/zone/oxz_crucible_f3f977cc-7eca-4491-9b07-82b6284eb169 482fad9a-d83f-4025-8f0b-d3adea6ae2cf in service none none off + oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/zone/oxz_crucible_fef381d2-8368-4a2d-96a1-c956ed011f7b b1937368-4019-40c4-af02-9811dc7eb143 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_crucible_pantry_fe63bfd3-3128-4675-8118-cf6968293471 e3b31ef3-6b54-4901-aec4-0c672de62c7f in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_internal_dns_b6b0689e-ef48-484d-b3c7-3c596edad20c 501e0672-2897-4992-8911-600e0283f04c in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_nexus_46ecde76-fef7-4394-93dd-d22b003148e9 53655959-866b-4fee-bcf9-1e35504ad625 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_ntp_4d009155-44fb-45b9-afed-f89cb57ce8da 0590facf-202a-463b-81be-b6e88c47da76 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/debug 8f7f16c1-d9fb-4405-9dcf-68bfbaa7bf8c in service 100 GiB none gzip-9 + oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/debug 6482f332-801a-473f-a77d-e07d30e2a5b7 in service 100 GiB none gzip-9 + oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/debug 0bb0541f-2c64-487b-a8af-162454207504 in service 100 GiB none gzip-9 + oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/debug 902a6889-244f-4b67-baa4-b245f3d622c8 in service 100 GiB none gzip-9 + oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/debug 667ffd3c-6735-4b50-bc3b-cfa32fcc811e in service 100 GiB none gzip-9 + oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/debug cf48ba87-a4bb-435f-999b-bca46cfd6a89 in service 100 GiB none gzip-9 + oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/debug 7d64cab3-7311-4519-ae4a-1af6b320fa9b in service 100 GiB none gzip-9 + oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/debug d3e957fd-5f26-498a-8fa3-deaea4dc5820 in service 100 GiB none gzip-9 + oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/debug 4da77f4a-5e41-4604-af30-8cf568c38428 in service 100 GiB none gzip-9 + oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/debug 03935cb1-ce06-4594-b2fe-23e127d1cd9d in service 100 GiB none gzip-9 omicron zones at generation 3: @@ -119,60 +119,60 @@ to: blueprint 2886dab5-61a2-46b4-87af-bc7aeb44cccb datasets generation 3 -> 4: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crucible f18270c8-a39b-4579-be20-d2d1b80bba42 none none off - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crucible 06c2af14-055c-4041-aa26-9155f9f42661 none none off - oxp_44484c44-477a-4676-8266-b98a00e80d79/crucible 9deffea6-d340-4432-be3c-fad135dc29a5 none none off - oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crucible 47ca08b9-b962-43e2-99d7-c2e0556c0f52 none none off - oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crucible b2e54e29-6915-4b6d-bc76-6f72e5c7c55a none none off - oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crucible cb992d4e-7a69-4bcd-96c8-fe6e40989e24 none none off - oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crucible 68338fc3-2d8b-4419-b33d-4cce6fe9380d none none off - oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crucible 5294b99c-3eac-40e1-a35b-1f1cf2f0d6bf none none off - oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crucible 31718dcf-ebd5-432c-a9e5-40abcb40931c none none off - oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crucible ff7ff4a9-21c4-499e-9ceb-8a00a4bb21bc none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/clickhouse_keeper 473adeb2-a57a-4240-82e9-88f2bebc1245 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/clickhouse_server 4363b5f8-9a67-49af-b49d-585e532fa7bc none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/internal_dns 56a1af5d-de86-46c5-9504-2d1ee70587c5 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone 003c1d4e-15bb-4fca-aa71-a7dff507b124 none none off - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone bf35a148-62f0-4f88-8f60-0a13747daba2 none none off - oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/zone 9b1bf42e-6f06-44cc-af5b-bff65d929322 none none off - oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/zone 2c9d6bce-0293-4364-b8c9-4bdea345490e none none off - oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/zone 11726c79-6590-4831-8480-cf50e6322c8a none none off - oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/zone b463f0c2-3ae4-45f7-a38c-110731fcc5cb none none off - oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/zone 626abe12-321d-439b-ad8f-f8dfb2022f25 none none off - oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/zone 4200e2a7-0fd6-4631-9d60-21fd821193fe none none off - oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/zone 85f34c02-a35d-404e-8cde-bedf3e193b1c none none off - oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/zone dd19c2c5-0bc9-48de-a116-b92503569092 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_clickhouse_keeper_31a66e47-6252-4f38-aa92-f48637da152c 49f52cc5-74df-4cfa-b7f0-07c7e810940d none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_clickhouse_server_6fedfc94-2ae6-4cc7-a968-5185207284f4 f1143eb2-0685-4708-a471-968a58f93bad none none off - oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/zone/oxz_crucible_06b45c33-9a90-408b-8534-f94ab6df8a42 9e0a360d-c158-417f-a45f-9d29ee67cdce none none off - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone/oxz_crucible_32999e20-ed5c-4c25-b4bd-41a3fbaf1445 dd7a45b8-3175-4744-8b99-ce19b22bb8ce none none off - oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/zone/oxz_crucible_4a037563-f969-4028-8384-164bdf308c3c 0d5b2580-7190-4bcc-9982-5012dac51f05 none none off - oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/zone/oxz_crucible_6564394d-2c51-4252-b3b1-f5f88a72d7c3 26a1cc86-f717-4a12-b644-5acd168843aa none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_crucible_87427b40-5114-49cd-96bd-63edd61fce90 e7364079-58e3-4b36-81a7-b9e08f2a8fff none none off - oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/zone/oxz_crucible_8acdc189-d4da-45a7-b306-23b43e86f695 6fa84a9c-0161-40c9-b596-f3b2c679ef99 none none off - oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/zone/oxz_crucible_971ce633-cdc4-48cf-983e-dc272c1639eb cb8ca8a6-6a00-4aae-8702-1493e1c3b166 none none off - oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/zone/oxz_crucible_cfa6af7a-bf53-4fe6-bf1a-7ce3812d15c4 27323e49-f61e-4a73-bc87-f8d9f5082143 none none off - oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/zone/oxz_crucible_e145fb8e-df12-4df9-8049-b146ae0275be 35c46d33-4e08-4fad-90d2-3da719538ef2 none none off - oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/zone/oxz_crucible_f1d08ae7-68fe-4799-8f31-f1100887c6f0 02863a62-7624-4017-9269-412910ab73f0 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_crucible_pantry_f9e18694-fdff-46a3-b40d-570d43206f48 3cb3f346-9879-4023-b919-55c4172bbf23 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_internal_dns_a00d8ae3-d1db-4aef-9174-3ff867af5e9e c2d9b145-5e15-47be-a835-7e1f51f27679 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_nexus_8ccafc1f-97f9-4da7-bb04-d346213387ce dcc3603b-b160-42d9-a743-11075c3b6941 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_ntp_a1797f1d-2d2a-4396-9ab5-044630b41c35 5a70b3fe-9fad-4c17-982b-272b8595c2e8 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/debug 4e4b2f99-dc01-4793-a37a-072d942da264 100 GiB none gzip-9 - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/debug 8573903d-9610-4084-b0c6-ffcbb5d96c39 100 GiB none gzip-9 - oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/debug 540272e1-99d2-4d2e-9d3d-032014b0e6d9 100 GiB none gzip-9 - oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/debug 4adf2ef6-2694-4aac-aabe-688bca767092 100 GiB none gzip-9 - oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/debug 7e9d012a-6d8e-475e-805e-65985a66ffcd 100 GiB none gzip-9 - oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/debug 2189574d-9a73-4d25-858e-1084d57b59a8 100 GiB none gzip-9 - oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/debug 3cf0580b-4e1d-4ff9-bc22-4dc51ca9a53b 100 GiB none gzip-9 - oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/debug f499c5f8-b62f-493d-858a-8d33f7db81ff 100 GiB none gzip-9 - oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/debug c16ff3c0-3282-46de-a620-49c6b1e3f882 100 GiB none gzip-9 - oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/debug 8dde6eee-f28e-4b55-8c11-525884ec81e5 100 GiB none gzip-9 -+ oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/clickhouse_keeper 882d4fee-d6d4-455f-9dc1-de3637cd29d0 none none off -+ oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone/oxz_clickhouse_keeper_e222f1c0-39ca-463a-88ad-ebfb6022fd1a fbf9198e-996a-4194-af5b-c4e95ea4286d none none off + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crucible f18270c8-a39b-4579-be20-d2d1b80bba42 in service none none off + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crucible 06c2af14-055c-4041-aa26-9155f9f42661 in service none none off + oxp_44484c44-477a-4676-8266-b98a00e80d79/crucible 9deffea6-d340-4432-be3c-fad135dc29a5 in service none none off + oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crucible 47ca08b9-b962-43e2-99d7-c2e0556c0f52 in service none none off + oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crucible b2e54e29-6915-4b6d-bc76-6f72e5c7c55a in service none none off + oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crucible cb992d4e-7a69-4bcd-96c8-fe6e40989e24 in service none none off + oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crucible 68338fc3-2d8b-4419-b33d-4cce6fe9380d in service none none off + oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crucible 5294b99c-3eac-40e1-a35b-1f1cf2f0d6bf in service none none off + oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crucible 31718dcf-ebd5-432c-a9e5-40abcb40931c in service none none off + oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crucible ff7ff4a9-21c4-499e-9ceb-8a00a4bb21bc in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/clickhouse_keeper 473adeb2-a57a-4240-82e9-88f2bebc1245 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/clickhouse_server 4363b5f8-9a67-49af-b49d-585e532fa7bc in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/internal_dns 56a1af5d-de86-46c5-9504-2d1ee70587c5 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone 003c1d4e-15bb-4fca-aa71-a7dff507b124 in service none none off + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone bf35a148-62f0-4f88-8f60-0a13747daba2 in service none none off + oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/zone 9b1bf42e-6f06-44cc-af5b-bff65d929322 in service none none off + oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/zone 2c9d6bce-0293-4364-b8c9-4bdea345490e in service none none off + oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/zone 11726c79-6590-4831-8480-cf50e6322c8a in service none none off + oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/zone b463f0c2-3ae4-45f7-a38c-110731fcc5cb in service none none off + oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/zone 626abe12-321d-439b-ad8f-f8dfb2022f25 in service none none off + oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/zone 4200e2a7-0fd6-4631-9d60-21fd821193fe in service none none off + oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/zone 85f34c02-a35d-404e-8cde-bedf3e193b1c in service none none off + oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/zone dd19c2c5-0bc9-48de-a116-b92503569092 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_clickhouse_keeper_31a66e47-6252-4f38-aa92-f48637da152c 49f52cc5-74df-4cfa-b7f0-07c7e810940d in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_clickhouse_server_6fedfc94-2ae6-4cc7-a968-5185207284f4 f1143eb2-0685-4708-a471-968a58f93bad in service none none off + oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/zone/oxz_crucible_06b45c33-9a90-408b-8534-f94ab6df8a42 9e0a360d-c158-417f-a45f-9d29ee67cdce in service none none off + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone/oxz_crucible_32999e20-ed5c-4c25-b4bd-41a3fbaf1445 dd7a45b8-3175-4744-8b99-ce19b22bb8ce in service none none off + oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/zone/oxz_crucible_4a037563-f969-4028-8384-164bdf308c3c 0d5b2580-7190-4bcc-9982-5012dac51f05 in service none none off + oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/zone/oxz_crucible_6564394d-2c51-4252-b3b1-f5f88a72d7c3 26a1cc86-f717-4a12-b644-5acd168843aa in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_crucible_87427b40-5114-49cd-96bd-63edd61fce90 e7364079-58e3-4b36-81a7-b9e08f2a8fff in service none none off + oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/zone/oxz_crucible_8acdc189-d4da-45a7-b306-23b43e86f695 6fa84a9c-0161-40c9-b596-f3b2c679ef99 in service none none off + oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/zone/oxz_crucible_971ce633-cdc4-48cf-983e-dc272c1639eb cb8ca8a6-6a00-4aae-8702-1493e1c3b166 in service none none off + oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/zone/oxz_crucible_cfa6af7a-bf53-4fe6-bf1a-7ce3812d15c4 27323e49-f61e-4a73-bc87-f8d9f5082143 in service none none off + oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/zone/oxz_crucible_e145fb8e-df12-4df9-8049-b146ae0275be 35c46d33-4e08-4fad-90d2-3da719538ef2 in service none none off + oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/zone/oxz_crucible_f1d08ae7-68fe-4799-8f31-f1100887c6f0 02863a62-7624-4017-9269-412910ab73f0 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_crucible_pantry_f9e18694-fdff-46a3-b40d-570d43206f48 3cb3f346-9879-4023-b919-55c4172bbf23 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_internal_dns_a00d8ae3-d1db-4aef-9174-3ff867af5e9e c2d9b145-5e15-47be-a835-7e1f51f27679 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_nexus_8ccafc1f-97f9-4da7-bb04-d346213387ce dcc3603b-b160-42d9-a743-11075c3b6941 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_ntp_a1797f1d-2d2a-4396-9ab5-044630b41c35 5a70b3fe-9fad-4c17-982b-272b8595c2e8 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/debug 4e4b2f99-dc01-4793-a37a-072d942da264 in service 100 GiB none gzip-9 + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/debug 8573903d-9610-4084-b0c6-ffcbb5d96c39 in service 100 GiB none gzip-9 + oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/debug 540272e1-99d2-4d2e-9d3d-032014b0e6d9 in service 100 GiB none gzip-9 + oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/debug 4adf2ef6-2694-4aac-aabe-688bca767092 in service 100 GiB none gzip-9 + oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/debug 7e9d012a-6d8e-475e-805e-65985a66ffcd in service 100 GiB none gzip-9 + oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/debug 2189574d-9a73-4d25-858e-1084d57b59a8 in service 100 GiB none gzip-9 + oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/debug 3cf0580b-4e1d-4ff9-bc22-4dc51ca9a53b in service 100 GiB none gzip-9 + oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/debug f499c5f8-b62f-493d-858a-8d33f7db81ff in service 100 GiB none gzip-9 + oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/debug c16ff3c0-3282-46de-a620-49c6b1e3f882 in service 100 GiB none gzip-9 + oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/debug 8dde6eee-f28e-4b55-8c11-525884ec81e5 in service 100 GiB none gzip-9 ++ oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/clickhouse_keeper 882d4fee-d6d4-455f-9dc1-de3637cd29d0 in service none none off ++ oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone/oxz_clickhouse_keeper_e222f1c0-39ca-463a-88ad-ebfb6022fd1a fbf9198e-996a-4194-af5b-c4e95ea4286d in service none none off omicron zones generation 3 -> 4: @@ -217,60 +217,60 @@ to: blueprint 2886dab5-61a2-46b4-87af-bc7aeb44cccb datasets generation 3 -> 4: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crucible c73b47ac-ad1f-4cd1-b449-f220b5ad8104 none none off - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crucible 813c7aac-695b-49ce-8bc5-f4cdbfc04b38 none none off - oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crucible e5da836d-fffb-4435-8500-889c05b04689 none none off - oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crucible 9f8d056c-3e84-4474-b9c7-5b7a890a8a7b none none off - oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crucible e93cfc01-9581-4f6e-b77c-eb6300ca6ffb none none off - oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crucible f54d6e59-67a1-458b-8e66-6dc3b2adb755 none none off - oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crucible 6604dd1b-5f21-475d-952a-894717512d1b none none off - oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crucible 05cb728f-f6b9-4132-922d-fe249b1ba736 none none off - oxp_db16345e-427a-4c8e-9032-17270f729308/crucible 500f8d46-a32d-4bd1-8f2c-cb9d36822660 none none off - oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crucible 66c673a1-e8d8-4863-b368-a7ea292555fb none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/clickhouse_keeper 6c5a6622-5f75-45a0-a9e8-4b513f5ac352 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/clickhouse_server f8706468-85ac-4f9f-b41d-ff7c3a17ee5f none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/internal_dns 03de030d-d958-4ce5-86d2-368fa88e0bd8 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone 4c3c89bd-21cf-4986-b012-e89e4e1c1ac4 none none off - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone ff4a77a2-528a-4c70-a5b9-f0093c95697b none none off - oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/zone 676fc8c5-743b-48ca-99fd-2f2379c83890 none none off - oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/zone 63362c89-4b42-4649-9ebe-43e19a5c0e51 none none off - oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/zone 6f83a31e-1181-418f-92b0-d0534e9ae6dd none none off - oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/zone 260ffd7d-4da5-4657-9158-ba7e1eae5971 none none off - oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/zone ed4c8570-3951-4f79-b27e-da73150609be none none off - oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/zone e5dcf165-3ebb-40a2-b16f-a07b036a6533 none none off - oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/zone dd27be6b-214d-4022-a99d-2a7d12e7d8bb none none off - oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/zone b7500d95-2499-48fc-a7d6-2460d61e197a none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_clickhouse_keeper_7aa82b80-0c37-4f20-9398-bfce4707f327 0bf9cddb-1911-495b-8aad-09b7eea5fff4 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_clickhouse_server_812be70a-f237-47d5-ab49-f9450fe948db 292f53fc-27bb-4cc4-a61b-7d02c978149c none none off - oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/zone/oxz_crucible_0b0e12fd-2800-4203-acb6-24e6e976271c cf46ee68-f945-4af6-a647-4d612c1f05be none none off - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone/oxz_crucible_1a02d419-10c4-4326-b34e-eb2b1bd90bd7 2a439799-3f16-46df-ba1b-7ea29edd392d none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_crucible_56e18c31-f630-4643-ad5c-1fede34f35de c30be90e-20cf-46c6-bb4a-b65d2c407878 none none off - oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/zone/oxz_crucible_5ea86015-8f62-40aa-b3b2-c659f17ee510 6289ea03-b2c9-4470-b7ba-b935450aa764 none none off - oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/zone/oxz_crucible_78965849-e6e3-4250-a66a-dc50512fad34 43b36ba3-e516-4732-be8b-8cd2ca9de93c none none off - oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/zone/oxz_crucible_90c484e5-69d3-4636-9c64-6a878f593d33 7cc8018e-323f-4d35-bb33-fcf557b9dace none none off - oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/zone/oxz_crucible_a3901043-fa2a-4ef7-a40e-6ef0e5fd189f 88fd4e5a-50fd-43c7-8a75-0ad4376bd564 none none off - oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/zone/oxz_crucible_be9fd98a-6422-4890-a32b-42d42d1c8957 932cbb0d-b1d0-423d-87b6-9dce8ddb6338 none none off - oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/zone/oxz_crucible_bf71d1a8-9e65-479d-8920-0be8e3422ac5 fd0ce816-4da0-4490-be32-4d38fb78c13c none none off - oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/zone/oxz_crucible_eb4176ea-456b-48f6-b284-7b76da0bf4a1 704ea6b5-0ffc-443f-ae8a-482666f8277c none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_crucible_pantry_417c97a4-fe25-439d-8359-3f7062981923 8957a276-6d4e-4c58-a856-d7c5433806e1 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_internal_dns_f2bbaa79-0eab-4b91-a404-dad4c19b58c2 fe0f566f-3cff-43ef-960c-649c27746c56 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_nexus_33ba37c4-2535-4095-a7e9-c69937fc584d 77d0cd16-b6e3-484d-962f-0477cd242482 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_ntp_47eab17a-4dd4-4467-90b2-f643f465cf34 4eaf1849-1fe4-415c-bdc7-4cc04cac20ce none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/debug c5b8f4f9-bd10-45b8-a9f3-93adf1402ecc 100 GiB none gzip-9 - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/debug 43abf982-d457-46d1-8566-8047d2a78a41 100 GiB none gzip-9 - oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/debug 1b6a1722-d9f7-48ea-b351-5bc8bad4fd07 100 GiB none gzip-9 - oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/debug 8be43fb0-00e7-4748-9a1a-ace9772d8a83 100 GiB none gzip-9 - oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/debug 2ccb3aa9-f0ef-4fd4-9fd7-43b4a88b8d6b 100 GiB none gzip-9 - oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/debug 56759eb6-69e9-46a3-b44c-fc748cd506aa 100 GiB none gzip-9 - oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/debug 76fffbd2-9c74-46b5-8033-f442be1256f5 100 GiB none gzip-9 - oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/debug c13a3d71-1241-42d1-95a8-d720c20ee2c4 100 GiB none gzip-9 - oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/debug f030ef33-cad2-4760-9431-1907b797161b 100 GiB none gzip-9 - oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/debug 947b2823-3dca-4b56-9324-f476e2c1c6da 100 GiB none gzip-9 -+ oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/clickhouse_keeper f6464cd8-84bc-4bae-8386-c0a5a82aab95 none none off -+ oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone/oxz_clickhouse_keeper_60cf5091-670b-48c9-a729-b82c5e7683ca 8ee3f0bb-d102-4a00-af81-72e2f284878b none none off + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crucible c73b47ac-ad1f-4cd1-b449-f220b5ad8104 in service none none off + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crucible 813c7aac-695b-49ce-8bc5-f4cdbfc04b38 in service none none off + oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crucible e5da836d-fffb-4435-8500-889c05b04689 in service none none off + oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crucible 9f8d056c-3e84-4474-b9c7-5b7a890a8a7b in service none none off + oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crucible e93cfc01-9581-4f6e-b77c-eb6300ca6ffb in service none none off + oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crucible f54d6e59-67a1-458b-8e66-6dc3b2adb755 in service none none off + oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crucible 6604dd1b-5f21-475d-952a-894717512d1b in service none none off + oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crucible 05cb728f-f6b9-4132-922d-fe249b1ba736 in service none none off + oxp_db16345e-427a-4c8e-9032-17270f729308/crucible 500f8d46-a32d-4bd1-8f2c-cb9d36822660 in service none none off + oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crucible 66c673a1-e8d8-4863-b368-a7ea292555fb in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/clickhouse_keeper 6c5a6622-5f75-45a0-a9e8-4b513f5ac352 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/clickhouse_server f8706468-85ac-4f9f-b41d-ff7c3a17ee5f in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/internal_dns 03de030d-d958-4ce5-86d2-368fa88e0bd8 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone 4c3c89bd-21cf-4986-b012-e89e4e1c1ac4 in service none none off + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone ff4a77a2-528a-4c70-a5b9-f0093c95697b in service none none off + oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/zone 676fc8c5-743b-48ca-99fd-2f2379c83890 in service none none off + oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/zone 63362c89-4b42-4649-9ebe-43e19a5c0e51 in service none none off + oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/zone 6f83a31e-1181-418f-92b0-d0534e9ae6dd in service none none off + oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/zone 260ffd7d-4da5-4657-9158-ba7e1eae5971 in service none none off + oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/zone ed4c8570-3951-4f79-b27e-da73150609be in service none none off + oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/zone e5dcf165-3ebb-40a2-b16f-a07b036a6533 in service none none off + oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/zone dd27be6b-214d-4022-a99d-2a7d12e7d8bb in service none none off + oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/zone b7500d95-2499-48fc-a7d6-2460d61e197a in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_clickhouse_keeper_7aa82b80-0c37-4f20-9398-bfce4707f327 0bf9cddb-1911-495b-8aad-09b7eea5fff4 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_clickhouse_server_812be70a-f237-47d5-ab49-f9450fe948db 292f53fc-27bb-4cc4-a61b-7d02c978149c in service none none off + oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/zone/oxz_crucible_0b0e12fd-2800-4203-acb6-24e6e976271c cf46ee68-f945-4af6-a647-4d612c1f05be in service none none off + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone/oxz_crucible_1a02d419-10c4-4326-b34e-eb2b1bd90bd7 2a439799-3f16-46df-ba1b-7ea29edd392d in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_crucible_56e18c31-f630-4643-ad5c-1fede34f35de c30be90e-20cf-46c6-bb4a-b65d2c407878 in service none none off + oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/zone/oxz_crucible_5ea86015-8f62-40aa-b3b2-c659f17ee510 6289ea03-b2c9-4470-b7ba-b935450aa764 in service none none off + oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/zone/oxz_crucible_78965849-e6e3-4250-a66a-dc50512fad34 43b36ba3-e516-4732-be8b-8cd2ca9de93c in service none none off + oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/zone/oxz_crucible_90c484e5-69d3-4636-9c64-6a878f593d33 7cc8018e-323f-4d35-bb33-fcf557b9dace in service none none off + oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/zone/oxz_crucible_a3901043-fa2a-4ef7-a40e-6ef0e5fd189f 88fd4e5a-50fd-43c7-8a75-0ad4376bd564 in service none none off + oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/zone/oxz_crucible_be9fd98a-6422-4890-a32b-42d42d1c8957 932cbb0d-b1d0-423d-87b6-9dce8ddb6338 in service none none off + oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/zone/oxz_crucible_bf71d1a8-9e65-479d-8920-0be8e3422ac5 fd0ce816-4da0-4490-be32-4d38fb78c13c in service none none off + oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/zone/oxz_crucible_eb4176ea-456b-48f6-b284-7b76da0bf4a1 704ea6b5-0ffc-443f-ae8a-482666f8277c in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_crucible_pantry_417c97a4-fe25-439d-8359-3f7062981923 8957a276-6d4e-4c58-a856-d7c5433806e1 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_internal_dns_f2bbaa79-0eab-4b91-a404-dad4c19b58c2 fe0f566f-3cff-43ef-960c-649c27746c56 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_nexus_33ba37c4-2535-4095-a7e9-c69937fc584d 77d0cd16-b6e3-484d-962f-0477cd242482 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_ntp_47eab17a-4dd4-4467-90b2-f643f465cf34 4eaf1849-1fe4-415c-bdc7-4cc04cac20ce in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/debug c5b8f4f9-bd10-45b8-a9f3-93adf1402ecc in service 100 GiB none gzip-9 + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/debug 43abf982-d457-46d1-8566-8047d2a78a41 in service 100 GiB none gzip-9 + oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/debug 1b6a1722-d9f7-48ea-b351-5bc8bad4fd07 in service 100 GiB none gzip-9 + oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/debug 8be43fb0-00e7-4748-9a1a-ace9772d8a83 in service 100 GiB none gzip-9 + oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/debug 2ccb3aa9-f0ef-4fd4-9fd7-43b4a88b8d6b in service 100 GiB none gzip-9 + oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/debug 56759eb6-69e9-46a3-b44c-fc748cd506aa in service 100 GiB none gzip-9 + oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/debug 76fffbd2-9c74-46b5-8033-f442be1256f5 in service 100 GiB none gzip-9 + oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/debug c13a3d71-1241-42d1-95a8-d720c20ee2c4 in service 100 GiB none gzip-9 + oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/debug f030ef33-cad2-4760-9431-1907b797161b in service 100 GiB none gzip-9 + oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/debug 947b2823-3dca-4b56-9324-f476e2c1c6da in service 100 GiB none gzip-9 ++ oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/clickhouse_keeper f6464cd8-84bc-4bae-8386-c0a5a82aab95 in service none none off ++ oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone/oxz_clickhouse_keeper_60cf5091-670b-48c9-a729-b82c5e7683ca 8ee3f0bb-d102-4a00-af81-72e2f284878b in service none none off omicron zones generation 3 -> 4: diff --git a/nexus/reconfigurator/planning/tests/output/planner_deploy_all_keeper_nodes_5_6.txt b/nexus/reconfigurator/planning/tests/output/planner_deploy_all_keeper_nodes_5_6.txt index e55784c7a6e..c7f2cf502bc 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_deploy_all_keeper_nodes_5_6.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_deploy_all_keeper_nodes_5_6.txt @@ -22,58 +22,58 @@ to: blueprint cb39be9d-5476-44fa-9edf-9938376219ef datasets at generation 3: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crucible 723e4ec2-5f4a-48a9-a6a1-cb523dc47d3d none none off - oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crucible b2796e6b-ad7d-41a5-82a6-947b96e42d47 none none off - oxp_736d4cab-c262-485e-89c2-07e6543f0855/crucible c993b4da-bea9-4010-a8d6-17d733698f07 none none off - oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crucible 4f497ece-88c1-4557-a8b4-0e990f9941a9 none none off - oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crucible 43a16c22-e79a-4bea-bcf6-682099a728dd none none off - oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crucible b6bbb45b-68fc-4fa5-86cc-b59b0f797fb2 none none off - oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crucible e4838ed0-304f-475e-a282-9f644f2ba3e5 none none off - oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crucible 046f2730-768d-4bcc-8ebf-4b5f5597151c none none off - oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crucible 0830fc6d-ed82-41de-9389-0bd3fd4677ea none none off - oxp_fbf997ef-52d3-438a-b036-b9117322e569/crucible d9662141-585e-4e18-a461-9627097f02a2 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/clickhouse a4f84c49-4303-411f-bb1b-08877d828946 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/clickhouse_keeper 04ee4b4b-fcbe-4224-86fd-30144a4f2592 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/internal_dns 2edca3dc-a0e5-4d34-b8a2-065be4cca767 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone 87cd9f37-3de3-457c-9412-d0dc5678eda8 none none off - oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/zone 3a164f36-1f53-45b3-b190-ad8a2817bc69 none none off - oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/zone 407556ed-09ab-430e-bc8f-8291b8f8c8fe none none off - oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/zone 99d57d61-f12a-4b56-8114-86ba92d07649 none none off - oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/zone da1eb596-8764-4268-a60b-f4705b4f615b none none off - oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/zone d555bf19-887c-48d2-8144-47c2eac9a9e8 none none off - oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/zone 9785e77a-9422-4b46-a4ae-8b9a155eb121 none none off - oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/zone 1192a37c-a871-4c48-905d-03c3d6035bdc none none off - oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/zone 7bf1c7ec-5465-4bfd-b1d9-939f05336012 none none off - oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/zone be526b44-2c78-49ec-8ab4-73e161e27f22 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_clickhouse_35e8d4b6-ea92-45cf-923c-3f566a0b1fe5 cd7e5c3a-2328-4568-b8f8-cf349f0cdd12 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_clickhouse_keeper_dd5ab8b1-e6e7-40e0-9ea6-b6a16f485b52 a51fb98f-3fff-4c0a-82f0-7a4aad82096b none none off - oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/zone/oxz_crucible_044d074d-7905-4024-82ff-68d76221db68 98fd0f42-7337-4ce7-814e-f988304b8873 none none off - oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/zone/oxz_crucible_28826473-ac0b-41ea-8c54-72b782db1bcb bbda84d8-c4ca-4f52-a766-681872fa06f0 none none off - oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/zone/oxz_crucible_2d3ff798-dda9-4ccf-8f91-070a20f06d55 e9c77dbd-c56a-404c-8ff9-6504b3f92556 none none off - oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/zone/oxz_crucible_7538d29b-69f2-43e8-8509-505b25cb1c84 19110f8a-6267-41ed-ac7d-539cd0fe3511 none none off - oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/zone/oxz_crucible_8234bbd2-4b31-4f6b-8dcc-4744b1d14e64 0fe4f647-ffd2-4845-805a-c069096560ee none none off - oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/zone/oxz_crucible_85358363-cee8-4bc3-af66-4d89e5cd714f a1daa561-2448-4afb-8233-ec149d2bd7f4 none none off - oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/zone/oxz_crucible_9b58d04f-85bf-4f5e-8c6a-5d855062d5c4 69812f66-4b59-4590-9e1f-bce3e93b3b08 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_crucible_e7da0aec-c6b6-4a56-9525-35385b9c62a2 36e58025-88e2-4eb9-8af0-ed9a98dda1b9 none none off - oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/zone/oxz_crucible_f3f977cc-7eca-4491-9b07-82b6284eb169 482fad9a-d83f-4025-8f0b-d3adea6ae2cf none none off - oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/zone/oxz_crucible_fef381d2-8368-4a2d-96a1-c956ed011f7b b1937368-4019-40c4-af02-9811dc7eb143 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_crucible_pantry_fe63bfd3-3128-4675-8118-cf6968293471 e3b31ef3-6b54-4901-aec4-0c672de62c7f none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_internal_dns_b6b0689e-ef48-484d-b3c7-3c596edad20c 501e0672-2897-4992-8911-600e0283f04c none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_nexus_46ecde76-fef7-4394-93dd-d22b003148e9 53655959-866b-4fee-bcf9-1e35504ad625 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_ntp_4d009155-44fb-45b9-afed-f89cb57ce8da 0590facf-202a-463b-81be-b6e88c47da76 none none off - oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/debug 8f7f16c1-d9fb-4405-9dcf-68bfbaa7bf8c 100 GiB none gzip-9 - oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/debug 6482f332-801a-473f-a77d-e07d30e2a5b7 100 GiB none gzip-9 - oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/debug 0bb0541f-2c64-487b-a8af-162454207504 100 GiB none gzip-9 - oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/debug 902a6889-244f-4b67-baa4-b245f3d622c8 100 GiB none gzip-9 - oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/debug 667ffd3c-6735-4b50-bc3b-cfa32fcc811e 100 GiB none gzip-9 - oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/debug cf48ba87-a4bb-435f-999b-bca46cfd6a89 100 GiB none gzip-9 - oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/debug 7d64cab3-7311-4519-ae4a-1af6b320fa9b 100 GiB none gzip-9 - oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/debug d3e957fd-5f26-498a-8fa3-deaea4dc5820 100 GiB none gzip-9 - oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/debug 4da77f4a-5e41-4604-af30-8cf568c38428 100 GiB none gzip-9 - oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/debug 03935cb1-ce06-4594-b2fe-23e127d1cd9d 100 GiB none gzip-9 + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crucible 723e4ec2-5f4a-48a9-a6a1-cb523dc47d3d in service none none off + oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crucible b2796e6b-ad7d-41a5-82a6-947b96e42d47 in service none none off + oxp_736d4cab-c262-485e-89c2-07e6543f0855/crucible c993b4da-bea9-4010-a8d6-17d733698f07 in service none none off + oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crucible 4f497ece-88c1-4557-a8b4-0e990f9941a9 in service none none off + oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crucible 43a16c22-e79a-4bea-bcf6-682099a728dd in service none none off + oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crucible b6bbb45b-68fc-4fa5-86cc-b59b0f797fb2 in service none none off + oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crucible e4838ed0-304f-475e-a282-9f644f2ba3e5 in service none none off + oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crucible 046f2730-768d-4bcc-8ebf-4b5f5597151c in service none none off + oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crucible 0830fc6d-ed82-41de-9389-0bd3fd4677ea in service none none off + oxp_fbf997ef-52d3-438a-b036-b9117322e569/crucible d9662141-585e-4e18-a461-9627097f02a2 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/clickhouse a4f84c49-4303-411f-bb1b-08877d828946 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/clickhouse_keeper 04ee4b4b-fcbe-4224-86fd-30144a4f2592 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/internal_dns 2edca3dc-a0e5-4d34-b8a2-065be4cca767 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone 87cd9f37-3de3-457c-9412-d0dc5678eda8 in service none none off + oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/zone 3a164f36-1f53-45b3-b190-ad8a2817bc69 in service none none off + oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/zone 407556ed-09ab-430e-bc8f-8291b8f8c8fe in service none none off + oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/zone 99d57d61-f12a-4b56-8114-86ba92d07649 in service none none off + oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/zone da1eb596-8764-4268-a60b-f4705b4f615b in service none none off + oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/zone d555bf19-887c-48d2-8144-47c2eac9a9e8 in service none none off + oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/zone 9785e77a-9422-4b46-a4ae-8b9a155eb121 in service none none off + oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/zone 1192a37c-a871-4c48-905d-03c3d6035bdc in service none none off + oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/zone 7bf1c7ec-5465-4bfd-b1d9-939f05336012 in service none none off + oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/zone be526b44-2c78-49ec-8ab4-73e161e27f22 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_clickhouse_35e8d4b6-ea92-45cf-923c-3f566a0b1fe5 cd7e5c3a-2328-4568-b8f8-cf349f0cdd12 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_clickhouse_keeper_dd5ab8b1-e6e7-40e0-9ea6-b6a16f485b52 a51fb98f-3fff-4c0a-82f0-7a4aad82096b in service none none off + oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/zone/oxz_crucible_044d074d-7905-4024-82ff-68d76221db68 98fd0f42-7337-4ce7-814e-f988304b8873 in service none none off + oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/zone/oxz_crucible_28826473-ac0b-41ea-8c54-72b782db1bcb bbda84d8-c4ca-4f52-a766-681872fa06f0 in service none none off + oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/zone/oxz_crucible_2d3ff798-dda9-4ccf-8f91-070a20f06d55 e9c77dbd-c56a-404c-8ff9-6504b3f92556 in service none none off + oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/zone/oxz_crucible_7538d29b-69f2-43e8-8509-505b25cb1c84 19110f8a-6267-41ed-ac7d-539cd0fe3511 in service none none off + oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/zone/oxz_crucible_8234bbd2-4b31-4f6b-8dcc-4744b1d14e64 0fe4f647-ffd2-4845-805a-c069096560ee in service none none off + oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/zone/oxz_crucible_85358363-cee8-4bc3-af66-4d89e5cd714f a1daa561-2448-4afb-8233-ec149d2bd7f4 in service none none off + oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/zone/oxz_crucible_9b58d04f-85bf-4f5e-8c6a-5d855062d5c4 69812f66-4b59-4590-9e1f-bce3e93b3b08 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_crucible_e7da0aec-c6b6-4a56-9525-35385b9c62a2 36e58025-88e2-4eb9-8af0-ed9a98dda1b9 in service none none off + oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/zone/oxz_crucible_f3f977cc-7eca-4491-9b07-82b6284eb169 482fad9a-d83f-4025-8f0b-d3adea6ae2cf in service none none off + oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/zone/oxz_crucible_fef381d2-8368-4a2d-96a1-c956ed011f7b b1937368-4019-40c4-af02-9811dc7eb143 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_crucible_pantry_fe63bfd3-3128-4675-8118-cf6968293471 e3b31ef3-6b54-4901-aec4-0c672de62c7f in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_internal_dns_b6b0689e-ef48-484d-b3c7-3c596edad20c 501e0672-2897-4992-8911-600e0283f04c in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_nexus_46ecde76-fef7-4394-93dd-d22b003148e9 53655959-866b-4fee-bcf9-1e35504ad625 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/zone/oxz_ntp_4d009155-44fb-45b9-afed-f89cb57ce8da 0590facf-202a-463b-81be-b6e88c47da76 in service none none off + oxp_60e6b021-79d6-4a6b-917c-6637e0769558/crypt/debug 8f7f16c1-d9fb-4405-9dcf-68bfbaa7bf8c in service 100 GiB none gzip-9 + oxp_71a07ac0-d24e-446c-a202-1998e7f6ac8c/crypt/debug 6482f332-801a-473f-a77d-e07d30e2a5b7 in service 100 GiB none gzip-9 + oxp_736d4cab-c262-485e-89c2-07e6543f0855/crypt/debug 0bb0541f-2c64-487b-a8af-162454207504 in service 100 GiB none gzip-9 + oxp_8ae56ca0-709d-4b8f-9869-51b62b542eef/crypt/debug 902a6889-244f-4b67-baa4-b245f3d622c8 in service 100 GiB none gzip-9 + oxp_8e0bcc4f-0799-450c-a0ad-80c1637f59e3/crypt/debug 667ffd3c-6735-4b50-bc3b-cfa32fcc811e in service 100 GiB none gzip-9 + oxp_8eeebb8e-6db6-43e8-a429-d26dde99882c/crypt/debug cf48ba87-a4bb-435f-999b-bca46cfd6a89 in service 100 GiB none gzip-9 + oxp_a3e8de5b-c47a-49c0-b698-4d6955e1327f/crypt/debug 7d64cab3-7311-4519-ae4a-1af6b320fa9b in service 100 GiB none gzip-9 + oxp_b32fa3da-4dec-4237-9776-e1a57ba15a21/crypt/debug d3e957fd-5f26-498a-8fa3-deaea4dc5820 in service 100 GiB none gzip-9 + oxp_e9c238f6-87a3-4087-8ba4-aa594a82d012/crypt/debug 4da77f4a-5e41-4604-af30-8cf568c38428 in service 100 GiB none gzip-9 + oxp_fbf997ef-52d3-438a-b036-b9117322e569/crypt/debug 03935cb1-ce06-4594-b2fe-23e127d1cd9d in service 100 GiB none gzip-9 omicron zones at generation 3: @@ -117,60 +117,60 @@ to: blueprint cb39be9d-5476-44fa-9edf-9938376219ef datasets at generation 4: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crucible f18270c8-a39b-4579-be20-d2d1b80bba42 none none off - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crucible 06c2af14-055c-4041-aa26-9155f9f42661 none none off - oxp_44484c44-477a-4676-8266-b98a00e80d79/crucible 9deffea6-d340-4432-be3c-fad135dc29a5 none none off - oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crucible 47ca08b9-b962-43e2-99d7-c2e0556c0f52 none none off - oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crucible b2e54e29-6915-4b6d-bc76-6f72e5c7c55a none none off - oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crucible cb992d4e-7a69-4bcd-96c8-fe6e40989e24 none none off - oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crucible 68338fc3-2d8b-4419-b33d-4cce6fe9380d none none off - oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crucible 5294b99c-3eac-40e1-a35b-1f1cf2f0d6bf none none off - oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crucible 31718dcf-ebd5-432c-a9e5-40abcb40931c none none off - oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crucible ff7ff4a9-21c4-499e-9ceb-8a00a4bb21bc none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/clickhouse_keeper 473adeb2-a57a-4240-82e9-88f2bebc1245 none none off - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/clickhouse_keeper 882d4fee-d6d4-455f-9dc1-de3637cd29d0 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/clickhouse_server 4363b5f8-9a67-49af-b49d-585e532fa7bc none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/internal_dns 56a1af5d-de86-46c5-9504-2d1ee70587c5 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone 003c1d4e-15bb-4fca-aa71-a7dff507b124 none none off - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone bf35a148-62f0-4f88-8f60-0a13747daba2 none none off - oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/zone 9b1bf42e-6f06-44cc-af5b-bff65d929322 none none off - oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/zone 2c9d6bce-0293-4364-b8c9-4bdea345490e none none off - oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/zone 11726c79-6590-4831-8480-cf50e6322c8a none none off - oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/zone b463f0c2-3ae4-45f7-a38c-110731fcc5cb none none off - oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/zone 626abe12-321d-439b-ad8f-f8dfb2022f25 none none off - oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/zone 4200e2a7-0fd6-4631-9d60-21fd821193fe none none off - oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/zone 85f34c02-a35d-404e-8cde-bedf3e193b1c none none off - oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/zone dd19c2c5-0bc9-48de-a116-b92503569092 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_clickhouse_keeper_31a66e47-6252-4f38-aa92-f48637da152c 49f52cc5-74df-4cfa-b7f0-07c7e810940d none none off - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone/oxz_clickhouse_keeper_e222f1c0-39ca-463a-88ad-ebfb6022fd1a fbf9198e-996a-4194-af5b-c4e95ea4286d none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_clickhouse_server_6fedfc94-2ae6-4cc7-a968-5185207284f4 f1143eb2-0685-4708-a471-968a58f93bad none none off - oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/zone/oxz_crucible_06b45c33-9a90-408b-8534-f94ab6df8a42 9e0a360d-c158-417f-a45f-9d29ee67cdce none none off - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone/oxz_crucible_32999e20-ed5c-4c25-b4bd-41a3fbaf1445 dd7a45b8-3175-4744-8b99-ce19b22bb8ce none none off - oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/zone/oxz_crucible_4a037563-f969-4028-8384-164bdf308c3c 0d5b2580-7190-4bcc-9982-5012dac51f05 none none off - oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/zone/oxz_crucible_6564394d-2c51-4252-b3b1-f5f88a72d7c3 26a1cc86-f717-4a12-b644-5acd168843aa none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_crucible_87427b40-5114-49cd-96bd-63edd61fce90 e7364079-58e3-4b36-81a7-b9e08f2a8fff none none off - oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/zone/oxz_crucible_8acdc189-d4da-45a7-b306-23b43e86f695 6fa84a9c-0161-40c9-b596-f3b2c679ef99 none none off - oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/zone/oxz_crucible_971ce633-cdc4-48cf-983e-dc272c1639eb cb8ca8a6-6a00-4aae-8702-1493e1c3b166 none none off - oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/zone/oxz_crucible_cfa6af7a-bf53-4fe6-bf1a-7ce3812d15c4 27323e49-f61e-4a73-bc87-f8d9f5082143 none none off - oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/zone/oxz_crucible_e145fb8e-df12-4df9-8049-b146ae0275be 35c46d33-4e08-4fad-90d2-3da719538ef2 none none off - oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/zone/oxz_crucible_f1d08ae7-68fe-4799-8f31-f1100887c6f0 02863a62-7624-4017-9269-412910ab73f0 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_crucible_pantry_f9e18694-fdff-46a3-b40d-570d43206f48 3cb3f346-9879-4023-b919-55c4172bbf23 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_internal_dns_a00d8ae3-d1db-4aef-9174-3ff867af5e9e c2d9b145-5e15-47be-a835-7e1f51f27679 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_nexus_8ccafc1f-97f9-4da7-bb04-d346213387ce dcc3603b-b160-42d9-a743-11075c3b6941 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_ntp_a1797f1d-2d2a-4396-9ab5-044630b41c35 5a70b3fe-9fad-4c17-982b-272b8595c2e8 none none off - oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/debug 4e4b2f99-dc01-4793-a37a-072d942da264 100 GiB none gzip-9 - oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/debug 8573903d-9610-4084-b0c6-ffcbb5d96c39 100 GiB none gzip-9 - oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/debug 540272e1-99d2-4d2e-9d3d-032014b0e6d9 100 GiB none gzip-9 - oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/debug 4adf2ef6-2694-4aac-aabe-688bca767092 100 GiB none gzip-9 - oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/debug 7e9d012a-6d8e-475e-805e-65985a66ffcd 100 GiB none gzip-9 - oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/debug 2189574d-9a73-4d25-858e-1084d57b59a8 100 GiB none gzip-9 - oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/debug 3cf0580b-4e1d-4ff9-bc22-4dc51ca9a53b 100 GiB none gzip-9 - oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/debug f499c5f8-b62f-493d-858a-8d33f7db81ff 100 GiB none gzip-9 - oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/debug c16ff3c0-3282-46de-a620-49c6b1e3f882 100 GiB none gzip-9 - oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/debug 8dde6eee-f28e-4b55-8c11-525884ec81e5 100 GiB none gzip-9 + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crucible f18270c8-a39b-4579-be20-d2d1b80bba42 in service none none off + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crucible 06c2af14-055c-4041-aa26-9155f9f42661 in service none none off + oxp_44484c44-477a-4676-8266-b98a00e80d79/crucible 9deffea6-d340-4432-be3c-fad135dc29a5 in service none none off + oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crucible 47ca08b9-b962-43e2-99d7-c2e0556c0f52 in service none none off + oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crucible b2e54e29-6915-4b6d-bc76-6f72e5c7c55a in service none none off + oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crucible cb992d4e-7a69-4bcd-96c8-fe6e40989e24 in service none none off + oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crucible 68338fc3-2d8b-4419-b33d-4cce6fe9380d in service none none off + oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crucible 5294b99c-3eac-40e1-a35b-1f1cf2f0d6bf in service none none off + oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crucible 31718dcf-ebd5-432c-a9e5-40abcb40931c in service none none off + oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crucible ff7ff4a9-21c4-499e-9ceb-8a00a4bb21bc in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/clickhouse_keeper 473adeb2-a57a-4240-82e9-88f2bebc1245 in service none none off + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/clickhouse_keeper 882d4fee-d6d4-455f-9dc1-de3637cd29d0 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/clickhouse_server 4363b5f8-9a67-49af-b49d-585e532fa7bc in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/internal_dns 56a1af5d-de86-46c5-9504-2d1ee70587c5 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone 003c1d4e-15bb-4fca-aa71-a7dff507b124 in service none none off + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone bf35a148-62f0-4f88-8f60-0a13747daba2 in service none none off + oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/zone 9b1bf42e-6f06-44cc-af5b-bff65d929322 in service none none off + oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/zone 2c9d6bce-0293-4364-b8c9-4bdea345490e in service none none off + oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/zone 11726c79-6590-4831-8480-cf50e6322c8a in service none none off + oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/zone b463f0c2-3ae4-45f7-a38c-110731fcc5cb in service none none off + oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/zone 626abe12-321d-439b-ad8f-f8dfb2022f25 in service none none off + oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/zone 4200e2a7-0fd6-4631-9d60-21fd821193fe in service none none off + oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/zone 85f34c02-a35d-404e-8cde-bedf3e193b1c in service none none off + oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/zone dd19c2c5-0bc9-48de-a116-b92503569092 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_clickhouse_keeper_31a66e47-6252-4f38-aa92-f48637da152c 49f52cc5-74df-4cfa-b7f0-07c7e810940d in service none none off + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone/oxz_clickhouse_keeper_e222f1c0-39ca-463a-88ad-ebfb6022fd1a fbf9198e-996a-4194-af5b-c4e95ea4286d in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_clickhouse_server_6fedfc94-2ae6-4cc7-a968-5185207284f4 f1143eb2-0685-4708-a471-968a58f93bad in service none none off + oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/zone/oxz_crucible_06b45c33-9a90-408b-8534-f94ab6df8a42 9e0a360d-c158-417f-a45f-9d29ee67cdce in service none none off + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/zone/oxz_crucible_32999e20-ed5c-4c25-b4bd-41a3fbaf1445 dd7a45b8-3175-4744-8b99-ce19b22bb8ce in service none none off + oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/zone/oxz_crucible_4a037563-f969-4028-8384-164bdf308c3c 0d5b2580-7190-4bcc-9982-5012dac51f05 in service none none off + oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/zone/oxz_crucible_6564394d-2c51-4252-b3b1-f5f88a72d7c3 26a1cc86-f717-4a12-b644-5acd168843aa in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_crucible_87427b40-5114-49cd-96bd-63edd61fce90 e7364079-58e3-4b36-81a7-b9e08f2a8fff in service none none off + oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/zone/oxz_crucible_8acdc189-d4da-45a7-b306-23b43e86f695 6fa84a9c-0161-40c9-b596-f3b2c679ef99 in service none none off + oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/zone/oxz_crucible_971ce633-cdc4-48cf-983e-dc272c1639eb cb8ca8a6-6a00-4aae-8702-1493e1c3b166 in service none none off + oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/zone/oxz_crucible_cfa6af7a-bf53-4fe6-bf1a-7ce3812d15c4 27323e49-f61e-4a73-bc87-f8d9f5082143 in service none none off + oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/zone/oxz_crucible_e145fb8e-df12-4df9-8049-b146ae0275be 35c46d33-4e08-4fad-90d2-3da719538ef2 in service none none off + oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/zone/oxz_crucible_f1d08ae7-68fe-4799-8f31-f1100887c6f0 02863a62-7624-4017-9269-412910ab73f0 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_crucible_pantry_f9e18694-fdff-46a3-b40d-570d43206f48 3cb3f346-9879-4023-b919-55c4172bbf23 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_internal_dns_a00d8ae3-d1db-4aef-9174-3ff867af5e9e c2d9b145-5e15-47be-a835-7e1f51f27679 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_nexus_8ccafc1f-97f9-4da7-bb04-d346213387ce dcc3603b-b160-42d9-a743-11075c3b6941 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/zone/oxz_ntp_a1797f1d-2d2a-4396-9ab5-044630b41c35 5a70b3fe-9fad-4c17-982b-272b8595c2e8 in service none none off + oxp_0bf9d028-2b4a-4bff-82a1-6eb5fcefd985/crypt/debug 4e4b2f99-dc01-4793-a37a-072d942da264 in service 100 GiB none gzip-9 + oxp_19293a1d-fddc-40a7-88a4-ccafdb6f66d3/crypt/debug 8573903d-9610-4084-b0c6-ffcbb5d96c39 in service 100 GiB none gzip-9 + oxp_44484c44-477a-4676-8266-b98a00e80d79/crypt/debug 540272e1-99d2-4d2e-9d3d-032014b0e6d9 in service 100 GiB none gzip-9 + oxp_79787cd4-92da-4de5-bfd8-30a635521e10/crypt/debug 4adf2ef6-2694-4aac-aabe-688bca767092 in service 100 GiB none gzip-9 + oxp_9ae94c94-baae-477e-912a-60f0c4f3bd13/crypt/debug 7e9d012a-6d8e-475e-805e-65985a66ffcd in service 100 GiB none gzip-9 + oxp_af85eec8-36b3-4b88-966d-a717b9b58fe5/crypt/debug 2189574d-9a73-4d25-858e-1084d57b59a8 in service 100 GiB none gzip-9 + oxp_ddfaaba3-dafe-4103-b868-e9843d29d346/crypt/debug 3cf0580b-4e1d-4ff9-bc22-4dc51ca9a53b in service 100 GiB none gzip-9 + oxp_ec458c3e-91ca-40f1-a2a3-3f4292c1f279/crypt/debug f499c5f8-b62f-493d-858a-8d33f7db81ff in service 100 GiB none gzip-9 + oxp_f2fc7c4c-7966-449d-8ec3-5a70f460501d/crypt/debug c16ff3c0-3282-46de-a620-49c6b1e3f882 in service 100 GiB none gzip-9 + oxp_f635c28a-e5ca-4d22-ac94-d8f278a6ea0e/crypt/debug 8dde6eee-f28e-4b55-8c11-525884ec81e5 in service 100 GiB none gzip-9 omicron zones at generation 4: @@ -215,60 +215,60 @@ to: blueprint cb39be9d-5476-44fa-9edf-9938376219ef datasets at generation 4: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crucible c73b47ac-ad1f-4cd1-b449-f220b5ad8104 none none off - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crucible 813c7aac-695b-49ce-8bc5-f4cdbfc04b38 none none off - oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crucible e5da836d-fffb-4435-8500-889c05b04689 none none off - oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crucible 9f8d056c-3e84-4474-b9c7-5b7a890a8a7b none none off - oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crucible e93cfc01-9581-4f6e-b77c-eb6300ca6ffb none none off - oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crucible f54d6e59-67a1-458b-8e66-6dc3b2adb755 none none off - oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crucible 6604dd1b-5f21-475d-952a-894717512d1b none none off - oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crucible 05cb728f-f6b9-4132-922d-fe249b1ba736 none none off - oxp_db16345e-427a-4c8e-9032-17270f729308/crucible 500f8d46-a32d-4bd1-8f2c-cb9d36822660 none none off - oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crucible 66c673a1-e8d8-4863-b368-a7ea292555fb none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/clickhouse_keeper 6c5a6622-5f75-45a0-a9e8-4b513f5ac352 none none off - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/clickhouse_keeper f6464cd8-84bc-4bae-8386-c0a5a82aab95 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/clickhouse_server f8706468-85ac-4f9f-b41d-ff7c3a17ee5f none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/internal_dns 03de030d-d958-4ce5-86d2-368fa88e0bd8 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone 4c3c89bd-21cf-4986-b012-e89e4e1c1ac4 none none off - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone ff4a77a2-528a-4c70-a5b9-f0093c95697b none none off - oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/zone 676fc8c5-743b-48ca-99fd-2f2379c83890 none none off - oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/zone 63362c89-4b42-4649-9ebe-43e19a5c0e51 none none off - oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/zone 6f83a31e-1181-418f-92b0-d0534e9ae6dd none none off - oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/zone 260ffd7d-4da5-4657-9158-ba7e1eae5971 none none off - oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/zone ed4c8570-3951-4f79-b27e-da73150609be none none off - oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/zone e5dcf165-3ebb-40a2-b16f-a07b036a6533 none none off - oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/zone dd27be6b-214d-4022-a99d-2a7d12e7d8bb none none off - oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/zone b7500d95-2499-48fc-a7d6-2460d61e197a none none off - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone/oxz_clickhouse_keeper_60cf5091-670b-48c9-a729-b82c5e7683ca 8ee3f0bb-d102-4a00-af81-72e2f284878b none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_clickhouse_keeper_7aa82b80-0c37-4f20-9398-bfce4707f327 0bf9cddb-1911-495b-8aad-09b7eea5fff4 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_clickhouse_server_812be70a-f237-47d5-ab49-f9450fe948db 292f53fc-27bb-4cc4-a61b-7d02c978149c none none off - oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/zone/oxz_crucible_0b0e12fd-2800-4203-acb6-24e6e976271c cf46ee68-f945-4af6-a647-4d612c1f05be none none off - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone/oxz_crucible_1a02d419-10c4-4326-b34e-eb2b1bd90bd7 2a439799-3f16-46df-ba1b-7ea29edd392d none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_crucible_56e18c31-f630-4643-ad5c-1fede34f35de c30be90e-20cf-46c6-bb4a-b65d2c407878 none none off - oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/zone/oxz_crucible_5ea86015-8f62-40aa-b3b2-c659f17ee510 6289ea03-b2c9-4470-b7ba-b935450aa764 none none off - oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/zone/oxz_crucible_78965849-e6e3-4250-a66a-dc50512fad34 43b36ba3-e516-4732-be8b-8cd2ca9de93c none none off - oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/zone/oxz_crucible_90c484e5-69d3-4636-9c64-6a878f593d33 7cc8018e-323f-4d35-bb33-fcf557b9dace none none off - oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/zone/oxz_crucible_a3901043-fa2a-4ef7-a40e-6ef0e5fd189f 88fd4e5a-50fd-43c7-8a75-0ad4376bd564 none none off - oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/zone/oxz_crucible_be9fd98a-6422-4890-a32b-42d42d1c8957 932cbb0d-b1d0-423d-87b6-9dce8ddb6338 none none off - oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/zone/oxz_crucible_bf71d1a8-9e65-479d-8920-0be8e3422ac5 fd0ce816-4da0-4490-be32-4d38fb78c13c none none off - oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/zone/oxz_crucible_eb4176ea-456b-48f6-b284-7b76da0bf4a1 704ea6b5-0ffc-443f-ae8a-482666f8277c none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_crucible_pantry_417c97a4-fe25-439d-8359-3f7062981923 8957a276-6d4e-4c58-a856-d7c5433806e1 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_internal_dns_f2bbaa79-0eab-4b91-a404-dad4c19b58c2 fe0f566f-3cff-43ef-960c-649c27746c56 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_nexus_33ba37c4-2535-4095-a7e9-c69937fc584d 77d0cd16-b6e3-484d-962f-0477cd242482 none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_ntp_47eab17a-4dd4-4467-90b2-f643f465cf34 4eaf1849-1fe4-415c-bdc7-4cc04cac20ce none none off - oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/debug c5b8f4f9-bd10-45b8-a9f3-93adf1402ecc 100 GiB none gzip-9 - oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/debug 43abf982-d457-46d1-8566-8047d2a78a41 100 GiB none gzip-9 - oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/debug 1b6a1722-d9f7-48ea-b351-5bc8bad4fd07 100 GiB none gzip-9 - oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/debug 8be43fb0-00e7-4748-9a1a-ace9772d8a83 100 GiB none gzip-9 - oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/debug 2ccb3aa9-f0ef-4fd4-9fd7-43b4a88b8d6b 100 GiB none gzip-9 - oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/debug 56759eb6-69e9-46a3-b44c-fc748cd506aa 100 GiB none gzip-9 - oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/debug 76fffbd2-9c74-46b5-8033-f442be1256f5 100 GiB none gzip-9 - oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/debug c13a3d71-1241-42d1-95a8-d720c20ee2c4 100 GiB none gzip-9 - oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/debug f030ef33-cad2-4760-9431-1907b797161b 100 GiB none gzip-9 - oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/debug 947b2823-3dca-4b56-9324-f476e2c1c6da 100 GiB none gzip-9 + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crucible c73b47ac-ad1f-4cd1-b449-f220b5ad8104 in service none none off + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crucible 813c7aac-695b-49ce-8bc5-f4cdbfc04b38 in service none none off + oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crucible e5da836d-fffb-4435-8500-889c05b04689 in service none none off + oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crucible 9f8d056c-3e84-4474-b9c7-5b7a890a8a7b in service none none off + oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crucible e93cfc01-9581-4f6e-b77c-eb6300ca6ffb in service none none off + oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crucible f54d6e59-67a1-458b-8e66-6dc3b2adb755 in service none none off + oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crucible 6604dd1b-5f21-475d-952a-894717512d1b in service none none off + oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crucible 05cb728f-f6b9-4132-922d-fe249b1ba736 in service none none off + oxp_db16345e-427a-4c8e-9032-17270f729308/crucible 500f8d46-a32d-4bd1-8f2c-cb9d36822660 in service none none off + oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crucible 66c673a1-e8d8-4863-b368-a7ea292555fb in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/clickhouse_keeper 6c5a6622-5f75-45a0-a9e8-4b513f5ac352 in service none none off + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/clickhouse_keeper f6464cd8-84bc-4bae-8386-c0a5a82aab95 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/clickhouse_server f8706468-85ac-4f9f-b41d-ff7c3a17ee5f in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/internal_dns 03de030d-d958-4ce5-86d2-368fa88e0bd8 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone 4c3c89bd-21cf-4986-b012-e89e4e1c1ac4 in service none none off + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone ff4a77a2-528a-4c70-a5b9-f0093c95697b in service none none off + oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/zone 676fc8c5-743b-48ca-99fd-2f2379c83890 in service none none off + oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/zone 63362c89-4b42-4649-9ebe-43e19a5c0e51 in service none none off + oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/zone 6f83a31e-1181-418f-92b0-d0534e9ae6dd in service none none off + oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/zone 260ffd7d-4da5-4657-9158-ba7e1eae5971 in service none none off + oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/zone ed4c8570-3951-4f79-b27e-da73150609be in service none none off + oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/zone e5dcf165-3ebb-40a2-b16f-a07b036a6533 in service none none off + oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/zone dd27be6b-214d-4022-a99d-2a7d12e7d8bb in service none none off + oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/zone b7500d95-2499-48fc-a7d6-2460d61e197a in service none none off + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone/oxz_clickhouse_keeper_60cf5091-670b-48c9-a729-b82c5e7683ca 8ee3f0bb-d102-4a00-af81-72e2f284878b in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_clickhouse_keeper_7aa82b80-0c37-4f20-9398-bfce4707f327 0bf9cddb-1911-495b-8aad-09b7eea5fff4 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_clickhouse_server_812be70a-f237-47d5-ab49-f9450fe948db 292f53fc-27bb-4cc4-a61b-7d02c978149c in service none none off + oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/zone/oxz_crucible_0b0e12fd-2800-4203-acb6-24e6e976271c cf46ee68-f945-4af6-a647-4d612c1f05be in service none none off + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/zone/oxz_crucible_1a02d419-10c4-4326-b34e-eb2b1bd90bd7 2a439799-3f16-46df-ba1b-7ea29edd392d in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_crucible_56e18c31-f630-4643-ad5c-1fede34f35de c30be90e-20cf-46c6-bb4a-b65d2c407878 in service none none off + oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/zone/oxz_crucible_5ea86015-8f62-40aa-b3b2-c659f17ee510 6289ea03-b2c9-4470-b7ba-b935450aa764 in service none none off + oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/zone/oxz_crucible_78965849-e6e3-4250-a66a-dc50512fad34 43b36ba3-e516-4732-be8b-8cd2ca9de93c in service none none off + oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/zone/oxz_crucible_90c484e5-69d3-4636-9c64-6a878f593d33 7cc8018e-323f-4d35-bb33-fcf557b9dace in service none none off + oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/zone/oxz_crucible_a3901043-fa2a-4ef7-a40e-6ef0e5fd189f 88fd4e5a-50fd-43c7-8a75-0ad4376bd564 in service none none off + oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/zone/oxz_crucible_be9fd98a-6422-4890-a32b-42d42d1c8957 932cbb0d-b1d0-423d-87b6-9dce8ddb6338 in service none none off + oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/zone/oxz_crucible_bf71d1a8-9e65-479d-8920-0be8e3422ac5 fd0ce816-4da0-4490-be32-4d38fb78c13c in service none none off + oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/zone/oxz_crucible_eb4176ea-456b-48f6-b284-7b76da0bf4a1 704ea6b5-0ffc-443f-ae8a-482666f8277c in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_crucible_pantry_417c97a4-fe25-439d-8359-3f7062981923 8957a276-6d4e-4c58-a856-d7c5433806e1 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_internal_dns_f2bbaa79-0eab-4b91-a404-dad4c19b58c2 fe0f566f-3cff-43ef-960c-649c27746c56 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_nexus_33ba37c4-2535-4095-a7e9-c69937fc584d 77d0cd16-b6e3-484d-962f-0477cd242482 in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/zone/oxz_ntp_47eab17a-4dd4-4467-90b2-f643f465cf34 4eaf1849-1fe4-415c-bdc7-4cc04cac20ce in service none none off + oxp_2a76ab1a-fb16-412d-93f9-b8cd9aa94e85/crypt/debug c5b8f4f9-bd10-45b8-a9f3-93adf1402ecc in service 100 GiB none gzip-9 + oxp_2de2bf7e-c679-4b2b-b373-908e9d3ffbfc/crypt/debug 43abf982-d457-46d1-8566-8047d2a78a41 in service 100 GiB none gzip-9 + oxp_2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba/crypt/debug 1b6a1722-d9f7-48ea-b351-5bc8bad4fd07 in service 100 GiB none gzip-9 + oxp_32041dbf-e58d-4f32-840d-923d3d3b68af/crypt/debug 8be43fb0-00e7-4748-9a1a-ace9772d8a83 in service 100 GiB none gzip-9 + oxp_5f88adff-bb50-4dc1-bbfb-5a410c753ed5/crypt/debug 2ccb3aa9-f0ef-4fd4-9fd7-43b4a88b8d6b in service 100 GiB none gzip-9 + oxp_74d64eb9-bf69-4782-af16-2d3a761ca171/crypt/debug 56759eb6-69e9-46a3-b44c-fc748cd506aa in service 100 GiB none gzip-9 + oxp_b3c231c9-b2a5-4267-b4bf-9651881b91a5/crypt/debug 76fffbd2-9c74-46b5-8033-f442be1256f5 in service 100 GiB none gzip-9 + oxp_bca80b95-8dca-4a3b-b24d-d44b6a9ff71b/crypt/debug c13a3d71-1241-42d1-95a8-d720c20ee2c4 in service 100 GiB none gzip-9 + oxp_db16345e-427a-4c8e-9032-17270f729308/crypt/debug f030ef33-cad2-4760-9431-1907b797161b in service 100 GiB none gzip-9 + oxp_e3b45593-8f0c-47b2-a381-802a7dad1f54/crypt/debug 947b2823-3dca-4b56-9324-f476e2c1c6da in service 100 GiB none gzip-9 omicron zones at generation 4: diff --git a/nexus/reconfigurator/planning/tests/output/planner_expunge_clickhouse_clusters_3_4.txt b/nexus/reconfigurator/planning/tests/output/planner_expunge_clickhouse_clusters_3_4.txt index 27cd9fb0f01..65f584c422c 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_expunge_clickhouse_clusters_3_4.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_expunge_clickhouse_clusters_3_4.txt @@ -22,58 +22,58 @@ to: blueprint 74f2e7fd-687e-4c9e-b5d8-e474a5bb8e7c datasets from generation 3: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crucible d40442a5-6bc0-47e2-b856-eaf133d1e304 none none off -- oxp_188c3b95-16fa-45ea-b9f7-e987560b4d62/crucible 3c535eee-1560-47b0-be54-ae5a72f81ed7 none none off -- oxp_1f3bbc7c-888f-40fa-b705-fab3f148b147/crucible 1cc83d94-5150-4c1b-9e60-5520e5dedfbb none none off -- oxp_45a81e70-03bb-4c53-bf49-d598c9fb8d34/crucible 240113d4-845f-4183-b4a7-e8c994e062b7 none none off -- oxp_56c3f0ef-fac1-473d-9317-0e3668aa7e88/crucible 01887c83-946b-463c-a58a-8398019e5a2c none none off -- oxp_96f1615c-3dda-427f-8132-408b2fad24e0/crucible e9dc86e8-1628-4168-88fc-274b0698d692 none none off -- oxp_a9ef71b2-ec22-421c-adc9-bddc4c0641c4/crucible 3891477e-b97e-4917-a8e0-558852169291 none none off -- oxp_b9f9c626-3293-48eb-a475-1debaaccdf6c/crucible 3c1cb24a-963a-448e-a7a1-7c701e3c9b2a none none off -- oxp_d563fd5f-9306-49b4-8511-78a2f64733ce/crucible bae3e304-87d5-49b5-aeac-8d6ad6849893 none none off -- oxp_fcca32b6-9629-468f-a282-63d7da992447/crucible 61f460f4-0afe-4be7-8021-be98ebf8e6a7 none none off -- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/clickhouse dc455819-f15b-410e-bcf1-8c2f728d2c28 none none off -- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/clickhouse_keeper 4b06dacf-0426-4474-8f23-d2cc89cebf79 none none off -- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/internal_dns 4bb9b134-29cc-48f7-ab87-fe8d848d3bcb none none off -- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/zone f60180c7-5adc-46cd-95bf-eada188126d5 none none off -- oxp_188c3b95-16fa-45ea-b9f7-e987560b4d62/crypt/zone 7b71a19c-0787-4289-8758-62e730b8eea7 none none off -- oxp_1f3bbc7c-888f-40fa-b705-fab3f148b147/crypt/zone 5d7b3a35-7748-4add-9c45-8c13fffa6242 none none off -- oxp_45a81e70-03bb-4c53-bf49-d598c9fb8d34/crypt/zone 4468c7cd-c756-42c5-8974-5b2fd12fe7d8 none none off -- oxp_56c3f0ef-fac1-473d-9317-0e3668aa7e88/crypt/zone 063e51c0-4b74-45f3-899e-4f47e405c885 none none off -- oxp_96f1615c-3dda-427f-8132-408b2fad24e0/crypt/zone 1c629490-3edb-45ad-a45e-30a6fa049dc5 none none off -- oxp_a9ef71b2-ec22-421c-adc9-bddc4c0641c4/crypt/zone 85569c4c-044f-4f6f-a25d-137a53ed52c1 none none off -- oxp_b9f9c626-3293-48eb-a475-1debaaccdf6c/crypt/zone 40e94b66-4686-48f3-b606-6ba7d992c8f2 none none off -- oxp_d563fd5f-9306-49b4-8511-78a2f64733ce/crypt/zone 626ecfdb-dfd7-4ff6-bec6-391c9c44b0e4 none none off -- oxp_fcca32b6-9629-468f-a282-63d7da992447/crypt/zone e61020a5-742a-4ee8-bda3-08e6f0a776be none none off -- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/zone/oxz_clickhouse_96dcbb7a-0140-4590-801c-406866500995 87252c34-5d73-4d3a-bce6-6a27dad3fdf6 none none off -- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/zone/oxz_clickhouse_keeper_1998de68-a305-44f7-8ebc-cc5613c9e6fb 485f09fd-df18-4d81-a4e7-ba7109c56f86 none none off -- oxp_a9ef71b2-ec22-421c-adc9-bddc4c0641c4/crypt/zone/oxz_crucible_5366862d-0c9e-4c21-bd16-5599298e75bc 3aa44cc5-0d66-48c3-b4ca-2bf69f9b885e none none off -- oxp_45a81e70-03bb-4c53-bf49-d598c9fb8d34/crypt/zone/oxz_crucible_63dcf460-2794-434c-b0e7-4e09ba0f3a3c 80773e28-95b8-4c87-8066-96217d4f91fc none none off -- oxp_fcca32b6-9629-468f-a282-63d7da992447/crypt/zone/oxz_crucible_71f24994-337b-4c5f-9826-75f885a669e7 f41aa130-536c-419f-841b-6b70f5d7f04e none none off -- oxp_188c3b95-16fa-45ea-b9f7-e987560b4d62/crypt/zone/oxz_crucible_726f6522-a359-4e6e-abe9-0de41979de91 e536abb6-5358-42a9-bda0-ccdd4040bc76 none none off -- oxp_d563fd5f-9306-49b4-8511-78a2f64733ce/crypt/zone/oxz_crucible_a794a5cd-ec63-4fe4-a813-720d79dcd2ca 46694e7d-bce7-4b0e-a900-a192b4091435 none none off -- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/zone/oxz_crucible_ab480489-af1c-4446-8e95-da4a7e58df59 90052aeb-7130-4ff2-aa27-5cf3b04fbb8c none none off -- oxp_b9f9c626-3293-48eb-a475-1debaaccdf6c/crypt/zone/oxz_crucible_cc6e2a17-ba9b-4332-b869-e0ce204915cf 98b4a865-2894-4cd2-ac6b-e738281c58bb none none off -- oxp_56c3f0ef-fac1-473d-9317-0e3668aa7e88/crypt/zone/oxz_crucible_e5cd215f-19c6-43ca-b31a-039319dd5dcf 36ff569c-9c13-49ea-9326-475045f720b0 none none off -- oxp_96f1615c-3dda-427f-8132-408b2fad24e0/crypt/zone/oxz_crucible_e7bc709c-4ef2-4f1f-be78-494f53169554 97bb7eaf-90b4-4a0b-802a-fa8505ec75bd none none off -- oxp_1f3bbc7c-888f-40fa-b705-fab3f148b147/crypt/zone/oxz_crucible_fbaea242-74a6-490f-9bc0-0710a40768f4 c9cbc06f-28a0-4599-9871-34d1412af931 none none off -- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/zone/oxz_crucible_pantry_ed79fef8-6124-4ecc-aaa4-51cf9fcf58db 9dd5432c-c9fc-4d94-8536-f17d51179351 none none off -- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/zone/oxz_internal_dns_4d152a2b-089e-4fe2-89fa-76b53fa58773 c4e8da9a-abce-419c-ad1f-3e5ba3277bbd none none off -- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/zone/oxz_nexus_4cb9b6d5-fd52-4cfb-b630-59f80bd26615 fcf013e5-369d-46a8-b613-827c09a19609 none none off -- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/zone/oxz_ntp_89d38277-9743-491b-af94-714776657ce2 d7c7f6d8-8cbf-4e89-9910-beeddeced77d none none off -- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/debug bc75e6c5-7133-4fcb-8331-e14094471da3 100 GiB none gzip-9 -- oxp_188c3b95-16fa-45ea-b9f7-e987560b4d62/crypt/debug 2682e3a1-a848-4e3c-93f0-3fd6f0d9bb42 100 GiB none gzip-9 -- oxp_1f3bbc7c-888f-40fa-b705-fab3f148b147/crypt/debug 3ce1e570-2d1f-4898-ab97-de7984c655ea 100 GiB none gzip-9 -- oxp_45a81e70-03bb-4c53-bf49-d598c9fb8d34/crypt/debug c01b1d43-aa78-4faf-a8ca-dcc06af33a6c 100 GiB none gzip-9 -- oxp_56c3f0ef-fac1-473d-9317-0e3668aa7e88/crypt/debug 8246cb67-ed7a-4116-a3d7-565ac65f93b6 100 GiB none gzip-9 -- oxp_96f1615c-3dda-427f-8132-408b2fad24e0/crypt/debug 56460589-94e8-4f23-9a19-e33394556f15 100 GiB none gzip-9 -- oxp_a9ef71b2-ec22-421c-adc9-bddc4c0641c4/crypt/debug 3e4f8418-ecac-487d-8ee6-fda164388f77 100 GiB none gzip-9 -- oxp_b9f9c626-3293-48eb-a475-1debaaccdf6c/crypt/debug f93f289f-6d12-477c-a2d3-28a8d6d71413 100 GiB none gzip-9 -- oxp_d563fd5f-9306-49b4-8511-78a2f64733ce/crypt/debug 71bee626-79e5-4bc7-98af-e0cf412bbcba 100 GiB none gzip-9 -- oxp_fcca32b6-9629-468f-a282-63d7da992447/crypt/debug 402246fc-dfe5-410c-92c0-d9d497c03188 100 GiB none gzip-9 + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crucible d40442a5-6bc0-47e2-b856-eaf133d1e304 in service none none off +- oxp_188c3b95-16fa-45ea-b9f7-e987560b4d62/crucible 3c535eee-1560-47b0-be54-ae5a72f81ed7 in service none none off +- oxp_1f3bbc7c-888f-40fa-b705-fab3f148b147/crucible 1cc83d94-5150-4c1b-9e60-5520e5dedfbb in service none none off +- oxp_45a81e70-03bb-4c53-bf49-d598c9fb8d34/crucible 240113d4-845f-4183-b4a7-e8c994e062b7 in service none none off +- oxp_56c3f0ef-fac1-473d-9317-0e3668aa7e88/crucible 01887c83-946b-463c-a58a-8398019e5a2c in service none none off +- oxp_96f1615c-3dda-427f-8132-408b2fad24e0/crucible e9dc86e8-1628-4168-88fc-274b0698d692 in service none none off +- oxp_a9ef71b2-ec22-421c-adc9-bddc4c0641c4/crucible 3891477e-b97e-4917-a8e0-558852169291 in service none none off +- oxp_b9f9c626-3293-48eb-a475-1debaaccdf6c/crucible 3c1cb24a-963a-448e-a7a1-7c701e3c9b2a in service none none off +- oxp_d563fd5f-9306-49b4-8511-78a2f64733ce/crucible bae3e304-87d5-49b5-aeac-8d6ad6849893 in service none none off +- oxp_fcca32b6-9629-468f-a282-63d7da992447/crucible 61f460f4-0afe-4be7-8021-be98ebf8e6a7 in service none none off +- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/clickhouse dc455819-f15b-410e-bcf1-8c2f728d2c28 in service none none off +- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/clickhouse_keeper 4b06dacf-0426-4474-8f23-d2cc89cebf79 in service none none off +- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/internal_dns 4bb9b134-29cc-48f7-ab87-fe8d848d3bcb in service none none off +- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/zone f60180c7-5adc-46cd-95bf-eada188126d5 in service none none off +- oxp_188c3b95-16fa-45ea-b9f7-e987560b4d62/crypt/zone 7b71a19c-0787-4289-8758-62e730b8eea7 in service none none off +- oxp_1f3bbc7c-888f-40fa-b705-fab3f148b147/crypt/zone 5d7b3a35-7748-4add-9c45-8c13fffa6242 in service none none off +- oxp_45a81e70-03bb-4c53-bf49-d598c9fb8d34/crypt/zone 4468c7cd-c756-42c5-8974-5b2fd12fe7d8 in service none none off +- oxp_56c3f0ef-fac1-473d-9317-0e3668aa7e88/crypt/zone 063e51c0-4b74-45f3-899e-4f47e405c885 in service none none off +- oxp_96f1615c-3dda-427f-8132-408b2fad24e0/crypt/zone 1c629490-3edb-45ad-a45e-30a6fa049dc5 in service none none off +- oxp_a9ef71b2-ec22-421c-adc9-bddc4c0641c4/crypt/zone 85569c4c-044f-4f6f-a25d-137a53ed52c1 in service none none off +- oxp_b9f9c626-3293-48eb-a475-1debaaccdf6c/crypt/zone 40e94b66-4686-48f3-b606-6ba7d992c8f2 in service none none off +- oxp_d563fd5f-9306-49b4-8511-78a2f64733ce/crypt/zone 626ecfdb-dfd7-4ff6-bec6-391c9c44b0e4 in service none none off +- oxp_fcca32b6-9629-468f-a282-63d7da992447/crypt/zone e61020a5-742a-4ee8-bda3-08e6f0a776be in service none none off +- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/zone/oxz_clickhouse_96dcbb7a-0140-4590-801c-406866500995 87252c34-5d73-4d3a-bce6-6a27dad3fdf6 in service none none off +- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/zone/oxz_clickhouse_keeper_1998de68-a305-44f7-8ebc-cc5613c9e6fb 485f09fd-df18-4d81-a4e7-ba7109c56f86 in service none none off +- oxp_a9ef71b2-ec22-421c-adc9-bddc4c0641c4/crypt/zone/oxz_crucible_5366862d-0c9e-4c21-bd16-5599298e75bc 3aa44cc5-0d66-48c3-b4ca-2bf69f9b885e in service none none off +- oxp_45a81e70-03bb-4c53-bf49-d598c9fb8d34/crypt/zone/oxz_crucible_63dcf460-2794-434c-b0e7-4e09ba0f3a3c 80773e28-95b8-4c87-8066-96217d4f91fc in service none none off +- oxp_fcca32b6-9629-468f-a282-63d7da992447/crypt/zone/oxz_crucible_71f24994-337b-4c5f-9826-75f885a669e7 f41aa130-536c-419f-841b-6b70f5d7f04e in service none none off +- oxp_188c3b95-16fa-45ea-b9f7-e987560b4d62/crypt/zone/oxz_crucible_726f6522-a359-4e6e-abe9-0de41979de91 e536abb6-5358-42a9-bda0-ccdd4040bc76 in service none none off +- oxp_d563fd5f-9306-49b4-8511-78a2f64733ce/crypt/zone/oxz_crucible_a794a5cd-ec63-4fe4-a813-720d79dcd2ca 46694e7d-bce7-4b0e-a900-a192b4091435 in service none none off +- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/zone/oxz_crucible_ab480489-af1c-4446-8e95-da4a7e58df59 90052aeb-7130-4ff2-aa27-5cf3b04fbb8c in service none none off +- oxp_b9f9c626-3293-48eb-a475-1debaaccdf6c/crypt/zone/oxz_crucible_cc6e2a17-ba9b-4332-b869-e0ce204915cf 98b4a865-2894-4cd2-ac6b-e738281c58bb in service none none off +- oxp_56c3f0ef-fac1-473d-9317-0e3668aa7e88/crypt/zone/oxz_crucible_e5cd215f-19c6-43ca-b31a-039319dd5dcf 36ff569c-9c13-49ea-9326-475045f720b0 in service none none off +- oxp_96f1615c-3dda-427f-8132-408b2fad24e0/crypt/zone/oxz_crucible_e7bc709c-4ef2-4f1f-be78-494f53169554 97bb7eaf-90b4-4a0b-802a-fa8505ec75bd in service none none off +- oxp_1f3bbc7c-888f-40fa-b705-fab3f148b147/crypt/zone/oxz_crucible_fbaea242-74a6-490f-9bc0-0710a40768f4 c9cbc06f-28a0-4599-9871-34d1412af931 in service none none off +- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/zone/oxz_crucible_pantry_ed79fef8-6124-4ecc-aaa4-51cf9fcf58db 9dd5432c-c9fc-4d94-8536-f17d51179351 in service none none off +- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/zone/oxz_internal_dns_4d152a2b-089e-4fe2-89fa-76b53fa58773 c4e8da9a-abce-419c-ad1f-3e5ba3277bbd in service none none off +- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/zone/oxz_nexus_4cb9b6d5-fd52-4cfb-b630-59f80bd26615 fcf013e5-369d-46a8-b613-827c09a19609 in service none none off +- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/zone/oxz_ntp_89d38277-9743-491b-af94-714776657ce2 d7c7f6d8-8cbf-4e89-9910-beeddeced77d in service none none off +- oxp_03a84dd2-e0a4-435d-96de-67bfe2674f4e/crypt/debug bc75e6c5-7133-4fcb-8331-e14094471da3 in service 100 GiB none gzip-9 +- oxp_188c3b95-16fa-45ea-b9f7-e987560b4d62/crypt/debug 2682e3a1-a848-4e3c-93f0-3fd6f0d9bb42 in service 100 GiB none gzip-9 +- oxp_1f3bbc7c-888f-40fa-b705-fab3f148b147/crypt/debug 3ce1e570-2d1f-4898-ab97-de7984c655ea in service 100 GiB none gzip-9 +- oxp_45a81e70-03bb-4c53-bf49-d598c9fb8d34/crypt/debug c01b1d43-aa78-4faf-a8ca-dcc06af33a6c in service 100 GiB none gzip-9 +- oxp_56c3f0ef-fac1-473d-9317-0e3668aa7e88/crypt/debug 8246cb67-ed7a-4116-a3d7-565ac65f93b6 in service 100 GiB none gzip-9 +- oxp_96f1615c-3dda-427f-8132-408b2fad24e0/crypt/debug 56460589-94e8-4f23-9a19-e33394556f15 in service 100 GiB none gzip-9 +- oxp_a9ef71b2-ec22-421c-adc9-bddc4c0641c4/crypt/debug 3e4f8418-ecac-487d-8ee6-fda164388f77 in service 100 GiB none gzip-9 +- oxp_b9f9c626-3293-48eb-a475-1debaaccdf6c/crypt/debug f93f289f-6d12-477c-a2d3-28a8d6d71413 in service 100 GiB none gzip-9 +- oxp_d563fd5f-9306-49b4-8511-78a2f64733ce/crypt/debug 71bee626-79e5-4bc7-98af-e0cf412bbcba in service 100 GiB none gzip-9 +- oxp_fcca32b6-9629-468f-a282-63d7da992447/crypt/debug 402246fc-dfe5-410c-92c0-d9d497c03188 in service 100 GiB none gzip-9 omicron zones generation 3 -> 4: @@ -133,62 +133,62 @@ to: blueprint 74f2e7fd-687e-4c9e-b5d8-e474a5bb8e7c datasets generation 3 -> 4: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crucible 7576ef1f-3e41-44cc-b750-9b397374e234 none none off - oxp_2d44b756-94df-45ec-a644-50021248682d/crucible 4c886e70-05ef-437c-a7ab-ba8a1b5cf9af none none off - oxp_2dce7cf0-3097-485d-aaf6-9fc51f99eae5/crucible ec7693f9-a469-48ad-8f8d-6d0bc0138be8 none none off - oxp_3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7/crucible b3ad0776-d6f0-4cbd-a382-a1b78576753b none none off - oxp_44342c41-75a7-4708-8004-eb2ca5c5a3c2/crucible 8d7eebdb-c82f-4a29-b3c3-290bd343814a none none off - oxp_650b4eff-80a2-430a-97c8-f837248480a1/crucible a30613bb-70dd-43dd-b23c-c8759df0acdd none none off - oxp_6e418b8c-cadd-4fb8-8370-f351a07e1eed/crucible 251a271a-0469-4309-ba94-7ecd827e3425 none none off - oxp_6e5772a5-8234-46d1-ba5a-503a83d9d2fb/crucible 8a62b925-a1cf-493a-a05e-67fc73605d82 none none off - oxp_c1da692e-7713-43a0-b6bb-5c182084c09d/crucible 649edc79-adc6-4391-a105-a54be7143259 none none off - oxp_e35766ef-789a-4b2f-9a6c-e6626d5ab195/crucible 8f1039b4-fd76-4444-802c-96385e68abde none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/clickhouse_keeper 00f7bc76-5861-485e-a7a7-8bc475950804 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/clickhouse_server 12e71b76-b549-4357-8209-215144d61723 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/internal_dns f2c56628-2b29-42da-9ce3-ca705a0e4a97 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone 6c76a56e-edc0-46e8-92b4-162920f7de33 none none off - oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/zone ce9648f6-3e8f-4c4f-a116-d57aff785b51 none none off - oxp_2dce7cf0-3097-485d-aaf6-9fc51f99eae5/crypt/zone 0c0b9b34-0f11-480b-bc42-83ab3cfb3667 none none off - oxp_3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7/crypt/zone cb900fc0-fd1e-42fd-8e0b-491454d70d5e none none off - oxp_44342c41-75a7-4708-8004-eb2ca5c5a3c2/crypt/zone cae317ef-de63-4265-a0d7-777c5a70dd4e none none off - oxp_650b4eff-80a2-430a-97c8-f837248480a1/crypt/zone fec03736-ce6e-444e-b7dc-30ae3d00e502 none none off - oxp_6e418b8c-cadd-4fb8-8370-f351a07e1eed/crypt/zone c22dfc9e-b068-4b85-ae0a-e81bc67f679a none none off - oxp_6e5772a5-8234-46d1-ba5a-503a83d9d2fb/crypt/zone 8b954de0-88d8-4a00-902f-e612eed9da0c none none off - oxp_c1da692e-7713-43a0-b6bb-5c182084c09d/crypt/zone 27d840dc-67e6-4795-8bb1-427213d0df3e none none off - oxp_e35766ef-789a-4b2f-9a6c-e6626d5ab195/crypt/zone b8e322e8-fe4f-43e8-b51a-d08b12f7e515 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_clickhouse_keeper_3f78fa04-0b7e-4959-9718-c232c76500e1 cbe9ab91-b85c-490d-8561-739c66bd2bee none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_clickhouse_server_f0341fc6-6a73-4318-8787-dd0c6b26c385 39e58c15-5cb4-4f89-9bb3-adef453e9e3d none none off - oxp_650b4eff-80a2-430a-97c8-f837248480a1/crypt/zone/oxz_crucible_49afbe38-6b68-4764-afae-a279a7b9b1ab 3d258387-fe93-49c1-8cad-135b3f3556bf none none off - oxp_6e418b8c-cadd-4fb8-8370-f351a07e1eed/crypt/zone/oxz_crucible_4a223081-0985-45c7-b60e-478c371fde4b 69e7fb35-ff48-4d47-986f-374ce7ebac71 none none off - oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/zone/oxz_crucible_4e11460c-cfd2-4fa3-a7a7-25c976accece 6b5f0710-4fab-4921-b1ba-05de5d9ff2c3 none none off - oxp_c1da692e-7713-43a0-b6bb-5c182084c09d/crypt/zone/oxz_crucible_4f7d1ee4-bd7b-48a5-99e0-e61fc8e6e58e 45831cd5-d578-4473-a97a-f737aedd9903 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_crucible_7cc30ab4-c566-42d4-8fb0-31a8a27156ff df1af4ad-ec0e-4094-b8f2-d7ce592f40c0 none none off - oxp_6e5772a5-8234-46d1-ba5a-503a83d9d2fb/crypt/zone/oxz_crucible_a50a59b8-b59a-4f1d-b5d4-41f113802b5f c2832f18-d620-49d0-9c8e-b2fc9871e06f none none off - oxp_44342c41-75a7-4708-8004-eb2ca5c5a3c2/crypt/zone/oxz_crucible_a8839f9e-93f8-42a2-ac3a-9b804a5316f9 fdbdb20f-3a77-4da9-afff-96e7ac54f297 none none off - oxp_3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7/crypt/zone/oxz_crucible_da1d617e-6450-4bb8-8696-d1518b2f0731 458a4d6e-83ee-4e74-85e7-69b35dc8045c none none off - oxp_e35766ef-789a-4b2f-9a6c-e6626d5ab195/crypt/zone/oxz_crucible_e71169cf-ee83-47b2-85ec-3396a20b4e02 97f033d1-1878-4429-81cf-9da9dc36bd95 none none off - oxp_2dce7cf0-3097-485d-aaf6-9fc51f99eae5/crypt/zone/oxz_crucible_eeab4659-62e8-467f-a6f7-690854db89b5 854c1daf-e3bf-4b0a-84ef-3a1b9912f3df none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_crucible_pantry_2a8f8547-7c9a-4e79-8608-3c925fa3e4b7 74856b03-a612-43b4-94e7-6250cf56fba0 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_internal_dns_e8014d8f-0620-4dde-9fab-435cf4c0c321 2d7179ba-92a0-4bd1-8d5c-eba85fe540d3 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_nexus_d52405a5-debc-4682-8f32-8a3faee16b69 3fab12f1-b0ca-47e2-8865-9710e7e37117 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_ntp_a3e9eacd-48af-4333-aeb8-e7528042e664 e56af4f5-a7ba-4ff1-a44d-d955f21755b6 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/debug fdd71393-adb7-45c9-8a88-f3ce8d2bb93e 100 GiB none gzip-9 - oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/debug c9b2026d-e9fd-4076-9a8c-32b06e34f0a3 100 GiB none gzip-9 - oxp_2dce7cf0-3097-485d-aaf6-9fc51f99eae5/crypt/debug 3325118f-1ebc-48cd-9ade-cf2d319211b3 100 GiB none gzip-9 - oxp_3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7/crypt/debug d0213d2b-116c-4329-a93d-02c69c44c598 100 GiB none gzip-9 - oxp_44342c41-75a7-4708-8004-eb2ca5c5a3c2/crypt/debug 247e51dd-fe88-43f2-b2bc-366e1b85c12b 100 GiB none gzip-9 - oxp_650b4eff-80a2-430a-97c8-f837248480a1/crypt/debug 9321a17c-709d-44df-a4e3-8ca09bb3665f 100 GiB none gzip-9 - oxp_6e418b8c-cadd-4fb8-8370-f351a07e1eed/crypt/debug ee28398d-301c-4661-85a5-ddf27cff28b4 100 GiB none gzip-9 - oxp_6e5772a5-8234-46d1-ba5a-503a83d9d2fb/crypt/debug e74f80f2-5369-4647-8bd0-35b7d8b2a0b0 100 GiB none gzip-9 - oxp_c1da692e-7713-43a0-b6bb-5c182084c09d/crypt/debug d0a324c8-9de3-414a-8c8c-3fe301549cdb 100 GiB none gzip-9 - oxp_e35766ef-789a-4b2f-9a6c-e6626d5ab195/crypt/debug 820def87-14ab-43c9-8f7d-b2be75a2570a 100 GiB none gzip-9 -+ oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/clickhouse_keeper 3b45a02a-3f37-4deb-93c6-0cba30538645 none none off -+ oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/internal_dns 2bd9382d-ab49-4570-8ec8-c4da8c822693 none none off -+ oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/zone/oxz_clickhouse_keeper_bbba3c50-ff89-4a7f-96c1-d40ee996c417 ca2a30ab-baf8-4bb9-af14-3d41f6df6bf7 none none off -+ oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/zone/oxz_internal_dns_7f707d70-deef-42dc-96cc-a76cf6366386 40610ea8-b288-408c-91fd-e40edbba09cf none none off + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crucible 7576ef1f-3e41-44cc-b750-9b397374e234 in service none none off + oxp_2d44b756-94df-45ec-a644-50021248682d/crucible 4c886e70-05ef-437c-a7ab-ba8a1b5cf9af in service none none off + oxp_2dce7cf0-3097-485d-aaf6-9fc51f99eae5/crucible ec7693f9-a469-48ad-8f8d-6d0bc0138be8 in service none none off + oxp_3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7/crucible b3ad0776-d6f0-4cbd-a382-a1b78576753b in service none none off + oxp_44342c41-75a7-4708-8004-eb2ca5c5a3c2/crucible 8d7eebdb-c82f-4a29-b3c3-290bd343814a in service none none off + oxp_650b4eff-80a2-430a-97c8-f837248480a1/crucible a30613bb-70dd-43dd-b23c-c8759df0acdd in service none none off + oxp_6e418b8c-cadd-4fb8-8370-f351a07e1eed/crucible 251a271a-0469-4309-ba94-7ecd827e3425 in service none none off + oxp_6e5772a5-8234-46d1-ba5a-503a83d9d2fb/crucible 8a62b925-a1cf-493a-a05e-67fc73605d82 in service none none off + oxp_c1da692e-7713-43a0-b6bb-5c182084c09d/crucible 649edc79-adc6-4391-a105-a54be7143259 in service none none off + oxp_e35766ef-789a-4b2f-9a6c-e6626d5ab195/crucible 8f1039b4-fd76-4444-802c-96385e68abde in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/clickhouse_keeper 00f7bc76-5861-485e-a7a7-8bc475950804 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/clickhouse_server 12e71b76-b549-4357-8209-215144d61723 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/internal_dns f2c56628-2b29-42da-9ce3-ca705a0e4a97 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone 6c76a56e-edc0-46e8-92b4-162920f7de33 in service none none off + oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/zone ce9648f6-3e8f-4c4f-a116-d57aff785b51 in service none none off + oxp_2dce7cf0-3097-485d-aaf6-9fc51f99eae5/crypt/zone 0c0b9b34-0f11-480b-bc42-83ab3cfb3667 in service none none off + oxp_3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7/crypt/zone cb900fc0-fd1e-42fd-8e0b-491454d70d5e in service none none off + oxp_44342c41-75a7-4708-8004-eb2ca5c5a3c2/crypt/zone cae317ef-de63-4265-a0d7-777c5a70dd4e in service none none off + oxp_650b4eff-80a2-430a-97c8-f837248480a1/crypt/zone fec03736-ce6e-444e-b7dc-30ae3d00e502 in service none none off + oxp_6e418b8c-cadd-4fb8-8370-f351a07e1eed/crypt/zone c22dfc9e-b068-4b85-ae0a-e81bc67f679a in service none none off + oxp_6e5772a5-8234-46d1-ba5a-503a83d9d2fb/crypt/zone 8b954de0-88d8-4a00-902f-e612eed9da0c in service none none off + oxp_c1da692e-7713-43a0-b6bb-5c182084c09d/crypt/zone 27d840dc-67e6-4795-8bb1-427213d0df3e in service none none off + oxp_e35766ef-789a-4b2f-9a6c-e6626d5ab195/crypt/zone b8e322e8-fe4f-43e8-b51a-d08b12f7e515 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_clickhouse_keeper_3f78fa04-0b7e-4959-9718-c232c76500e1 cbe9ab91-b85c-490d-8561-739c66bd2bee in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_clickhouse_server_f0341fc6-6a73-4318-8787-dd0c6b26c385 39e58c15-5cb4-4f89-9bb3-adef453e9e3d in service none none off + oxp_650b4eff-80a2-430a-97c8-f837248480a1/crypt/zone/oxz_crucible_49afbe38-6b68-4764-afae-a279a7b9b1ab 3d258387-fe93-49c1-8cad-135b3f3556bf in service none none off + oxp_6e418b8c-cadd-4fb8-8370-f351a07e1eed/crypt/zone/oxz_crucible_4a223081-0985-45c7-b60e-478c371fde4b 69e7fb35-ff48-4d47-986f-374ce7ebac71 in service none none off + oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/zone/oxz_crucible_4e11460c-cfd2-4fa3-a7a7-25c976accece 6b5f0710-4fab-4921-b1ba-05de5d9ff2c3 in service none none off + oxp_c1da692e-7713-43a0-b6bb-5c182084c09d/crypt/zone/oxz_crucible_4f7d1ee4-bd7b-48a5-99e0-e61fc8e6e58e 45831cd5-d578-4473-a97a-f737aedd9903 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_crucible_7cc30ab4-c566-42d4-8fb0-31a8a27156ff df1af4ad-ec0e-4094-b8f2-d7ce592f40c0 in service none none off + oxp_6e5772a5-8234-46d1-ba5a-503a83d9d2fb/crypt/zone/oxz_crucible_a50a59b8-b59a-4f1d-b5d4-41f113802b5f c2832f18-d620-49d0-9c8e-b2fc9871e06f in service none none off + oxp_44342c41-75a7-4708-8004-eb2ca5c5a3c2/crypt/zone/oxz_crucible_a8839f9e-93f8-42a2-ac3a-9b804a5316f9 fdbdb20f-3a77-4da9-afff-96e7ac54f297 in service none none off + oxp_3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7/crypt/zone/oxz_crucible_da1d617e-6450-4bb8-8696-d1518b2f0731 458a4d6e-83ee-4e74-85e7-69b35dc8045c in service none none off + oxp_e35766ef-789a-4b2f-9a6c-e6626d5ab195/crypt/zone/oxz_crucible_e71169cf-ee83-47b2-85ec-3396a20b4e02 97f033d1-1878-4429-81cf-9da9dc36bd95 in service none none off + oxp_2dce7cf0-3097-485d-aaf6-9fc51f99eae5/crypt/zone/oxz_crucible_eeab4659-62e8-467f-a6f7-690854db89b5 854c1daf-e3bf-4b0a-84ef-3a1b9912f3df in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_crucible_pantry_2a8f8547-7c9a-4e79-8608-3c925fa3e4b7 74856b03-a612-43b4-94e7-6250cf56fba0 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_internal_dns_e8014d8f-0620-4dde-9fab-435cf4c0c321 2d7179ba-92a0-4bd1-8d5c-eba85fe540d3 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_nexus_d52405a5-debc-4682-8f32-8a3faee16b69 3fab12f1-b0ca-47e2-8865-9710e7e37117 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_ntp_a3e9eacd-48af-4333-aeb8-e7528042e664 e56af4f5-a7ba-4ff1-a44d-d955f21755b6 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/debug fdd71393-adb7-45c9-8a88-f3ce8d2bb93e in service 100 GiB none gzip-9 + oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/debug c9b2026d-e9fd-4076-9a8c-32b06e34f0a3 in service 100 GiB none gzip-9 + oxp_2dce7cf0-3097-485d-aaf6-9fc51f99eae5/crypt/debug 3325118f-1ebc-48cd-9ade-cf2d319211b3 in service 100 GiB none gzip-9 + oxp_3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7/crypt/debug d0213d2b-116c-4329-a93d-02c69c44c598 in service 100 GiB none gzip-9 + oxp_44342c41-75a7-4708-8004-eb2ca5c5a3c2/crypt/debug 247e51dd-fe88-43f2-b2bc-366e1b85c12b in service 100 GiB none gzip-9 + oxp_650b4eff-80a2-430a-97c8-f837248480a1/crypt/debug 9321a17c-709d-44df-a4e3-8ca09bb3665f in service 100 GiB none gzip-9 + oxp_6e418b8c-cadd-4fb8-8370-f351a07e1eed/crypt/debug ee28398d-301c-4661-85a5-ddf27cff28b4 in service 100 GiB none gzip-9 + oxp_6e5772a5-8234-46d1-ba5a-503a83d9d2fb/crypt/debug e74f80f2-5369-4647-8bd0-35b7d8b2a0b0 in service 100 GiB none gzip-9 + oxp_c1da692e-7713-43a0-b6bb-5c182084c09d/crypt/debug d0a324c8-9de3-414a-8c8c-3fe301549cdb in service 100 GiB none gzip-9 + oxp_e35766ef-789a-4b2f-9a6c-e6626d5ab195/crypt/debug 820def87-14ab-43c9-8f7d-b2be75a2570a in service 100 GiB none gzip-9 ++ oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/clickhouse_keeper 3b45a02a-3f37-4deb-93c6-0cba30538645 in service none none off ++ oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/internal_dns 2bd9382d-ab49-4570-8ec8-c4da8c822693 in service none none off ++ oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/zone/oxz_clickhouse_keeper_bbba3c50-ff89-4a7f-96c1-d40ee996c417 ca2a30ab-baf8-4bb9-af14-3d41f6df6bf7 in service none none off ++ oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/zone/oxz_internal_dns_7f707d70-deef-42dc-96cc-a76cf6366386 40610ea8-b288-408c-91fd-e40edbba09cf in service none none off omicron zones generation 3 -> 4: @@ -234,62 +234,62 @@ to: blueprint 74f2e7fd-687e-4c9e-b5d8-e474a5bb8e7c datasets generation 3 -> 4: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crucible b97110cd-9c9d-47d8-ac3e-38b2a5fbf4bb none none off - oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crucible b07b36ec-f27e-4bef-bd0e-adbab3dbded0 none none off - oxp_2db7f3b4-ed19-4229-b42c-44f49eeb8a91/crucible 50904cf3-e571-42ee-9be7-40e0d293be12 none none off - oxp_2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a/crucible e3ed0aa2-a4bf-4619-a276-ff287c23f260 none none off - oxp_355e268c-c932-4f32-841c-f3ec88fe0495/crucible c5a79172-3a48-4ecc-a814-77f4a0ac87c3 none none off - oxp_427b2ccd-998f-4085-af21-e600604cf21e/crucible 0490a48d-59be-412f-8db8-8a8778f5bdce none none off - oxp_588058f2-f51b-4800-a211-1c5dbb32296b/crucible d148662e-1244-416e-9043-2c6e5bc3391c none none off - oxp_736f6f07-2aa2-4658-8b5c-3bf409ea747a/crucible 55340375-5d36-475d-99d6-8c8dc38a8421 none none off - oxp_bcfcdede-7084-4a31-97a8-ac4299c268f9/crucible cdf74236-d6b4-4872-ab29-3ef21b1f9e9e none none off - oxp_fe379ac6-1938-4cc2-93a9-43b1447229ae/crucible 98085696-2290-4467-b2de-cecd1ab6255e none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/clickhouse_keeper 56624401-f56f-4fd2-88fb-cfd56df535aa none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/clickhouse_server 67e873d4-5ee2-4fcd-bd1f-9311ad2ed23c none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/internal_dns eba7c3d8-af0f-4de7-9b07-8e63ff8c9a34 none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone a27fb298-e263-4560-965a-2c56292ea19a none none off - oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/zone 03dfbeda-a138-45c2-975f-05a9af2ef2b9 none none off - oxp_2db7f3b4-ed19-4229-b42c-44f49eeb8a91/crypt/zone 40986d49-c197-462c-baac-ba937da44571 none none off - oxp_2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a/crypt/zone 006eede7-d6b6-4af2-a2ff-37b94386b421 none none off - oxp_355e268c-c932-4f32-841c-f3ec88fe0495/crypt/zone 18279e0e-4f67-4e87-bc5a-2eb3927ec023 none none off - oxp_427b2ccd-998f-4085-af21-e600604cf21e/crypt/zone 491b337c-3c25-4284-ae13-443206ff696f none none off - oxp_588058f2-f51b-4800-a211-1c5dbb32296b/crypt/zone 5aa2c795-468a-45df-8769-16f4d5d0e42a none none off - oxp_736f6f07-2aa2-4658-8b5c-3bf409ea747a/crypt/zone 89c95288-774f-480c-ab14-a0327bec365b none none off - oxp_bcfcdede-7084-4a31-97a8-ac4299c268f9/crypt/zone e7569f72-580c-417b-b223-0e5f998dd9c1 none none off - oxp_fe379ac6-1938-4cc2-93a9-43b1447229ae/crypt/zone 2aae5bf8-7c17-43c4-9183-4c1956571243 none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_clickhouse_keeper_2b368dcd-bb4b-4415-9daf-0d36fd769fed c22caa52-6179-49a7-95dc-5cf0d9f3f827 none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_clickhouse_server_097ab295-aec4-427f-9124-bb4e8aecfeca e21880d2-f6f9-4e97-b7da-5a8a934845ab none none off - oxp_736f6f07-2aa2-4658-8b5c-3bf409ea747a/crypt/zone/oxz_crucible_308c592a-b022-4790-9824-7a5e10b83d1b 4e514d61-b9d3-4e8c-b528-4b9577d8ad84 none none off - oxp_2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a/crypt/zone/oxz_crucible_7233139a-ad5b-4c0e-be80-759fbd5cb262 2c3d31cf-9a06-4f47-8f30-97884d06de8f none none off - oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/zone/oxz_crucible_8c43faff-54c7-4b91-820c-ff130b7049e9 9155b21a-1803-44b3-b80e-6d22f7af2e07 none none off - oxp_fe379ac6-1938-4cc2-93a9-43b1447229ae/crypt/zone/oxz_crucible_8ddbafde-d699-4e37-b70d-dcd803f0898e a46724b6-7ca0-4d70-9dd2-6fd22d1e6150 none none off - oxp_427b2ccd-998f-4085-af21-e600604cf21e/crypt/zone/oxz_crucible_955bd7eb-8cc2-4128-a636-19bde11ab251 44153191-15ac-4206-b153-167261b232fe none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_crucible_a6192358-d6e1-4483-a3c6-755a05911f22 5fd12d35-d258-42ca-8fe3-dc5788bdc66c none none off - oxp_bcfcdede-7084-4a31-97a8-ac4299c268f9/crypt/zone/oxz_crucible_a68bc085-0ad5-4c42-a9f7-0b540de24ced 1de186f8-a37f-42fa-9e70-05aa05641c7e none none off - oxp_355e268c-c932-4f32-841c-f3ec88fe0495/crypt/zone/oxz_crucible_cdc00fbb-5ac7-4667-9fc8-926ea73a002a 510ecf2a-6a98-40f2-b387-3bab22da2bf7 none none off - oxp_2db7f3b4-ed19-4229-b42c-44f49eeb8a91/crypt/zone/oxz_crucible_d04ed118-4eb8-4ba4-8f05-7714060291e2 282ed619-0004-4647-9d60-85509d68170e none none off - oxp_588058f2-f51b-4800-a211-1c5dbb32296b/crypt/zone/oxz_crucible_e5347768-7d4d-4862-b78e-38291aca675a ba5652ea-a567-4e7f-a62d-616fd9ab2aff none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_crucible_pantry_0af27834-4e26-4417-9cc3-9a04105b1cbc 8d62e551-9775-4ac8-a830-15e1f3aabb46 none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_internal_dns_a6212313-b0c0-4a69-9ca6-5ea9c7e3e947 38daea72-c487-4f80-9e27-ef67e6b2d05d none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_nexus_e786e397-2ccc-4112-bf26-45ca1de89f3b a26d8d3b-1483-4e98-bb4b-1680c75c2956 none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_ntp_0991f26b-97a1-4033-af5d-df7e56c2189a a6f0a3f1-aff9-45d9-8e70-610780c75c73 none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/debug c2868186-4510-4c56-9374-13a4fda781be 100 GiB none gzip-9 - oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/debug 80bb6683-3e89-4652-9b4d-a2adc6dc05c3 100 GiB none gzip-9 - oxp_2db7f3b4-ed19-4229-b42c-44f49eeb8a91/crypt/debug 35abcc8e-8fae-4e0f-9db7-457c21c27244 100 GiB none gzip-9 - oxp_2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a/crypt/debug ae45ae89-0fc5-4c82-8e38-bdc4efb2a4cd 100 GiB none gzip-9 - oxp_355e268c-c932-4f32-841c-f3ec88fe0495/crypt/debug f567b79a-c05c-4ba5-85a6-87f217687c9b 100 GiB none gzip-9 - oxp_427b2ccd-998f-4085-af21-e600604cf21e/crypt/debug da15e9ee-d60c-4b9d-a383-52c8c82f8bad 100 GiB none gzip-9 - oxp_588058f2-f51b-4800-a211-1c5dbb32296b/crypt/debug f8390042-25a5-43db-9d6c-336223c5210f 100 GiB none gzip-9 - oxp_736f6f07-2aa2-4658-8b5c-3bf409ea747a/crypt/debug 68191fe0-2606-4d82-833e-e467ff129a19 100 GiB none gzip-9 - oxp_bcfcdede-7084-4a31-97a8-ac4299c268f9/crypt/debug 2755f94e-a5e8-4bf8-8cdc-2645e5b21578 100 GiB none gzip-9 - oxp_fe379ac6-1938-4cc2-93a9-43b1447229ae/crypt/debug 68b11f7e-4258-483b-a75a-4243ca7ede6f 100 GiB none gzip-9 -+ oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/clickhouse 650004ee-2360-47a3-ba98-b07dd9873c06 none none off -+ oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_clickhouse_ca54c155-5e4c-42e6-96f2-b70448019418 b760c1d2-fa43-441d-8b79-d1fde01a8753 none none off -+ oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/zone/oxz_crucible_pantry_84fc3bdc-a8f6-4ceb-8fcf-59a003bc91c0 96d231ab-baee-465f-a584-6eedcc3e14cc none none off -+ oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/zone/oxz_nexus_b2e9a34b-7b15-4f56-836d-b39e474afbc5 a89cea5b-db88-4f12-a2f4-700a04803af1 none none off + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crucible b97110cd-9c9d-47d8-ac3e-38b2a5fbf4bb in service none none off + oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crucible b07b36ec-f27e-4bef-bd0e-adbab3dbded0 in service none none off + oxp_2db7f3b4-ed19-4229-b42c-44f49eeb8a91/crucible 50904cf3-e571-42ee-9be7-40e0d293be12 in service none none off + oxp_2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a/crucible e3ed0aa2-a4bf-4619-a276-ff287c23f260 in service none none off + oxp_355e268c-c932-4f32-841c-f3ec88fe0495/crucible c5a79172-3a48-4ecc-a814-77f4a0ac87c3 in service none none off + oxp_427b2ccd-998f-4085-af21-e600604cf21e/crucible 0490a48d-59be-412f-8db8-8a8778f5bdce in service none none off + oxp_588058f2-f51b-4800-a211-1c5dbb32296b/crucible d148662e-1244-416e-9043-2c6e5bc3391c in service none none off + oxp_736f6f07-2aa2-4658-8b5c-3bf409ea747a/crucible 55340375-5d36-475d-99d6-8c8dc38a8421 in service none none off + oxp_bcfcdede-7084-4a31-97a8-ac4299c268f9/crucible cdf74236-d6b4-4872-ab29-3ef21b1f9e9e in service none none off + oxp_fe379ac6-1938-4cc2-93a9-43b1447229ae/crucible 98085696-2290-4467-b2de-cecd1ab6255e in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/clickhouse_keeper 56624401-f56f-4fd2-88fb-cfd56df535aa in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/clickhouse_server 67e873d4-5ee2-4fcd-bd1f-9311ad2ed23c in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/internal_dns eba7c3d8-af0f-4de7-9b07-8e63ff8c9a34 in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone a27fb298-e263-4560-965a-2c56292ea19a in service none none off + oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/zone 03dfbeda-a138-45c2-975f-05a9af2ef2b9 in service none none off + oxp_2db7f3b4-ed19-4229-b42c-44f49eeb8a91/crypt/zone 40986d49-c197-462c-baac-ba937da44571 in service none none off + oxp_2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a/crypt/zone 006eede7-d6b6-4af2-a2ff-37b94386b421 in service none none off + oxp_355e268c-c932-4f32-841c-f3ec88fe0495/crypt/zone 18279e0e-4f67-4e87-bc5a-2eb3927ec023 in service none none off + oxp_427b2ccd-998f-4085-af21-e600604cf21e/crypt/zone 491b337c-3c25-4284-ae13-443206ff696f in service none none off + oxp_588058f2-f51b-4800-a211-1c5dbb32296b/crypt/zone 5aa2c795-468a-45df-8769-16f4d5d0e42a in service none none off + oxp_736f6f07-2aa2-4658-8b5c-3bf409ea747a/crypt/zone 89c95288-774f-480c-ab14-a0327bec365b in service none none off + oxp_bcfcdede-7084-4a31-97a8-ac4299c268f9/crypt/zone e7569f72-580c-417b-b223-0e5f998dd9c1 in service none none off + oxp_fe379ac6-1938-4cc2-93a9-43b1447229ae/crypt/zone 2aae5bf8-7c17-43c4-9183-4c1956571243 in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_clickhouse_keeper_2b368dcd-bb4b-4415-9daf-0d36fd769fed c22caa52-6179-49a7-95dc-5cf0d9f3f827 in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_clickhouse_server_097ab295-aec4-427f-9124-bb4e8aecfeca e21880d2-f6f9-4e97-b7da-5a8a934845ab in service none none off + oxp_736f6f07-2aa2-4658-8b5c-3bf409ea747a/crypt/zone/oxz_crucible_308c592a-b022-4790-9824-7a5e10b83d1b 4e514d61-b9d3-4e8c-b528-4b9577d8ad84 in service none none off + oxp_2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a/crypt/zone/oxz_crucible_7233139a-ad5b-4c0e-be80-759fbd5cb262 2c3d31cf-9a06-4f47-8f30-97884d06de8f in service none none off + oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/zone/oxz_crucible_8c43faff-54c7-4b91-820c-ff130b7049e9 9155b21a-1803-44b3-b80e-6d22f7af2e07 in service none none off + oxp_fe379ac6-1938-4cc2-93a9-43b1447229ae/crypt/zone/oxz_crucible_8ddbafde-d699-4e37-b70d-dcd803f0898e a46724b6-7ca0-4d70-9dd2-6fd22d1e6150 in service none none off + oxp_427b2ccd-998f-4085-af21-e600604cf21e/crypt/zone/oxz_crucible_955bd7eb-8cc2-4128-a636-19bde11ab251 44153191-15ac-4206-b153-167261b232fe in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_crucible_a6192358-d6e1-4483-a3c6-755a05911f22 5fd12d35-d258-42ca-8fe3-dc5788bdc66c in service none none off + oxp_bcfcdede-7084-4a31-97a8-ac4299c268f9/crypt/zone/oxz_crucible_a68bc085-0ad5-4c42-a9f7-0b540de24ced 1de186f8-a37f-42fa-9e70-05aa05641c7e in service none none off + oxp_355e268c-c932-4f32-841c-f3ec88fe0495/crypt/zone/oxz_crucible_cdc00fbb-5ac7-4667-9fc8-926ea73a002a 510ecf2a-6a98-40f2-b387-3bab22da2bf7 in service none none off + oxp_2db7f3b4-ed19-4229-b42c-44f49eeb8a91/crypt/zone/oxz_crucible_d04ed118-4eb8-4ba4-8f05-7714060291e2 282ed619-0004-4647-9d60-85509d68170e in service none none off + oxp_588058f2-f51b-4800-a211-1c5dbb32296b/crypt/zone/oxz_crucible_e5347768-7d4d-4862-b78e-38291aca675a ba5652ea-a567-4e7f-a62d-616fd9ab2aff in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_crucible_pantry_0af27834-4e26-4417-9cc3-9a04105b1cbc 8d62e551-9775-4ac8-a830-15e1f3aabb46 in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_internal_dns_a6212313-b0c0-4a69-9ca6-5ea9c7e3e947 38daea72-c487-4f80-9e27-ef67e6b2d05d in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_nexus_e786e397-2ccc-4112-bf26-45ca1de89f3b a26d8d3b-1483-4e98-bb4b-1680c75c2956 in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_ntp_0991f26b-97a1-4033-af5d-df7e56c2189a a6f0a3f1-aff9-45d9-8e70-610780c75c73 in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/debug c2868186-4510-4c56-9374-13a4fda781be in service 100 GiB none gzip-9 + oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/debug 80bb6683-3e89-4652-9b4d-a2adc6dc05c3 in service 100 GiB none gzip-9 + oxp_2db7f3b4-ed19-4229-b42c-44f49eeb8a91/crypt/debug 35abcc8e-8fae-4e0f-9db7-457c21c27244 in service 100 GiB none gzip-9 + oxp_2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a/crypt/debug ae45ae89-0fc5-4c82-8e38-bdc4efb2a4cd in service 100 GiB none gzip-9 + oxp_355e268c-c932-4f32-841c-f3ec88fe0495/crypt/debug f567b79a-c05c-4ba5-85a6-87f217687c9b in service 100 GiB none gzip-9 + oxp_427b2ccd-998f-4085-af21-e600604cf21e/crypt/debug da15e9ee-d60c-4b9d-a383-52c8c82f8bad in service 100 GiB none gzip-9 + oxp_588058f2-f51b-4800-a211-1c5dbb32296b/crypt/debug f8390042-25a5-43db-9d6c-336223c5210f in service 100 GiB none gzip-9 + oxp_736f6f07-2aa2-4658-8b5c-3bf409ea747a/crypt/debug 68191fe0-2606-4d82-833e-e467ff129a19 in service 100 GiB none gzip-9 + oxp_bcfcdede-7084-4a31-97a8-ac4299c268f9/crypt/debug 2755f94e-a5e8-4bf8-8cdc-2645e5b21578 in service 100 GiB none gzip-9 + oxp_fe379ac6-1938-4cc2-93a9-43b1447229ae/crypt/debug 68b11f7e-4258-483b-a75a-4243ca7ede6f in service 100 GiB none gzip-9 ++ oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/clickhouse 650004ee-2360-47a3-ba98-b07dd9873c06 in service none none off ++ oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_clickhouse_ca54c155-5e4c-42e6-96f2-b70448019418 b760c1d2-fa43-441d-8b79-d1fde01a8753 in service none none off ++ oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/zone/oxz_crucible_pantry_84fc3bdc-a8f6-4ceb-8fcf-59a003bc91c0 96d231ab-baee-465f-a584-6eedcc3e14cc in service none none off ++ oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/zone/oxz_nexus_b2e9a34b-7b15-4f56-836d-b39e474afbc5 a89cea5b-db88-4f12-a2f4-700a04803af1 in service none none off omicron zones generation 3 -> 4: diff --git a/nexus/reconfigurator/planning/tests/output/planner_expunge_clickhouse_clusters_5_6.txt b/nexus/reconfigurator/planning/tests/output/planner_expunge_clickhouse_clusters_5_6.txt index b15a554dd16..057873e7e7f 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_expunge_clickhouse_clusters_5_6.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_expunge_clickhouse_clusters_5_6.txt @@ -46,62 +46,62 @@ to: blueprint df68d4d4-5af4-4b56-95bb-1654a6957d4f datasets at generation 4: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crucible 7576ef1f-3e41-44cc-b750-9b397374e234 none none off - oxp_2d44b756-94df-45ec-a644-50021248682d/crucible 4c886e70-05ef-437c-a7ab-ba8a1b5cf9af none none off - oxp_2dce7cf0-3097-485d-aaf6-9fc51f99eae5/crucible ec7693f9-a469-48ad-8f8d-6d0bc0138be8 none none off - oxp_3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7/crucible b3ad0776-d6f0-4cbd-a382-a1b78576753b none none off - oxp_44342c41-75a7-4708-8004-eb2ca5c5a3c2/crucible 8d7eebdb-c82f-4a29-b3c3-290bd343814a none none off - oxp_650b4eff-80a2-430a-97c8-f837248480a1/crucible a30613bb-70dd-43dd-b23c-c8759df0acdd none none off - oxp_6e418b8c-cadd-4fb8-8370-f351a07e1eed/crucible 251a271a-0469-4309-ba94-7ecd827e3425 none none off - oxp_6e5772a5-8234-46d1-ba5a-503a83d9d2fb/crucible 8a62b925-a1cf-493a-a05e-67fc73605d82 none none off - oxp_c1da692e-7713-43a0-b6bb-5c182084c09d/crucible 649edc79-adc6-4391-a105-a54be7143259 none none off - oxp_e35766ef-789a-4b2f-9a6c-e6626d5ab195/crucible 8f1039b4-fd76-4444-802c-96385e68abde none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/clickhouse_keeper 00f7bc76-5861-485e-a7a7-8bc475950804 none none off - oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/clickhouse_keeper 3b45a02a-3f37-4deb-93c6-0cba30538645 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/clickhouse_server 12e71b76-b549-4357-8209-215144d61723 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/internal_dns f2c56628-2b29-42da-9ce3-ca705a0e4a97 none none off - oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/internal_dns 2bd9382d-ab49-4570-8ec8-c4da8c822693 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone 6c76a56e-edc0-46e8-92b4-162920f7de33 none none off - oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/zone ce9648f6-3e8f-4c4f-a116-d57aff785b51 none none off - oxp_2dce7cf0-3097-485d-aaf6-9fc51f99eae5/crypt/zone 0c0b9b34-0f11-480b-bc42-83ab3cfb3667 none none off - oxp_3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7/crypt/zone cb900fc0-fd1e-42fd-8e0b-491454d70d5e none none off - oxp_44342c41-75a7-4708-8004-eb2ca5c5a3c2/crypt/zone cae317ef-de63-4265-a0d7-777c5a70dd4e none none off - oxp_650b4eff-80a2-430a-97c8-f837248480a1/crypt/zone fec03736-ce6e-444e-b7dc-30ae3d00e502 none none off - oxp_6e418b8c-cadd-4fb8-8370-f351a07e1eed/crypt/zone c22dfc9e-b068-4b85-ae0a-e81bc67f679a none none off - oxp_6e5772a5-8234-46d1-ba5a-503a83d9d2fb/crypt/zone 8b954de0-88d8-4a00-902f-e612eed9da0c none none off - oxp_c1da692e-7713-43a0-b6bb-5c182084c09d/crypt/zone 27d840dc-67e6-4795-8bb1-427213d0df3e none none off - oxp_e35766ef-789a-4b2f-9a6c-e6626d5ab195/crypt/zone b8e322e8-fe4f-43e8-b51a-d08b12f7e515 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_clickhouse_keeper_3f78fa04-0b7e-4959-9718-c232c76500e1 cbe9ab91-b85c-490d-8561-739c66bd2bee none none off - oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/zone/oxz_clickhouse_keeper_bbba3c50-ff89-4a7f-96c1-d40ee996c417 ca2a30ab-baf8-4bb9-af14-3d41f6df6bf7 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_clickhouse_server_f0341fc6-6a73-4318-8787-dd0c6b26c385 39e58c15-5cb4-4f89-9bb3-adef453e9e3d none none off - oxp_650b4eff-80a2-430a-97c8-f837248480a1/crypt/zone/oxz_crucible_49afbe38-6b68-4764-afae-a279a7b9b1ab 3d258387-fe93-49c1-8cad-135b3f3556bf none none off - oxp_6e418b8c-cadd-4fb8-8370-f351a07e1eed/crypt/zone/oxz_crucible_4a223081-0985-45c7-b60e-478c371fde4b 69e7fb35-ff48-4d47-986f-374ce7ebac71 none none off - oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/zone/oxz_crucible_4e11460c-cfd2-4fa3-a7a7-25c976accece 6b5f0710-4fab-4921-b1ba-05de5d9ff2c3 none none off - oxp_c1da692e-7713-43a0-b6bb-5c182084c09d/crypt/zone/oxz_crucible_4f7d1ee4-bd7b-48a5-99e0-e61fc8e6e58e 45831cd5-d578-4473-a97a-f737aedd9903 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_crucible_7cc30ab4-c566-42d4-8fb0-31a8a27156ff df1af4ad-ec0e-4094-b8f2-d7ce592f40c0 none none off - oxp_6e5772a5-8234-46d1-ba5a-503a83d9d2fb/crypt/zone/oxz_crucible_a50a59b8-b59a-4f1d-b5d4-41f113802b5f c2832f18-d620-49d0-9c8e-b2fc9871e06f none none off - oxp_44342c41-75a7-4708-8004-eb2ca5c5a3c2/crypt/zone/oxz_crucible_a8839f9e-93f8-42a2-ac3a-9b804a5316f9 fdbdb20f-3a77-4da9-afff-96e7ac54f297 none none off - oxp_3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7/crypt/zone/oxz_crucible_da1d617e-6450-4bb8-8696-d1518b2f0731 458a4d6e-83ee-4e74-85e7-69b35dc8045c none none off - oxp_e35766ef-789a-4b2f-9a6c-e6626d5ab195/crypt/zone/oxz_crucible_e71169cf-ee83-47b2-85ec-3396a20b4e02 97f033d1-1878-4429-81cf-9da9dc36bd95 none none off - oxp_2dce7cf0-3097-485d-aaf6-9fc51f99eae5/crypt/zone/oxz_crucible_eeab4659-62e8-467f-a6f7-690854db89b5 854c1daf-e3bf-4b0a-84ef-3a1b9912f3df none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_crucible_pantry_2a8f8547-7c9a-4e79-8608-3c925fa3e4b7 74856b03-a612-43b4-94e7-6250cf56fba0 none none off - oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/zone/oxz_internal_dns_7f707d70-deef-42dc-96cc-a76cf6366386 40610ea8-b288-408c-91fd-e40edbba09cf none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_internal_dns_e8014d8f-0620-4dde-9fab-435cf4c0c321 2d7179ba-92a0-4bd1-8d5c-eba85fe540d3 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_nexus_d52405a5-debc-4682-8f32-8a3faee16b69 3fab12f1-b0ca-47e2-8865-9710e7e37117 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_ntp_a3e9eacd-48af-4333-aeb8-e7528042e664 e56af4f5-a7ba-4ff1-a44d-d955f21755b6 none none off - oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/debug fdd71393-adb7-45c9-8a88-f3ce8d2bb93e 100 GiB none gzip-9 - oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/debug c9b2026d-e9fd-4076-9a8c-32b06e34f0a3 100 GiB none gzip-9 - oxp_2dce7cf0-3097-485d-aaf6-9fc51f99eae5/crypt/debug 3325118f-1ebc-48cd-9ade-cf2d319211b3 100 GiB none gzip-9 - oxp_3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7/crypt/debug d0213d2b-116c-4329-a93d-02c69c44c598 100 GiB none gzip-9 - oxp_44342c41-75a7-4708-8004-eb2ca5c5a3c2/crypt/debug 247e51dd-fe88-43f2-b2bc-366e1b85c12b 100 GiB none gzip-9 - oxp_650b4eff-80a2-430a-97c8-f837248480a1/crypt/debug 9321a17c-709d-44df-a4e3-8ca09bb3665f 100 GiB none gzip-9 - oxp_6e418b8c-cadd-4fb8-8370-f351a07e1eed/crypt/debug ee28398d-301c-4661-85a5-ddf27cff28b4 100 GiB none gzip-9 - oxp_6e5772a5-8234-46d1-ba5a-503a83d9d2fb/crypt/debug e74f80f2-5369-4647-8bd0-35b7d8b2a0b0 100 GiB none gzip-9 - oxp_c1da692e-7713-43a0-b6bb-5c182084c09d/crypt/debug d0a324c8-9de3-414a-8c8c-3fe301549cdb 100 GiB none gzip-9 - oxp_e35766ef-789a-4b2f-9a6c-e6626d5ab195/crypt/debug 820def87-14ab-43c9-8f7d-b2be75a2570a 100 GiB none gzip-9 + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crucible 7576ef1f-3e41-44cc-b750-9b397374e234 in service none none off + oxp_2d44b756-94df-45ec-a644-50021248682d/crucible 4c886e70-05ef-437c-a7ab-ba8a1b5cf9af in service none none off + oxp_2dce7cf0-3097-485d-aaf6-9fc51f99eae5/crucible ec7693f9-a469-48ad-8f8d-6d0bc0138be8 in service none none off + oxp_3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7/crucible b3ad0776-d6f0-4cbd-a382-a1b78576753b in service none none off + oxp_44342c41-75a7-4708-8004-eb2ca5c5a3c2/crucible 8d7eebdb-c82f-4a29-b3c3-290bd343814a in service none none off + oxp_650b4eff-80a2-430a-97c8-f837248480a1/crucible a30613bb-70dd-43dd-b23c-c8759df0acdd in service none none off + oxp_6e418b8c-cadd-4fb8-8370-f351a07e1eed/crucible 251a271a-0469-4309-ba94-7ecd827e3425 in service none none off + oxp_6e5772a5-8234-46d1-ba5a-503a83d9d2fb/crucible 8a62b925-a1cf-493a-a05e-67fc73605d82 in service none none off + oxp_c1da692e-7713-43a0-b6bb-5c182084c09d/crucible 649edc79-adc6-4391-a105-a54be7143259 in service none none off + oxp_e35766ef-789a-4b2f-9a6c-e6626d5ab195/crucible 8f1039b4-fd76-4444-802c-96385e68abde in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/clickhouse_keeper 00f7bc76-5861-485e-a7a7-8bc475950804 in service none none off + oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/clickhouse_keeper 3b45a02a-3f37-4deb-93c6-0cba30538645 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/clickhouse_server 12e71b76-b549-4357-8209-215144d61723 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/internal_dns f2c56628-2b29-42da-9ce3-ca705a0e4a97 in service none none off + oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/internal_dns 2bd9382d-ab49-4570-8ec8-c4da8c822693 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone 6c76a56e-edc0-46e8-92b4-162920f7de33 in service none none off + oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/zone ce9648f6-3e8f-4c4f-a116-d57aff785b51 in service none none off + oxp_2dce7cf0-3097-485d-aaf6-9fc51f99eae5/crypt/zone 0c0b9b34-0f11-480b-bc42-83ab3cfb3667 in service none none off + oxp_3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7/crypt/zone cb900fc0-fd1e-42fd-8e0b-491454d70d5e in service none none off + oxp_44342c41-75a7-4708-8004-eb2ca5c5a3c2/crypt/zone cae317ef-de63-4265-a0d7-777c5a70dd4e in service none none off + oxp_650b4eff-80a2-430a-97c8-f837248480a1/crypt/zone fec03736-ce6e-444e-b7dc-30ae3d00e502 in service none none off + oxp_6e418b8c-cadd-4fb8-8370-f351a07e1eed/crypt/zone c22dfc9e-b068-4b85-ae0a-e81bc67f679a in service none none off + oxp_6e5772a5-8234-46d1-ba5a-503a83d9d2fb/crypt/zone 8b954de0-88d8-4a00-902f-e612eed9da0c in service none none off + oxp_c1da692e-7713-43a0-b6bb-5c182084c09d/crypt/zone 27d840dc-67e6-4795-8bb1-427213d0df3e in service none none off + oxp_e35766ef-789a-4b2f-9a6c-e6626d5ab195/crypt/zone b8e322e8-fe4f-43e8-b51a-d08b12f7e515 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_clickhouse_keeper_3f78fa04-0b7e-4959-9718-c232c76500e1 cbe9ab91-b85c-490d-8561-739c66bd2bee in service none none off + oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/zone/oxz_clickhouse_keeper_bbba3c50-ff89-4a7f-96c1-d40ee996c417 ca2a30ab-baf8-4bb9-af14-3d41f6df6bf7 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_clickhouse_server_f0341fc6-6a73-4318-8787-dd0c6b26c385 39e58c15-5cb4-4f89-9bb3-adef453e9e3d in service none none off + oxp_650b4eff-80a2-430a-97c8-f837248480a1/crypt/zone/oxz_crucible_49afbe38-6b68-4764-afae-a279a7b9b1ab 3d258387-fe93-49c1-8cad-135b3f3556bf in service none none off + oxp_6e418b8c-cadd-4fb8-8370-f351a07e1eed/crypt/zone/oxz_crucible_4a223081-0985-45c7-b60e-478c371fde4b 69e7fb35-ff48-4d47-986f-374ce7ebac71 in service none none off + oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/zone/oxz_crucible_4e11460c-cfd2-4fa3-a7a7-25c976accece 6b5f0710-4fab-4921-b1ba-05de5d9ff2c3 in service none none off + oxp_c1da692e-7713-43a0-b6bb-5c182084c09d/crypt/zone/oxz_crucible_4f7d1ee4-bd7b-48a5-99e0-e61fc8e6e58e 45831cd5-d578-4473-a97a-f737aedd9903 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_crucible_7cc30ab4-c566-42d4-8fb0-31a8a27156ff df1af4ad-ec0e-4094-b8f2-d7ce592f40c0 in service none none off + oxp_6e5772a5-8234-46d1-ba5a-503a83d9d2fb/crypt/zone/oxz_crucible_a50a59b8-b59a-4f1d-b5d4-41f113802b5f c2832f18-d620-49d0-9c8e-b2fc9871e06f in service none none off + oxp_44342c41-75a7-4708-8004-eb2ca5c5a3c2/crypt/zone/oxz_crucible_a8839f9e-93f8-42a2-ac3a-9b804a5316f9 fdbdb20f-3a77-4da9-afff-96e7ac54f297 in service none none off + oxp_3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7/crypt/zone/oxz_crucible_da1d617e-6450-4bb8-8696-d1518b2f0731 458a4d6e-83ee-4e74-85e7-69b35dc8045c in service none none off + oxp_e35766ef-789a-4b2f-9a6c-e6626d5ab195/crypt/zone/oxz_crucible_e71169cf-ee83-47b2-85ec-3396a20b4e02 97f033d1-1878-4429-81cf-9da9dc36bd95 in service none none off + oxp_2dce7cf0-3097-485d-aaf6-9fc51f99eae5/crypt/zone/oxz_crucible_eeab4659-62e8-467f-a6f7-690854db89b5 854c1daf-e3bf-4b0a-84ef-3a1b9912f3df in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_crucible_pantry_2a8f8547-7c9a-4e79-8608-3c925fa3e4b7 74856b03-a612-43b4-94e7-6250cf56fba0 in service none none off + oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/zone/oxz_internal_dns_7f707d70-deef-42dc-96cc-a76cf6366386 40610ea8-b288-408c-91fd-e40edbba09cf in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_internal_dns_e8014d8f-0620-4dde-9fab-435cf4c0c321 2d7179ba-92a0-4bd1-8d5c-eba85fe540d3 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_nexus_d52405a5-debc-4682-8f32-8a3faee16b69 3fab12f1-b0ca-47e2-8865-9710e7e37117 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/zone/oxz_ntp_a3e9eacd-48af-4333-aeb8-e7528042e664 e56af4f5-a7ba-4ff1-a44d-d955f21755b6 in service none none off + oxp_08616473-ded4-4785-9b53-b6ccc1efb67a/crypt/debug fdd71393-adb7-45c9-8a88-f3ce8d2bb93e in service 100 GiB none gzip-9 + oxp_2d44b756-94df-45ec-a644-50021248682d/crypt/debug c9b2026d-e9fd-4076-9a8c-32b06e34f0a3 in service 100 GiB none gzip-9 + oxp_2dce7cf0-3097-485d-aaf6-9fc51f99eae5/crypt/debug 3325118f-1ebc-48cd-9ade-cf2d319211b3 in service 100 GiB none gzip-9 + oxp_3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7/crypt/debug d0213d2b-116c-4329-a93d-02c69c44c598 in service 100 GiB none gzip-9 + oxp_44342c41-75a7-4708-8004-eb2ca5c5a3c2/crypt/debug 247e51dd-fe88-43f2-b2bc-366e1b85c12b in service 100 GiB none gzip-9 + oxp_650b4eff-80a2-430a-97c8-f837248480a1/crypt/debug 9321a17c-709d-44df-a4e3-8ca09bb3665f in service 100 GiB none gzip-9 + oxp_6e418b8c-cadd-4fb8-8370-f351a07e1eed/crypt/debug ee28398d-301c-4661-85a5-ddf27cff28b4 in service 100 GiB none gzip-9 + oxp_6e5772a5-8234-46d1-ba5a-503a83d9d2fb/crypt/debug e74f80f2-5369-4647-8bd0-35b7d8b2a0b0 in service 100 GiB none gzip-9 + oxp_c1da692e-7713-43a0-b6bb-5c182084c09d/crypt/debug d0a324c8-9de3-414a-8c8c-3fe301549cdb in service 100 GiB none gzip-9 + oxp_e35766ef-789a-4b2f-9a6c-e6626d5ab195/crypt/debug 820def87-14ab-43c9-8f7d-b2be75a2570a in service 100 GiB none gzip-9 omicron zones at generation 4: @@ -147,62 +147,62 @@ to: blueprint df68d4d4-5af4-4b56-95bb-1654a6957d4f datasets at generation 4: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crucible b97110cd-9c9d-47d8-ac3e-38b2a5fbf4bb none none off - oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crucible b07b36ec-f27e-4bef-bd0e-adbab3dbded0 none none off - oxp_2db7f3b4-ed19-4229-b42c-44f49eeb8a91/crucible 50904cf3-e571-42ee-9be7-40e0d293be12 none none off - oxp_2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a/crucible e3ed0aa2-a4bf-4619-a276-ff287c23f260 none none off - oxp_355e268c-c932-4f32-841c-f3ec88fe0495/crucible c5a79172-3a48-4ecc-a814-77f4a0ac87c3 none none off - oxp_427b2ccd-998f-4085-af21-e600604cf21e/crucible 0490a48d-59be-412f-8db8-8a8778f5bdce none none off - oxp_588058f2-f51b-4800-a211-1c5dbb32296b/crucible d148662e-1244-416e-9043-2c6e5bc3391c none none off - oxp_736f6f07-2aa2-4658-8b5c-3bf409ea747a/crucible 55340375-5d36-475d-99d6-8c8dc38a8421 none none off - oxp_bcfcdede-7084-4a31-97a8-ac4299c268f9/crucible cdf74236-d6b4-4872-ab29-3ef21b1f9e9e none none off - oxp_fe379ac6-1938-4cc2-93a9-43b1447229ae/crucible 98085696-2290-4467-b2de-cecd1ab6255e none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/clickhouse 650004ee-2360-47a3-ba98-b07dd9873c06 none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/clickhouse_keeper 56624401-f56f-4fd2-88fb-cfd56df535aa none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/clickhouse_server 67e873d4-5ee2-4fcd-bd1f-9311ad2ed23c none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/internal_dns eba7c3d8-af0f-4de7-9b07-8e63ff8c9a34 none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone a27fb298-e263-4560-965a-2c56292ea19a none none off - oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/zone 03dfbeda-a138-45c2-975f-05a9af2ef2b9 none none off - oxp_2db7f3b4-ed19-4229-b42c-44f49eeb8a91/crypt/zone 40986d49-c197-462c-baac-ba937da44571 none none off - oxp_2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a/crypt/zone 006eede7-d6b6-4af2-a2ff-37b94386b421 none none off - oxp_355e268c-c932-4f32-841c-f3ec88fe0495/crypt/zone 18279e0e-4f67-4e87-bc5a-2eb3927ec023 none none off - oxp_427b2ccd-998f-4085-af21-e600604cf21e/crypt/zone 491b337c-3c25-4284-ae13-443206ff696f none none off - oxp_588058f2-f51b-4800-a211-1c5dbb32296b/crypt/zone 5aa2c795-468a-45df-8769-16f4d5d0e42a none none off - oxp_736f6f07-2aa2-4658-8b5c-3bf409ea747a/crypt/zone 89c95288-774f-480c-ab14-a0327bec365b none none off - oxp_bcfcdede-7084-4a31-97a8-ac4299c268f9/crypt/zone e7569f72-580c-417b-b223-0e5f998dd9c1 none none off - oxp_fe379ac6-1938-4cc2-93a9-43b1447229ae/crypt/zone 2aae5bf8-7c17-43c4-9183-4c1956571243 none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_clickhouse_ca54c155-5e4c-42e6-96f2-b70448019418 b760c1d2-fa43-441d-8b79-d1fde01a8753 none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_clickhouse_keeper_2b368dcd-bb4b-4415-9daf-0d36fd769fed c22caa52-6179-49a7-95dc-5cf0d9f3f827 none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_clickhouse_server_097ab295-aec4-427f-9124-bb4e8aecfeca e21880d2-f6f9-4e97-b7da-5a8a934845ab none none off - oxp_736f6f07-2aa2-4658-8b5c-3bf409ea747a/crypt/zone/oxz_crucible_308c592a-b022-4790-9824-7a5e10b83d1b 4e514d61-b9d3-4e8c-b528-4b9577d8ad84 none none off - oxp_2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a/crypt/zone/oxz_crucible_7233139a-ad5b-4c0e-be80-759fbd5cb262 2c3d31cf-9a06-4f47-8f30-97884d06de8f none none off - oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/zone/oxz_crucible_8c43faff-54c7-4b91-820c-ff130b7049e9 9155b21a-1803-44b3-b80e-6d22f7af2e07 none none off - oxp_fe379ac6-1938-4cc2-93a9-43b1447229ae/crypt/zone/oxz_crucible_8ddbafde-d699-4e37-b70d-dcd803f0898e a46724b6-7ca0-4d70-9dd2-6fd22d1e6150 none none off - oxp_427b2ccd-998f-4085-af21-e600604cf21e/crypt/zone/oxz_crucible_955bd7eb-8cc2-4128-a636-19bde11ab251 44153191-15ac-4206-b153-167261b232fe none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_crucible_a6192358-d6e1-4483-a3c6-755a05911f22 5fd12d35-d258-42ca-8fe3-dc5788bdc66c none none off - oxp_bcfcdede-7084-4a31-97a8-ac4299c268f9/crypt/zone/oxz_crucible_a68bc085-0ad5-4c42-a9f7-0b540de24ced 1de186f8-a37f-42fa-9e70-05aa05641c7e none none off - oxp_355e268c-c932-4f32-841c-f3ec88fe0495/crypt/zone/oxz_crucible_cdc00fbb-5ac7-4667-9fc8-926ea73a002a 510ecf2a-6a98-40f2-b387-3bab22da2bf7 none none off - oxp_2db7f3b4-ed19-4229-b42c-44f49eeb8a91/crypt/zone/oxz_crucible_d04ed118-4eb8-4ba4-8f05-7714060291e2 282ed619-0004-4647-9d60-85509d68170e none none off - oxp_588058f2-f51b-4800-a211-1c5dbb32296b/crypt/zone/oxz_crucible_e5347768-7d4d-4862-b78e-38291aca675a ba5652ea-a567-4e7f-a62d-616fd9ab2aff none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_crucible_pantry_0af27834-4e26-4417-9cc3-9a04105b1cbc 8d62e551-9775-4ac8-a830-15e1f3aabb46 none none off - oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/zone/oxz_crucible_pantry_84fc3bdc-a8f6-4ceb-8fcf-59a003bc91c0 96d231ab-baee-465f-a584-6eedcc3e14cc none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_internal_dns_a6212313-b0c0-4a69-9ca6-5ea9c7e3e947 38daea72-c487-4f80-9e27-ef67e6b2d05d none none off - oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/zone/oxz_nexus_b2e9a34b-7b15-4f56-836d-b39e474afbc5 a89cea5b-db88-4f12-a2f4-700a04803af1 none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_nexus_e786e397-2ccc-4112-bf26-45ca1de89f3b a26d8d3b-1483-4e98-bb4b-1680c75c2956 none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_ntp_0991f26b-97a1-4033-af5d-df7e56c2189a a6f0a3f1-aff9-45d9-8e70-610780c75c73 none none off - oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/debug c2868186-4510-4c56-9374-13a4fda781be 100 GiB none gzip-9 - oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/debug 80bb6683-3e89-4652-9b4d-a2adc6dc05c3 100 GiB none gzip-9 - oxp_2db7f3b4-ed19-4229-b42c-44f49eeb8a91/crypt/debug 35abcc8e-8fae-4e0f-9db7-457c21c27244 100 GiB none gzip-9 - oxp_2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a/crypt/debug ae45ae89-0fc5-4c82-8e38-bdc4efb2a4cd 100 GiB none gzip-9 - oxp_355e268c-c932-4f32-841c-f3ec88fe0495/crypt/debug f567b79a-c05c-4ba5-85a6-87f217687c9b 100 GiB none gzip-9 - oxp_427b2ccd-998f-4085-af21-e600604cf21e/crypt/debug da15e9ee-d60c-4b9d-a383-52c8c82f8bad 100 GiB none gzip-9 - oxp_588058f2-f51b-4800-a211-1c5dbb32296b/crypt/debug f8390042-25a5-43db-9d6c-336223c5210f 100 GiB none gzip-9 - oxp_736f6f07-2aa2-4658-8b5c-3bf409ea747a/crypt/debug 68191fe0-2606-4d82-833e-e467ff129a19 100 GiB none gzip-9 - oxp_bcfcdede-7084-4a31-97a8-ac4299c268f9/crypt/debug 2755f94e-a5e8-4bf8-8cdc-2645e5b21578 100 GiB none gzip-9 - oxp_fe379ac6-1938-4cc2-93a9-43b1447229ae/crypt/debug 68b11f7e-4258-483b-a75a-4243ca7ede6f 100 GiB none gzip-9 + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crucible b97110cd-9c9d-47d8-ac3e-38b2a5fbf4bb in service none none off + oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crucible b07b36ec-f27e-4bef-bd0e-adbab3dbded0 in service none none off + oxp_2db7f3b4-ed19-4229-b42c-44f49eeb8a91/crucible 50904cf3-e571-42ee-9be7-40e0d293be12 in service none none off + oxp_2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a/crucible e3ed0aa2-a4bf-4619-a276-ff287c23f260 in service none none off + oxp_355e268c-c932-4f32-841c-f3ec88fe0495/crucible c5a79172-3a48-4ecc-a814-77f4a0ac87c3 in service none none off + oxp_427b2ccd-998f-4085-af21-e600604cf21e/crucible 0490a48d-59be-412f-8db8-8a8778f5bdce in service none none off + oxp_588058f2-f51b-4800-a211-1c5dbb32296b/crucible d148662e-1244-416e-9043-2c6e5bc3391c in service none none off + oxp_736f6f07-2aa2-4658-8b5c-3bf409ea747a/crucible 55340375-5d36-475d-99d6-8c8dc38a8421 in service none none off + oxp_bcfcdede-7084-4a31-97a8-ac4299c268f9/crucible cdf74236-d6b4-4872-ab29-3ef21b1f9e9e in service none none off + oxp_fe379ac6-1938-4cc2-93a9-43b1447229ae/crucible 98085696-2290-4467-b2de-cecd1ab6255e in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/clickhouse 650004ee-2360-47a3-ba98-b07dd9873c06 in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/clickhouse_keeper 56624401-f56f-4fd2-88fb-cfd56df535aa in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/clickhouse_server 67e873d4-5ee2-4fcd-bd1f-9311ad2ed23c in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/internal_dns eba7c3d8-af0f-4de7-9b07-8e63ff8c9a34 in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone a27fb298-e263-4560-965a-2c56292ea19a in service none none off + oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/zone 03dfbeda-a138-45c2-975f-05a9af2ef2b9 in service none none off + oxp_2db7f3b4-ed19-4229-b42c-44f49eeb8a91/crypt/zone 40986d49-c197-462c-baac-ba937da44571 in service none none off + oxp_2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a/crypt/zone 006eede7-d6b6-4af2-a2ff-37b94386b421 in service none none off + oxp_355e268c-c932-4f32-841c-f3ec88fe0495/crypt/zone 18279e0e-4f67-4e87-bc5a-2eb3927ec023 in service none none off + oxp_427b2ccd-998f-4085-af21-e600604cf21e/crypt/zone 491b337c-3c25-4284-ae13-443206ff696f in service none none off + oxp_588058f2-f51b-4800-a211-1c5dbb32296b/crypt/zone 5aa2c795-468a-45df-8769-16f4d5d0e42a in service none none off + oxp_736f6f07-2aa2-4658-8b5c-3bf409ea747a/crypt/zone 89c95288-774f-480c-ab14-a0327bec365b in service none none off + oxp_bcfcdede-7084-4a31-97a8-ac4299c268f9/crypt/zone e7569f72-580c-417b-b223-0e5f998dd9c1 in service none none off + oxp_fe379ac6-1938-4cc2-93a9-43b1447229ae/crypt/zone 2aae5bf8-7c17-43c4-9183-4c1956571243 in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_clickhouse_ca54c155-5e4c-42e6-96f2-b70448019418 b760c1d2-fa43-441d-8b79-d1fde01a8753 in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_clickhouse_keeper_2b368dcd-bb4b-4415-9daf-0d36fd769fed c22caa52-6179-49a7-95dc-5cf0d9f3f827 in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_clickhouse_server_097ab295-aec4-427f-9124-bb4e8aecfeca e21880d2-f6f9-4e97-b7da-5a8a934845ab in service none none off + oxp_736f6f07-2aa2-4658-8b5c-3bf409ea747a/crypt/zone/oxz_crucible_308c592a-b022-4790-9824-7a5e10b83d1b 4e514d61-b9d3-4e8c-b528-4b9577d8ad84 in service none none off + oxp_2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a/crypt/zone/oxz_crucible_7233139a-ad5b-4c0e-be80-759fbd5cb262 2c3d31cf-9a06-4f47-8f30-97884d06de8f in service none none off + oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/zone/oxz_crucible_8c43faff-54c7-4b91-820c-ff130b7049e9 9155b21a-1803-44b3-b80e-6d22f7af2e07 in service none none off + oxp_fe379ac6-1938-4cc2-93a9-43b1447229ae/crypt/zone/oxz_crucible_8ddbafde-d699-4e37-b70d-dcd803f0898e a46724b6-7ca0-4d70-9dd2-6fd22d1e6150 in service none none off + oxp_427b2ccd-998f-4085-af21-e600604cf21e/crypt/zone/oxz_crucible_955bd7eb-8cc2-4128-a636-19bde11ab251 44153191-15ac-4206-b153-167261b232fe in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_crucible_a6192358-d6e1-4483-a3c6-755a05911f22 5fd12d35-d258-42ca-8fe3-dc5788bdc66c in service none none off + oxp_bcfcdede-7084-4a31-97a8-ac4299c268f9/crypt/zone/oxz_crucible_a68bc085-0ad5-4c42-a9f7-0b540de24ced 1de186f8-a37f-42fa-9e70-05aa05641c7e in service none none off + oxp_355e268c-c932-4f32-841c-f3ec88fe0495/crypt/zone/oxz_crucible_cdc00fbb-5ac7-4667-9fc8-926ea73a002a 510ecf2a-6a98-40f2-b387-3bab22da2bf7 in service none none off + oxp_2db7f3b4-ed19-4229-b42c-44f49eeb8a91/crypt/zone/oxz_crucible_d04ed118-4eb8-4ba4-8f05-7714060291e2 282ed619-0004-4647-9d60-85509d68170e in service none none off + oxp_588058f2-f51b-4800-a211-1c5dbb32296b/crypt/zone/oxz_crucible_e5347768-7d4d-4862-b78e-38291aca675a ba5652ea-a567-4e7f-a62d-616fd9ab2aff in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_crucible_pantry_0af27834-4e26-4417-9cc3-9a04105b1cbc 8d62e551-9775-4ac8-a830-15e1f3aabb46 in service none none off + oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/zone/oxz_crucible_pantry_84fc3bdc-a8f6-4ceb-8fcf-59a003bc91c0 96d231ab-baee-465f-a584-6eedcc3e14cc in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_internal_dns_a6212313-b0c0-4a69-9ca6-5ea9c7e3e947 38daea72-c487-4f80-9e27-ef67e6b2d05d in service none none off + oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/zone/oxz_nexus_b2e9a34b-7b15-4f56-836d-b39e474afbc5 a89cea5b-db88-4f12-a2f4-700a04803af1 in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_nexus_e786e397-2ccc-4112-bf26-45ca1de89f3b a26d8d3b-1483-4e98-bb4b-1680c75c2956 in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/zone/oxz_ntp_0991f26b-97a1-4033-af5d-df7e56c2189a a6f0a3f1-aff9-45d9-8e70-610780c75c73 in service none none off + oxp_21d60319-5fe1-4a3b-a4c0-6aa7465e7bde/crypt/debug c2868186-4510-4c56-9374-13a4fda781be in service 100 GiB none gzip-9 + oxp_2acfbb84-5ce0-424e-8d73-44c5071d4430/crypt/debug 80bb6683-3e89-4652-9b4d-a2adc6dc05c3 in service 100 GiB none gzip-9 + oxp_2db7f3b4-ed19-4229-b42c-44f49eeb8a91/crypt/debug 35abcc8e-8fae-4e0f-9db7-457c21c27244 in service 100 GiB none gzip-9 + oxp_2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a/crypt/debug ae45ae89-0fc5-4c82-8e38-bdc4efb2a4cd in service 100 GiB none gzip-9 + oxp_355e268c-c932-4f32-841c-f3ec88fe0495/crypt/debug f567b79a-c05c-4ba5-85a6-87f217687c9b in service 100 GiB none gzip-9 + oxp_427b2ccd-998f-4085-af21-e600604cf21e/crypt/debug da15e9ee-d60c-4b9d-a383-52c8c82f8bad in service 100 GiB none gzip-9 + oxp_588058f2-f51b-4800-a211-1c5dbb32296b/crypt/debug f8390042-25a5-43db-9d6c-336223c5210f in service 100 GiB none gzip-9 + oxp_736f6f07-2aa2-4658-8b5c-3bf409ea747a/crypt/debug 68191fe0-2606-4d82-833e-e467ff129a19 in service 100 GiB none gzip-9 + oxp_bcfcdede-7084-4a31-97a8-ac4299c268f9/crypt/debug 2755f94e-a5e8-4bf8-8cdc-2645e5b21578 in service 100 GiB none gzip-9 + oxp_fe379ac6-1938-4cc2-93a9-43b1447229ae/crypt/debug 68b11f7e-4258-483b-a75a-4243ca7ede6f in service 100 GiB none gzip-9 omicron zones at generation 4: diff --git a/nexus/reconfigurator/planning/tests/output/planner_expunge_clickhouse_zones_after_policy_is_changed_3_4.txt b/nexus/reconfigurator/planning/tests/output/planner_expunge_clickhouse_zones_after_policy_is_changed_3_4.txt index 291caadece6..99d20deb4de 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_expunge_clickhouse_zones_after_policy_is_changed_3_4.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_expunge_clickhouse_zones_after_policy_is_changed_3_4.txt @@ -22,58 +22,60 @@ to: blueprint d895ef50-9978-454c-bdfb-b8dbe2c9a918 datasets generation 4 -> 5: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crucible 2995233a-0449-4072-b509-76033ef98ba6 none none off - oxp_5b04e3d3-7a8b-466e-ab63-6ca89a93e100/crucible af187db0-8de0-4d0f-93f6-df8aecedac9b none none off - oxp_6e8fdb9f-c47a-47b0-b7ee-9a2adc7e4af5/crucible cbdac478-a890-4b3f-9201-48a4ab393e1b none none off - oxp_8e2c9e92-e35e-494c-8e14-dcf5f5009656/crucible 32d14ae0-68ee-4bcc-bfa1-135cc3221765 none none off - oxp_a4c575b4-934b-49b9-9c47-9c1241a33607/crucible f998be6f-0965-4e91-8bca-19924f5d4fdd none none off - oxp_a9a8a692-d2d7-4b3e-a297-d648faf8c7cf/crucible 31ef6da6-6d72-4b16-b66e-de5919248fa1 none none off - oxp_b65c8376-0084-4d6f-9891-9d6a413d4e56/crucible e47bdf6e-29d5-4a43-8909-a4b60aea8c88 none none off - oxp_bc61cdae-c96f-4886-b8bd-f9fd69d51e3a/crucible e8025577-6780-42cb-a6a4-c0d462e7e726 none none off - oxp_e9f68306-460a-4b11-b904-f752633bf1fc/crucible e636f409-22a1-4e85-a180-275d1c586350 none none off - oxp_fbc5bdf2-9644-4d0a-b349-f490486da25d/crucible 5b79a673-5132-4781-a33f-732e564ac40c none none off - oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/clickhouse ed9a1f42-6aec-4bf8-ae48-0bc25d8a2be2 none none off - oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/internal_dns fe4d67a2-5fb8-4096-97b2-12cf077ae41e none none off - oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/zone 567b450c-835e-4622-8fd9-3e41bff04b99 none none off - oxp_5b04e3d3-7a8b-466e-ab63-6ca89a93e100/crypt/zone 7771428a-e7a9-40fe-89f2-deb92f8b77eb none none off - oxp_6e8fdb9f-c47a-47b0-b7ee-9a2adc7e4af5/crypt/zone 88131d15-f49e-467c-9241-7236f5b14e0b none none off - oxp_8e2c9e92-e35e-494c-8e14-dcf5f5009656/crypt/zone 033c5679-6241-4502-99f1-50f685f57403 none none off - oxp_a4c575b4-934b-49b9-9c47-9c1241a33607/crypt/zone 39c3d488-3bd7-48c0-a965-d8e0b77a3dea none none off - oxp_a9a8a692-d2d7-4b3e-a297-d648faf8c7cf/crypt/zone 9e18151a-63b1-4715-bb5c-e2088b1fcd57 none none off - oxp_b65c8376-0084-4d6f-9891-9d6a413d4e56/crypt/zone 5ea593b7-5882-47db-986a-570362ea7180 none none off - oxp_bc61cdae-c96f-4886-b8bd-f9fd69d51e3a/crypt/zone 01e0e8fc-a101-4e55-ab67-6a2d6472f5c2 none none off - oxp_e9f68306-460a-4b11-b904-f752633bf1fc/crypt/zone 4b14443d-d9bf-4c9b-9c74-1f434c467b8a none none off - oxp_fbc5bdf2-9644-4d0a-b349-f490486da25d/crypt/zone 49b5c150-d615-487b-bda2-00d8d5fa85fc none none off - oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/zone/oxz_clickhouse_c3d4b77c-2e77-45ef-9764-5f45723f1e6e 5782d4d4-614c-4521-ba76-64d146ff4086 none none off - oxp_8e2c9e92-e35e-494c-8e14-dcf5f5009656/crypt/zone/oxz_crucible_060bee8a-a830-4db9-b43f-d2d4d651460f 1b994560-5065-495b-8f52-089a66023db9 none none off - oxp_bc61cdae-c96f-4886-b8bd-f9fd69d51e3a/crypt/zone/oxz_crucible_14b40b41-0679-4a97-abb9-670d4a014168 4e7d5a46-7ae5-4065-86b6-d6e549a86381 none none off - oxp_fbc5bdf2-9644-4d0a-b349-f490486da25d/crypt/zone/oxz_crucible_2d00b429-277a-4670-9841-59dfe36418f5 ba483769-2ff7-469a-8bd5-9d0069c98f3a none none off - oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/zone/oxz_crucible_6667f342-3f4d-498f-852b-af58fe6cfe4d 12468ab7-b48d-401c-9ef9-26b2d50cd9aa none none off - oxp_e9f68306-460a-4b11-b904-f752633bf1fc/crypt/zone/oxz_crucible_6acddc3a-7c18-4bed-9bee-06179a16b511 636854c7-673f-4a5c-8841-a4ea7d669856 none none off - oxp_6e8fdb9f-c47a-47b0-b7ee-9a2adc7e4af5/crypt/zone/oxz_crucible_6d91fce2-b64b-4778-bc7d-3a3ee4fc050f e8d9ad3c-b77a-4ae9-bd7a-8717663d4732 none none off - oxp_a9a8a692-d2d7-4b3e-a297-d648faf8c7cf/crypt/zone/oxz_crucible_743f2573-1cd6-418b-a0e0-7fb6d5dc65c9 0a19c469-38a3-4ad1-acff-a2eec66d039b none none off - oxp_5b04e3d3-7a8b-466e-ab63-6ca89a93e100/crypt/zone/oxz_crucible_9bb3f4a7-3699-481f-928a-f57cbe505f12 7fec29ed-8f6f-4f72-af7a-1603f74ae3e6 none none off - oxp_b65c8376-0084-4d6f-9891-9d6a413d4e56/crypt/zone/oxz_crucible_9bcc969f-8a33-4c30-8608-ad9e0048035a 4c0d8c8a-ddb6-4a88-be7f-1bf5685adafa none none off - oxp_a4c575b4-934b-49b9-9c47-9c1241a33607/crypt/zone/oxz_crucible_f50159f9-2c73-4ea6-9e03-296e158a3af4 8f7c7096-7cd3-4a79-b24b-dc0e7fa3e3ec none none off - oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/zone/oxz_crucible_pantry_c9e73f39-4dd7-4a87-828b-58c4fcf60d4a 786f9c46-8818-4811-a816-65be22187e13 none none off - oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/zone/oxz_internal_dns_42bf3233-3a94-4f47-8c51-7ac3524ea1f5 923f9064-ee22-42f2-a75f-c7da7dde3acc none none off - oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/zone/oxz_nexus_254bd45b-ef24-4ce2-812b-9e825d11da65 5b7c73f6-8e61-4160-b747-d69aad5af1ac none none off - oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/zone/oxz_ntp_ac14e7ae-b9d4-455b-9400-89931771987c 49673924-48da-4afb-85f8-8c92c32c06f0 none none off - oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/debug e271927c-4565-48f7-b983-721b5e46a1e6 100 GiB none gzip-9 - oxp_5b04e3d3-7a8b-466e-ab63-6ca89a93e100/crypt/debug 901ce577-ae12-461a-99a9-f8e972f7cc5d 100 GiB none gzip-9 - oxp_6e8fdb9f-c47a-47b0-b7ee-9a2adc7e4af5/crypt/debug c2b2e20a-b273-4b7c-b2d9-142447e5fc69 100 GiB none gzip-9 - oxp_8e2c9e92-e35e-494c-8e14-dcf5f5009656/crypt/debug 2891a537-17ea-4d83-b2ea-af36a6d22d2d 100 GiB none gzip-9 - oxp_a4c575b4-934b-49b9-9c47-9c1241a33607/crypt/debug dc614216-2b34-4659-bfbe-55462fe203f0 100 GiB none gzip-9 - oxp_a9a8a692-d2d7-4b3e-a297-d648faf8c7cf/crypt/debug 872f53ed-6dc6-43e1-8a52-9c87938e2330 100 GiB none gzip-9 - oxp_b65c8376-0084-4d6f-9891-9d6a413d4e56/crypt/debug 2f0c179c-d7dd-4450-9163-e799de0aef90 100 GiB none gzip-9 - oxp_bc61cdae-c96f-4886-b8bd-f9fd69d51e3a/crypt/debug 8b49dee0-2726-4261-aabd-331752764e91 100 GiB none gzip-9 - oxp_e9f68306-460a-4b11-b904-f752633bf1fc/crypt/debug f6dae5d2-fff9-4562-9fd4-be99ff888afc 100 GiB none gzip-9 - oxp_fbc5bdf2-9644-4d0a-b349-f490486da25d/crypt/debug e0a59564-f99b-47a6-b1ca-b83001fe6908 100 GiB none gzip-9 -* oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/clickhouse_keeper 04cdeda2-c4f7-4f76-bfbf-f946dcdefda3 none none off -* oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/zone/oxz_clickhouse_keeper_14b84b08-598b-4756-99ec-eea98f8fa46e 1b4c5dcd-24e9-4076-9219-e9559ae49857 none none off + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crucible 2995233a-0449-4072-b509-76033ef98ba6 in service none none off + oxp_5b04e3d3-7a8b-466e-ab63-6ca89a93e100/crucible af187db0-8de0-4d0f-93f6-df8aecedac9b in service none none off + oxp_6e8fdb9f-c47a-47b0-b7ee-9a2adc7e4af5/crucible cbdac478-a890-4b3f-9201-48a4ab393e1b in service none none off + oxp_8e2c9e92-e35e-494c-8e14-dcf5f5009656/crucible 32d14ae0-68ee-4bcc-bfa1-135cc3221765 in service none none off + oxp_a4c575b4-934b-49b9-9c47-9c1241a33607/crucible f998be6f-0965-4e91-8bca-19924f5d4fdd in service none none off + oxp_a9a8a692-d2d7-4b3e-a297-d648faf8c7cf/crucible 31ef6da6-6d72-4b16-b66e-de5919248fa1 in service none none off + oxp_b65c8376-0084-4d6f-9891-9d6a413d4e56/crucible e47bdf6e-29d5-4a43-8909-a4b60aea8c88 in service none none off + oxp_bc61cdae-c96f-4886-b8bd-f9fd69d51e3a/crucible e8025577-6780-42cb-a6a4-c0d462e7e726 in service none none off + oxp_e9f68306-460a-4b11-b904-f752633bf1fc/crucible e636f409-22a1-4e85-a180-275d1c586350 in service none none off + oxp_fbc5bdf2-9644-4d0a-b349-f490486da25d/crucible 5b79a673-5132-4781-a33f-732e564ac40c in service none none off + oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/clickhouse ed9a1f42-6aec-4bf8-ae48-0bc25d8a2be2 expunged none none off + oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/internal_dns fe4d67a2-5fb8-4096-97b2-12cf077ae41e in service none none off + oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/zone 567b450c-835e-4622-8fd9-3e41bff04b99 in service none none off + oxp_5b04e3d3-7a8b-466e-ab63-6ca89a93e100/crypt/zone 7771428a-e7a9-40fe-89f2-deb92f8b77eb in service none none off + oxp_6e8fdb9f-c47a-47b0-b7ee-9a2adc7e4af5/crypt/zone 88131d15-f49e-467c-9241-7236f5b14e0b in service none none off + oxp_8e2c9e92-e35e-494c-8e14-dcf5f5009656/crypt/zone 033c5679-6241-4502-99f1-50f685f57403 in service none none off + oxp_a4c575b4-934b-49b9-9c47-9c1241a33607/crypt/zone 39c3d488-3bd7-48c0-a965-d8e0b77a3dea in service none none off + oxp_a9a8a692-d2d7-4b3e-a297-d648faf8c7cf/crypt/zone 9e18151a-63b1-4715-bb5c-e2088b1fcd57 in service none none off + oxp_b65c8376-0084-4d6f-9891-9d6a413d4e56/crypt/zone 5ea593b7-5882-47db-986a-570362ea7180 in service none none off + oxp_bc61cdae-c96f-4886-b8bd-f9fd69d51e3a/crypt/zone 01e0e8fc-a101-4e55-ab67-6a2d6472f5c2 in service none none off + oxp_e9f68306-460a-4b11-b904-f752633bf1fc/crypt/zone 4b14443d-d9bf-4c9b-9c74-1f434c467b8a in service none none off + oxp_fbc5bdf2-9644-4d0a-b349-f490486da25d/crypt/zone 49b5c150-d615-487b-bda2-00d8d5fa85fc in service none none off + oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/zone/oxz_clickhouse_c3d4b77c-2e77-45ef-9764-5f45723f1e6e 5782d4d4-614c-4521-ba76-64d146ff4086 expunged none none off + oxp_8e2c9e92-e35e-494c-8e14-dcf5f5009656/crypt/zone/oxz_crucible_060bee8a-a830-4db9-b43f-d2d4d651460f 1b994560-5065-495b-8f52-089a66023db9 in service none none off + oxp_bc61cdae-c96f-4886-b8bd-f9fd69d51e3a/crypt/zone/oxz_crucible_14b40b41-0679-4a97-abb9-670d4a014168 4e7d5a46-7ae5-4065-86b6-d6e549a86381 in service none none off + oxp_fbc5bdf2-9644-4d0a-b349-f490486da25d/crypt/zone/oxz_crucible_2d00b429-277a-4670-9841-59dfe36418f5 ba483769-2ff7-469a-8bd5-9d0069c98f3a in service none none off + oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/zone/oxz_crucible_6667f342-3f4d-498f-852b-af58fe6cfe4d 12468ab7-b48d-401c-9ef9-26b2d50cd9aa in service none none off + oxp_e9f68306-460a-4b11-b904-f752633bf1fc/crypt/zone/oxz_crucible_6acddc3a-7c18-4bed-9bee-06179a16b511 636854c7-673f-4a5c-8841-a4ea7d669856 in service none none off + oxp_6e8fdb9f-c47a-47b0-b7ee-9a2adc7e4af5/crypt/zone/oxz_crucible_6d91fce2-b64b-4778-bc7d-3a3ee4fc050f e8d9ad3c-b77a-4ae9-bd7a-8717663d4732 in service none none off + oxp_a9a8a692-d2d7-4b3e-a297-d648faf8c7cf/crypt/zone/oxz_crucible_743f2573-1cd6-418b-a0e0-7fb6d5dc65c9 0a19c469-38a3-4ad1-acff-a2eec66d039b in service none none off + oxp_5b04e3d3-7a8b-466e-ab63-6ca89a93e100/crypt/zone/oxz_crucible_9bb3f4a7-3699-481f-928a-f57cbe505f12 7fec29ed-8f6f-4f72-af7a-1603f74ae3e6 in service none none off + oxp_b65c8376-0084-4d6f-9891-9d6a413d4e56/crypt/zone/oxz_crucible_9bcc969f-8a33-4c30-8608-ad9e0048035a 4c0d8c8a-ddb6-4a88-be7f-1bf5685adafa in service none none off + oxp_a4c575b4-934b-49b9-9c47-9c1241a33607/crypt/zone/oxz_crucible_f50159f9-2c73-4ea6-9e03-296e158a3af4 8f7c7096-7cd3-4a79-b24b-dc0e7fa3e3ec in service none none off + oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/zone/oxz_crucible_pantry_c9e73f39-4dd7-4a87-828b-58c4fcf60d4a 786f9c46-8818-4811-a816-65be22187e13 in service none none off + oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/zone/oxz_internal_dns_42bf3233-3a94-4f47-8c51-7ac3524ea1f5 923f9064-ee22-42f2-a75f-c7da7dde3acc in service none none off + oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/zone/oxz_nexus_254bd45b-ef24-4ce2-812b-9e825d11da65 5b7c73f6-8e61-4160-b747-d69aad5af1ac in service none none off + oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/zone/oxz_ntp_ac14e7ae-b9d4-455b-9400-89931771987c 49673924-48da-4afb-85f8-8c92c32c06f0 in service none none off + oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/debug e271927c-4565-48f7-b983-721b5e46a1e6 in service 100 GiB none gzip-9 + oxp_5b04e3d3-7a8b-466e-ab63-6ca89a93e100/crypt/debug 901ce577-ae12-461a-99a9-f8e972f7cc5d in service 100 GiB none gzip-9 + oxp_6e8fdb9f-c47a-47b0-b7ee-9a2adc7e4af5/crypt/debug c2b2e20a-b273-4b7c-b2d9-142447e5fc69 in service 100 GiB none gzip-9 + oxp_8e2c9e92-e35e-494c-8e14-dcf5f5009656/crypt/debug 2891a537-17ea-4d83-b2ea-af36a6d22d2d in service 100 GiB none gzip-9 + oxp_a4c575b4-934b-49b9-9c47-9c1241a33607/crypt/debug dc614216-2b34-4659-bfbe-55462fe203f0 in service 100 GiB none gzip-9 + oxp_a9a8a692-d2d7-4b3e-a297-d648faf8c7cf/crypt/debug 872f53ed-6dc6-43e1-8a52-9c87938e2330 in service 100 GiB none gzip-9 + oxp_b65c8376-0084-4d6f-9891-9d6a413d4e56/crypt/debug 2f0c179c-d7dd-4450-9163-e799de0aef90 in service 100 GiB none gzip-9 + oxp_bc61cdae-c96f-4886-b8bd-f9fd69d51e3a/crypt/debug 8b49dee0-2726-4261-aabd-331752764e91 in service 100 GiB none gzip-9 + oxp_e9f68306-460a-4b11-b904-f752633bf1fc/crypt/debug f6dae5d2-fff9-4562-9fd4-be99ff888afc in service 100 GiB none gzip-9 + oxp_fbc5bdf2-9644-4d0a-b349-f490486da25d/crypt/debug e0a59564-f99b-47a6-b1ca-b83001fe6908 in service 100 GiB none gzip-9 +* oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/clickhouse_keeper 04cdeda2-c4f7-4f76-bfbf-f946dcdefda3 - in service none none off + └─ + expunged +* oxp_41eaf63b-4fa9-443e-8da1-78d1e79aac7d/crypt/zone/oxz_clickhouse_keeper_14b84b08-598b-4756-99ec-eea98f8fa46e 1b4c5dcd-24e9-4076-9219-e9559ae49857 - in service none none off + └─ + expunged omicron zones generation 4 -> 5: @@ -118,58 +120,62 @@ to: blueprint d895ef50-9978-454c-bdfb-b8dbe2c9a918 datasets generation 3 -> 4: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_21b01477-48d0-4b65-9089-4a48277af033/crucible 84bb55f1-1bb2-43e8-876e-6ea25177c441 none none off - oxp_2704e66b-3d5c-4b64-951c-a051fa15e4a8/crucible 458ad495-6e68-4c37-92f1-fe95b4793d34 none none off - oxp_27a22f7e-754a-43ea-8ec4-e9cbd9b62e08/crucible a76905d1-b8fa-4fe4-9d92-a6cb6dfb2a52 none none off - oxp_51c788ff-de33-43f7-b9c5-f5f56bf80736/crucible 560e9d58-5ec1-48ee-bb54-de7195c87105 none none off - oxp_5fe54077-c016-49a9-becb-14993f133d43/crucible 1e4af81b-d9fd-4098-8407-7a02ded667a6 none none off - oxp_7e2644a1-bec7-433c-8168-8898d7140aab/crucible 4a10912d-26ef-40be-b53d-ebd1be2511d8 none none off - oxp_9825ff38-f07d-44a1-9efc-55a25e72015b/crucible 170c77e2-33d8-420e-95d9-f844cf92b669 none none off - oxp_cc585a73-ec86-4f8e-a327-901b947a4c69/crucible e41db0f3-9cf0-40d7-974e-2bc52e2cb423 none none off - oxp_d2801671-bb69-408e-93f7-ac2b05d992f8/crucible 443efd4a-56e8-4cf6-a937-fd9b88c6726f none none off - oxp_f52832ea-60d7-443b-9847-df5384bfc8e2/crucible b5e0fa95-c29f-4a40-9aed-a6ba784011db none none off - oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/internal_dns 2b28cc6f-9331-4ebc-ae96-722dbbe50787 none none off - oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/zone 8ed08c10-262a-431d-899a-fd1cd9ef7b7a none none off - oxp_2704e66b-3d5c-4b64-951c-a051fa15e4a8/crypt/zone 513e31d7-ad8e-4d14-ac09-22ccda3e09a0 none none off - oxp_27a22f7e-754a-43ea-8ec4-e9cbd9b62e08/crypt/zone 24f9f357-065a-4d0e-8d26-3bc8bf6b7e4d none none off - oxp_51c788ff-de33-43f7-b9c5-f5f56bf80736/crypt/zone d64352bf-f0cc-4045-9ed2-b28f7ba60b30 none none off - oxp_5fe54077-c016-49a9-becb-14993f133d43/crypt/zone 70cb8400-e02f-4c3f-8c50-ed9dc631b144 none none off - oxp_7e2644a1-bec7-433c-8168-8898d7140aab/crypt/zone e8163cfc-097a-486a-ae53-a5704c02b71f none none off - oxp_9825ff38-f07d-44a1-9efc-55a25e72015b/crypt/zone 0f6ed045-ff2e-4bec-91aa-298c11427ad1 none none off - oxp_cc585a73-ec86-4f8e-a327-901b947a4c69/crypt/zone e9a8bebe-0d55-438b-83c5-8177c6ff5338 none none off - oxp_d2801671-bb69-408e-93f7-ac2b05d992f8/crypt/zone f6c82983-cefd-4ce2-aa70-a31e8ce01fb9 none none off - oxp_f52832ea-60d7-443b-9847-df5384bfc8e2/crypt/zone de7c7a98-40a6-427b-ad10-ba86092d0063 none none off - oxp_7e2644a1-bec7-433c-8168-8898d7140aab/crypt/zone/oxz_crucible_219b9a45-ed13-4b8c-8c11-4dc050e20622 9b67b652-271f-4f3b-aec8-da672954c7d0 none none off - oxp_9825ff38-f07d-44a1-9efc-55a25e72015b/crypt/zone/oxz_crucible_27ccb886-b2d4-417e-80d5-48aca47b1af4 ee782292-53a4-4e79-a0de-2dc161b86c9d none none off - oxp_51c788ff-de33-43f7-b9c5-f5f56bf80736/crypt/zone/oxz_crucible_289b3a22-d704-4463-9ffb-0f6d28f3375c 0fff2deb-36aa-4cc1-b137-8c8e257b6bde none none off - oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/zone/oxz_crucible_426ca71b-a99b-438d-ab68-aadc572e091d 2569e010-759a-404e-bf2c-5d078b236a98 none none off - oxp_f52832ea-60d7-443b-9847-df5384bfc8e2/crypt/zone/oxz_crucible_49ac37b2-44ab-4dc0-95e2-94aeb02feac1 adf11973-c20d-4716-8b43-85362547abb4 none none off - oxp_5fe54077-c016-49a9-becb-14993f133d43/crypt/zone/oxz_crucible_4aec3ce0-42c3-4517-9824-d586b0573995 94b5c89a-4cd4-42e3-b58f-46b9ac5144cb none none off - oxp_cc585a73-ec86-4f8e-a327-901b947a4c69/crypt/zone/oxz_crucible_524ac4e1-4450-42c8-b3c2-be1543719114 0af0283c-ff72-4653-9081-2e9736b77b42 none none off - oxp_d2801671-bb69-408e-93f7-ac2b05d992f8/crypt/zone/oxz_crucible_74efcbfe-af9b-4725-afe0-cd7be749259c 7fb4dbdd-06fa-41ae-b3f3-8bb1beec4d6a none none off - oxp_27a22f7e-754a-43ea-8ec4-e9cbd9b62e08/crypt/zone/oxz_crucible_b9de2375-60b4-493a-afc3-b39037e39e61 99a7b0dc-e71d-4972-b02b-9cd52504d37d none none off - oxp_2704e66b-3d5c-4b64-951c-a051fa15e4a8/crypt/zone/oxz_crucible_fb520cbc-e538-4e68-99e5-d3815dfa8eda 18a1222c-c627-4cc4-bed2-a7ad09f67401 none none off - oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/zone/oxz_crucible_pantry_7ad82737-6993-41c9-a756-1115d84a9a4c ddb61eb2-a252-40cb-ba2f-d89819e50b2a none none off - oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/zone/oxz_internal_dns_edceecb5-d6a2-4da3-abed-51d36c44588b 1174e0b7-3343-43ce-9357-6fd52b5847ca none none off - oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/zone/oxz_nexus_5e3bbe2e-34ed-4461-bb25-d0e9773a6b17 d6952149-15d8-440f-a7d0-16a842e3cda8 none none off - oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/zone/oxz_ntp_b03bea01-5e98-4aaf-a886-c7498ff42012 d247b879-8e1f-4ade-a71a-55a715b0f750 none none off - oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/debug b8b68350-ab5b-497f-896a-1e40f8b1110c 100 GiB none gzip-9 - oxp_2704e66b-3d5c-4b64-951c-a051fa15e4a8/crypt/debug 2e5f5bf1-224c-48f1-a388-85f0ccdc26b3 100 GiB none gzip-9 - oxp_27a22f7e-754a-43ea-8ec4-e9cbd9b62e08/crypt/debug 928de1b9-33d6-4529-9c28-baaabde0158b 100 GiB none gzip-9 - oxp_51c788ff-de33-43f7-b9c5-f5f56bf80736/crypt/debug e9c16c98-cce5-4171-8605-b9453de85cd3 100 GiB none gzip-9 - oxp_5fe54077-c016-49a9-becb-14993f133d43/crypt/debug 2313cf25-da1e-4ddb-b1ca-3c37f76b5579 100 GiB none gzip-9 - oxp_7e2644a1-bec7-433c-8168-8898d7140aab/crypt/debug 883d3371-ed4f-4c13-8162-5d555b322cd4 100 GiB none gzip-9 - oxp_9825ff38-f07d-44a1-9efc-55a25e72015b/crypt/debug 0239ed9a-4439-40d4-a6d7-4e9bbbcbb8c3 100 GiB none gzip-9 - oxp_cc585a73-ec86-4f8e-a327-901b947a4c69/crypt/debug 1bac8756-a4cb-42a6-a2a6-2bb4aec66f1c 100 GiB none gzip-9 - oxp_d2801671-bb69-408e-93f7-ac2b05d992f8/crypt/debug 96bd6ec7-2830-4715-8416-5628d10f726c 100 GiB none gzip-9 - oxp_f52832ea-60d7-443b-9847-df5384bfc8e2/crypt/debug 99fd5841-618c-45a0-88e0-048839bf19c8 100 GiB none gzip-9 -* oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/clickhouse_keeper 89c1fd47-d4b7-4948-b2f8-2b2621fdb892 none none off -* oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/clickhouse_server 231c7aa0-8206-47a7-8b3e-e88548565081 none none off -* oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/zone/oxz_clickhouse_keeper_10db7ee4-04bb-430a-836d-c4308716e995 716b7f3a-718e-41e4-86e2-f55c3bf288d7 none none off -* oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/zone/oxz_clickhouse_server_fe8b84ef-ee63-4dd9-9110-4a8dd696b5c4 273770ea-58d1-4dfe-af91-2bb1e7bfc5b3 none none off + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_21b01477-48d0-4b65-9089-4a48277af033/crucible 84bb55f1-1bb2-43e8-876e-6ea25177c441 in service none none off + oxp_2704e66b-3d5c-4b64-951c-a051fa15e4a8/crucible 458ad495-6e68-4c37-92f1-fe95b4793d34 in service none none off + oxp_27a22f7e-754a-43ea-8ec4-e9cbd9b62e08/crucible a76905d1-b8fa-4fe4-9d92-a6cb6dfb2a52 in service none none off + oxp_51c788ff-de33-43f7-b9c5-f5f56bf80736/crucible 560e9d58-5ec1-48ee-bb54-de7195c87105 in service none none off + oxp_5fe54077-c016-49a9-becb-14993f133d43/crucible 1e4af81b-d9fd-4098-8407-7a02ded667a6 in service none none off + oxp_7e2644a1-bec7-433c-8168-8898d7140aab/crucible 4a10912d-26ef-40be-b53d-ebd1be2511d8 in service none none off + oxp_9825ff38-f07d-44a1-9efc-55a25e72015b/crucible 170c77e2-33d8-420e-95d9-f844cf92b669 in service none none off + oxp_cc585a73-ec86-4f8e-a327-901b947a4c69/crucible e41db0f3-9cf0-40d7-974e-2bc52e2cb423 in service none none off + oxp_d2801671-bb69-408e-93f7-ac2b05d992f8/crucible 443efd4a-56e8-4cf6-a937-fd9b88c6726f in service none none off + oxp_f52832ea-60d7-443b-9847-df5384bfc8e2/crucible b5e0fa95-c29f-4a40-9aed-a6ba784011db in service none none off + oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/internal_dns 2b28cc6f-9331-4ebc-ae96-722dbbe50787 in service none none off + oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/zone 8ed08c10-262a-431d-899a-fd1cd9ef7b7a in service none none off + oxp_2704e66b-3d5c-4b64-951c-a051fa15e4a8/crypt/zone 513e31d7-ad8e-4d14-ac09-22ccda3e09a0 in service none none off + oxp_27a22f7e-754a-43ea-8ec4-e9cbd9b62e08/crypt/zone 24f9f357-065a-4d0e-8d26-3bc8bf6b7e4d in service none none off + oxp_51c788ff-de33-43f7-b9c5-f5f56bf80736/crypt/zone d64352bf-f0cc-4045-9ed2-b28f7ba60b30 in service none none off + oxp_5fe54077-c016-49a9-becb-14993f133d43/crypt/zone 70cb8400-e02f-4c3f-8c50-ed9dc631b144 in service none none off + oxp_7e2644a1-bec7-433c-8168-8898d7140aab/crypt/zone e8163cfc-097a-486a-ae53-a5704c02b71f in service none none off + oxp_9825ff38-f07d-44a1-9efc-55a25e72015b/crypt/zone 0f6ed045-ff2e-4bec-91aa-298c11427ad1 in service none none off + oxp_cc585a73-ec86-4f8e-a327-901b947a4c69/crypt/zone e9a8bebe-0d55-438b-83c5-8177c6ff5338 in service none none off + oxp_d2801671-bb69-408e-93f7-ac2b05d992f8/crypt/zone f6c82983-cefd-4ce2-aa70-a31e8ce01fb9 in service none none off + oxp_f52832ea-60d7-443b-9847-df5384bfc8e2/crypt/zone de7c7a98-40a6-427b-ad10-ba86092d0063 in service none none off + oxp_7e2644a1-bec7-433c-8168-8898d7140aab/crypt/zone/oxz_crucible_219b9a45-ed13-4b8c-8c11-4dc050e20622 9b67b652-271f-4f3b-aec8-da672954c7d0 in service none none off + oxp_9825ff38-f07d-44a1-9efc-55a25e72015b/crypt/zone/oxz_crucible_27ccb886-b2d4-417e-80d5-48aca47b1af4 ee782292-53a4-4e79-a0de-2dc161b86c9d in service none none off + oxp_51c788ff-de33-43f7-b9c5-f5f56bf80736/crypt/zone/oxz_crucible_289b3a22-d704-4463-9ffb-0f6d28f3375c 0fff2deb-36aa-4cc1-b137-8c8e257b6bde in service none none off + oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/zone/oxz_crucible_426ca71b-a99b-438d-ab68-aadc572e091d 2569e010-759a-404e-bf2c-5d078b236a98 in service none none off + oxp_f52832ea-60d7-443b-9847-df5384bfc8e2/crypt/zone/oxz_crucible_49ac37b2-44ab-4dc0-95e2-94aeb02feac1 adf11973-c20d-4716-8b43-85362547abb4 in service none none off + oxp_5fe54077-c016-49a9-becb-14993f133d43/crypt/zone/oxz_crucible_4aec3ce0-42c3-4517-9824-d586b0573995 94b5c89a-4cd4-42e3-b58f-46b9ac5144cb in service none none off + oxp_cc585a73-ec86-4f8e-a327-901b947a4c69/crypt/zone/oxz_crucible_524ac4e1-4450-42c8-b3c2-be1543719114 0af0283c-ff72-4653-9081-2e9736b77b42 in service none none off + oxp_d2801671-bb69-408e-93f7-ac2b05d992f8/crypt/zone/oxz_crucible_74efcbfe-af9b-4725-afe0-cd7be749259c 7fb4dbdd-06fa-41ae-b3f3-8bb1beec4d6a in service none none off + oxp_27a22f7e-754a-43ea-8ec4-e9cbd9b62e08/crypt/zone/oxz_crucible_b9de2375-60b4-493a-afc3-b39037e39e61 99a7b0dc-e71d-4972-b02b-9cd52504d37d in service none none off + oxp_2704e66b-3d5c-4b64-951c-a051fa15e4a8/crypt/zone/oxz_crucible_fb520cbc-e538-4e68-99e5-d3815dfa8eda 18a1222c-c627-4cc4-bed2-a7ad09f67401 in service none none off + oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/zone/oxz_crucible_pantry_7ad82737-6993-41c9-a756-1115d84a9a4c ddb61eb2-a252-40cb-ba2f-d89819e50b2a in service none none off + oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/zone/oxz_internal_dns_edceecb5-d6a2-4da3-abed-51d36c44588b 1174e0b7-3343-43ce-9357-6fd52b5847ca in service none none off + oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/zone/oxz_nexus_5e3bbe2e-34ed-4461-bb25-d0e9773a6b17 d6952149-15d8-440f-a7d0-16a842e3cda8 in service none none off + oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/zone/oxz_ntp_b03bea01-5e98-4aaf-a886-c7498ff42012 d247b879-8e1f-4ade-a71a-55a715b0f750 in service none none off + oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/debug b8b68350-ab5b-497f-896a-1e40f8b1110c in service 100 GiB none gzip-9 + oxp_2704e66b-3d5c-4b64-951c-a051fa15e4a8/crypt/debug 2e5f5bf1-224c-48f1-a388-85f0ccdc26b3 in service 100 GiB none gzip-9 + oxp_27a22f7e-754a-43ea-8ec4-e9cbd9b62e08/crypt/debug 928de1b9-33d6-4529-9c28-baaabde0158b in service 100 GiB none gzip-9 + oxp_51c788ff-de33-43f7-b9c5-f5f56bf80736/crypt/debug e9c16c98-cce5-4171-8605-b9453de85cd3 in service 100 GiB none gzip-9 + oxp_5fe54077-c016-49a9-becb-14993f133d43/crypt/debug 2313cf25-da1e-4ddb-b1ca-3c37f76b5579 in service 100 GiB none gzip-9 + oxp_7e2644a1-bec7-433c-8168-8898d7140aab/crypt/debug 883d3371-ed4f-4c13-8162-5d555b322cd4 in service 100 GiB none gzip-9 + oxp_9825ff38-f07d-44a1-9efc-55a25e72015b/crypt/debug 0239ed9a-4439-40d4-a6d7-4e9bbbcbb8c3 in service 100 GiB none gzip-9 + oxp_cc585a73-ec86-4f8e-a327-901b947a4c69/crypt/debug 1bac8756-a4cb-42a6-a2a6-2bb4aec66f1c in service 100 GiB none gzip-9 + oxp_d2801671-bb69-408e-93f7-ac2b05d992f8/crypt/debug 96bd6ec7-2830-4715-8416-5628d10f726c in service 100 GiB none gzip-9 + oxp_f52832ea-60d7-443b-9847-df5384bfc8e2/crypt/debug 99fd5841-618c-45a0-88e0-048839bf19c8 in service 100 GiB none gzip-9 +* oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/clickhouse_keeper 89c1fd47-d4b7-4948-b2f8-2b2621fdb892 - in service none none off + └─ + expunged +* oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/clickhouse_server 231c7aa0-8206-47a7-8b3e-e88548565081 - in service none none off + └─ + expunged +* oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/zone/oxz_clickhouse_keeper_10db7ee4-04bb-430a-836d-c4308716e995 716b7f3a-718e-41e4-86e2-f55c3bf288d7 - in service none none off + └─ + expunged +* oxp_21b01477-48d0-4b65-9089-4a48277af033/crypt/zone/oxz_clickhouse_server_fe8b84ef-ee63-4dd9-9110-4a8dd696b5c4 273770ea-58d1-4dfe-af91-2bb1e7bfc5b3 - in service none none off + └─ + expunged omicron zones generation 3 -> 4: @@ -215,60 +221,64 @@ to: blueprint d895ef50-9978-454c-bdfb-b8dbe2c9a918 datasets generation 3 -> 4: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crucible 7a03c6b4-1ad5-4345-a698-e8ec846570b8 none none off - oxp_5f877424-eca4-4c5d-af7f-41627382cfd8/crucible 69633ed3-7ae3-44c8-b18f-9185be5e8b16 none none off - oxp_65ebc532-cbb7-43e1-923b-37c5cb7236d7/crucible 25eab6da-bb9d-4d85-9416-5d9ecb15fcb0 none none off - oxp_8277a18f-3187-4893-8ef1-5cbfe2284616/crucible ecec4ffc-28d5-467c-bfef-40b78ef90578 none none off - oxp_83592889-d746-4c5d-98e8-582d9c34a15f/crucible f7bb8bb0-af54-470c-a43a-15368a7ee3ea none none off - oxp_88e423b5-98c9-4e78-992a-5d01e1c33272/crucible 2d7b9c72-0af0-4a4a-8aa9-0d9af1ceb031 none none off - oxp_a5553017-9991-4ffb-ae37-f9c0e3428562/crucible ed2876ea-e461-4ad9-a18f-b96898761a74 none none off - oxp_b2c5a75b-9f72-405a-8134-691c0f45a1fd/crucible d649a820-d5bc-47c8-8f09-a153fea0cae6 none none off - oxp_d4d665fc-df4d-4a13-b9c2-ad13549c0845/crucible 23bc903a-73d5-401d-9701-ccb4b5620f6d none none off - oxp_facb28ca-94fd-47a0-bf63-ee394d32c43b/crucible fa87edd8-3150-49e3-a3c1-ad11b82a428e none none off - oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/internal_dns b5e9c350-d032-4854-9445-38af42b6da6c none none off - oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone 523f0aaa-c792-417b-88fa-eddfad1c96e1 none none off - oxp_5f877424-eca4-4c5d-af7f-41627382cfd8/crypt/zone fd0ad3de-0bc6-4524-8132-856dea1574a5 none none off - oxp_65ebc532-cbb7-43e1-923b-37c5cb7236d7/crypt/zone 767a46bc-9cb2-4ff6-9969-9798bff46115 none none off - oxp_8277a18f-3187-4893-8ef1-5cbfe2284616/crypt/zone 2f047175-93b1-4827-890b-ad4df41dc908 none none off - oxp_83592889-d746-4c5d-98e8-582d9c34a15f/crypt/zone 5edb9668-3ca5-4416-8e0d-b07e374fc510 none none off - oxp_88e423b5-98c9-4e78-992a-5d01e1c33272/crypt/zone c0a7a1cf-a47d-45ab-8249-bd147f9e78fa none none off - oxp_a5553017-9991-4ffb-ae37-f9c0e3428562/crypt/zone 924d9c1f-021d-494d-acf7-31afcdc6dfd6 none none off - oxp_b2c5a75b-9f72-405a-8134-691c0f45a1fd/crypt/zone 923fd3c8-9e2d-46a8-9d64-040adb4f97aa none none off - oxp_d4d665fc-df4d-4a13-b9c2-ad13549c0845/crypt/zone e0469419-68c7-4f33-ba83-5dd63ad35e82 none none off - oxp_facb28ca-94fd-47a0-bf63-ee394d32c43b/crypt/zone b0e61094-c730-4f49-a2a9-fc257eab77d7 none none off - oxp_facb28ca-94fd-47a0-bf63-ee394d32c43b/crypt/zone/oxz_crucible_0b3c14a3-2ebc-465f-bea0-36dafe72b645 536689a3-5791-4c4b-bc59-f20c52653647 none none off - oxp_a5553017-9991-4ffb-ae37-f9c0e3428562/crypt/zone/oxz_crucible_196e0925-a8bd-4b24-a8d1-8786dceaed24 52857ff2-3f93-4023-a1d9-bab881b273fb none none off - oxp_8277a18f-3187-4893-8ef1-5cbfe2284616/crypt/zone/oxz_crucible_2fde7a41-f139-4bd8-9617-328de00b69b6 f399a80d-d344-47c2-90e3-79516ad322c8 none none off - oxp_65ebc532-cbb7-43e1-923b-37c5cb7236d7/crypt/zone/oxz_crucible_37f4b29c-1a9a-4747-8baf-ee9ac8cba5f4 aa74afec-728d-4d14-ae52-731cb0c437dc none none off - oxp_5f877424-eca4-4c5d-af7f-41627382cfd8/crypt/zone/oxz_crucible_4dc70ea3-fc77-43d4-8b23-b3e22b777292 f2174337-2580-4b41-9c14-7e0efcee0e2d none none off - oxp_88e423b5-98c9-4e78-992a-5d01e1c33272/crypt/zone/oxz_crucible_671d516f-43f5-4b17-856e-65c08bdc7821 3785f450-eab8-485c-bae6-970a722d045c none none off - oxp_83592889-d746-4c5d-98e8-582d9c34a15f/crypt/zone/oxz_crucible_8048791b-05f9-447f-aa0c-1a25cec2a012 6d4d1083-ff28-4fca-8593-6884dc5c86bd none none off - oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone/oxz_crucible_837842a8-ad59-4654-a83d-b13a68a30a92 7fc41833-5f1b-4565-999d-dfe3faaba5ec none none off - oxp_b2c5a75b-9f72-405a-8134-691c0f45a1fd/crypt/zone/oxz_crucible_a6cebeb0-12cf-433d-adaf-7e5e635054bc 7dfa1f54-6587-4d09-8f8f-7eb0402ec1d7 none none off - oxp_d4d665fc-df4d-4a13-b9c2-ad13549c0845/crypt/zone/oxz_crucible_b51501a5-50be-439c-bbcd-47e85ac03f68 706dbdb1-086b-4db5-a8e1-5270e65848ac none none off - oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone/oxz_crucible_pantry_511cbb04-ff55-48d3-a1fd-5c2bbbd10ba7 92d0dbde-6a18-48d8-9c70-6bc5d73425d6 none none off - oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone/oxz_internal_dns_aae73b3c-14cf-485b-ab97-ebeffcf3fbdc cb5d97eb-c0d6-4006-a747-7971634a58cf none none off - oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone/oxz_nexus_5424157d-fb7c-4816-9fd1-fedea5eaa4d8 e4504980-52c5-4345-b2d6-3c40d95ec378 none none off - oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone/oxz_ntp_db6ac8f4-eeba-4dad-81b5-dbac0dbf3529 522e92c9-748e-4e46-9e22-5f85e70bf039 none none off - oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/debug 472c10e2-8919-4b4a-a17b-27d886ef8b28 100 GiB none gzip-9 - oxp_5f877424-eca4-4c5d-af7f-41627382cfd8/crypt/debug 8c119af1-d840-4b9d-827e-8064501f0c7a 100 GiB none gzip-9 - oxp_65ebc532-cbb7-43e1-923b-37c5cb7236d7/crypt/debug c227c948-b83f-44c0-9e2d-2b65237b0e8d 100 GiB none gzip-9 - oxp_8277a18f-3187-4893-8ef1-5cbfe2284616/crypt/debug 8ef34a90-1e48-4d2e-b49e-e84200a5143b 100 GiB none gzip-9 - oxp_83592889-d746-4c5d-98e8-582d9c34a15f/crypt/debug ed1845c2-e1a4-481d-b569-de693c8cf267 100 GiB none gzip-9 - oxp_88e423b5-98c9-4e78-992a-5d01e1c33272/crypt/debug e3566f33-41c7-4aff-a790-adc53e2a94cc 100 GiB none gzip-9 - oxp_a5553017-9991-4ffb-ae37-f9c0e3428562/crypt/debug decc30a9-2c66-4bbd-9388-c711f7233f0e 100 GiB none gzip-9 - oxp_b2c5a75b-9f72-405a-8134-691c0f45a1fd/crypt/debug 38bc5f30-17f4-4610-b87d-918f04c859ed 100 GiB none gzip-9 - oxp_d4d665fc-df4d-4a13-b9c2-ad13549c0845/crypt/debug a84a2e72-8032-451a-862d-06f4eb18db24 100 GiB none gzip-9 - oxp_facb28ca-94fd-47a0-bf63-ee394d32c43b/crypt/debug dd44015d-6b42-4970-9080-49267bf44c48 100 GiB none gzip-9 -* oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/clickhouse_keeper 1589e72c-6719-46bf-bd6b-496eb5bdded5 none none off -* oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/clickhouse_server bd823ad1-bcd2-4bfb-9f98-4080f8c5a6d0 none none off -* oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone/oxz_clickhouse_keeper_0326e8e8-1d52-495e-9773-cd3fa559edbe 579beffb-3093-445a-823c-3dbd96e882ff none none off -* oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone/oxz_clickhouse_server_1b6b784b-d157-4544-b7ff-6c71f3622a0f af0cfce5-065b-4444-a1aa-fe6f82ab3f3f none none off -+ oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/clickhouse 3514fa60-ee1a-4917-9893-def35dd0043d none none off -+ oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone/oxz_clickhouse_bf9a0f08-fd0d-480c-ae73-3d7507a52b1d 9ef55ba9-8462-424e-a0ff-d4ba686a0bca none none off + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crucible 7a03c6b4-1ad5-4345-a698-e8ec846570b8 in service none none off + oxp_5f877424-eca4-4c5d-af7f-41627382cfd8/crucible 69633ed3-7ae3-44c8-b18f-9185be5e8b16 in service none none off + oxp_65ebc532-cbb7-43e1-923b-37c5cb7236d7/crucible 25eab6da-bb9d-4d85-9416-5d9ecb15fcb0 in service none none off + oxp_8277a18f-3187-4893-8ef1-5cbfe2284616/crucible ecec4ffc-28d5-467c-bfef-40b78ef90578 in service none none off + oxp_83592889-d746-4c5d-98e8-582d9c34a15f/crucible f7bb8bb0-af54-470c-a43a-15368a7ee3ea in service none none off + oxp_88e423b5-98c9-4e78-992a-5d01e1c33272/crucible 2d7b9c72-0af0-4a4a-8aa9-0d9af1ceb031 in service none none off + oxp_a5553017-9991-4ffb-ae37-f9c0e3428562/crucible ed2876ea-e461-4ad9-a18f-b96898761a74 in service none none off + oxp_b2c5a75b-9f72-405a-8134-691c0f45a1fd/crucible d649a820-d5bc-47c8-8f09-a153fea0cae6 in service none none off + oxp_d4d665fc-df4d-4a13-b9c2-ad13549c0845/crucible 23bc903a-73d5-401d-9701-ccb4b5620f6d in service none none off + oxp_facb28ca-94fd-47a0-bf63-ee394d32c43b/crucible fa87edd8-3150-49e3-a3c1-ad11b82a428e in service none none off + oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/internal_dns b5e9c350-d032-4854-9445-38af42b6da6c in service none none off + oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone 523f0aaa-c792-417b-88fa-eddfad1c96e1 in service none none off + oxp_5f877424-eca4-4c5d-af7f-41627382cfd8/crypt/zone fd0ad3de-0bc6-4524-8132-856dea1574a5 in service none none off + oxp_65ebc532-cbb7-43e1-923b-37c5cb7236d7/crypt/zone 767a46bc-9cb2-4ff6-9969-9798bff46115 in service none none off + oxp_8277a18f-3187-4893-8ef1-5cbfe2284616/crypt/zone 2f047175-93b1-4827-890b-ad4df41dc908 in service none none off + oxp_83592889-d746-4c5d-98e8-582d9c34a15f/crypt/zone 5edb9668-3ca5-4416-8e0d-b07e374fc510 in service none none off + oxp_88e423b5-98c9-4e78-992a-5d01e1c33272/crypt/zone c0a7a1cf-a47d-45ab-8249-bd147f9e78fa in service none none off + oxp_a5553017-9991-4ffb-ae37-f9c0e3428562/crypt/zone 924d9c1f-021d-494d-acf7-31afcdc6dfd6 in service none none off + oxp_b2c5a75b-9f72-405a-8134-691c0f45a1fd/crypt/zone 923fd3c8-9e2d-46a8-9d64-040adb4f97aa in service none none off + oxp_d4d665fc-df4d-4a13-b9c2-ad13549c0845/crypt/zone e0469419-68c7-4f33-ba83-5dd63ad35e82 in service none none off + oxp_facb28ca-94fd-47a0-bf63-ee394d32c43b/crypt/zone b0e61094-c730-4f49-a2a9-fc257eab77d7 in service none none off + oxp_facb28ca-94fd-47a0-bf63-ee394d32c43b/crypt/zone/oxz_crucible_0b3c14a3-2ebc-465f-bea0-36dafe72b645 536689a3-5791-4c4b-bc59-f20c52653647 in service none none off + oxp_a5553017-9991-4ffb-ae37-f9c0e3428562/crypt/zone/oxz_crucible_196e0925-a8bd-4b24-a8d1-8786dceaed24 52857ff2-3f93-4023-a1d9-bab881b273fb in service none none off + oxp_8277a18f-3187-4893-8ef1-5cbfe2284616/crypt/zone/oxz_crucible_2fde7a41-f139-4bd8-9617-328de00b69b6 f399a80d-d344-47c2-90e3-79516ad322c8 in service none none off + oxp_65ebc532-cbb7-43e1-923b-37c5cb7236d7/crypt/zone/oxz_crucible_37f4b29c-1a9a-4747-8baf-ee9ac8cba5f4 aa74afec-728d-4d14-ae52-731cb0c437dc in service none none off + oxp_5f877424-eca4-4c5d-af7f-41627382cfd8/crypt/zone/oxz_crucible_4dc70ea3-fc77-43d4-8b23-b3e22b777292 f2174337-2580-4b41-9c14-7e0efcee0e2d in service none none off + oxp_88e423b5-98c9-4e78-992a-5d01e1c33272/crypt/zone/oxz_crucible_671d516f-43f5-4b17-856e-65c08bdc7821 3785f450-eab8-485c-bae6-970a722d045c in service none none off + oxp_83592889-d746-4c5d-98e8-582d9c34a15f/crypt/zone/oxz_crucible_8048791b-05f9-447f-aa0c-1a25cec2a012 6d4d1083-ff28-4fca-8593-6884dc5c86bd in service none none off + oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone/oxz_crucible_837842a8-ad59-4654-a83d-b13a68a30a92 7fc41833-5f1b-4565-999d-dfe3faaba5ec in service none none off + oxp_b2c5a75b-9f72-405a-8134-691c0f45a1fd/crypt/zone/oxz_crucible_a6cebeb0-12cf-433d-adaf-7e5e635054bc 7dfa1f54-6587-4d09-8f8f-7eb0402ec1d7 in service none none off + oxp_d4d665fc-df4d-4a13-b9c2-ad13549c0845/crypt/zone/oxz_crucible_b51501a5-50be-439c-bbcd-47e85ac03f68 706dbdb1-086b-4db5-a8e1-5270e65848ac in service none none off + oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone/oxz_crucible_pantry_511cbb04-ff55-48d3-a1fd-5c2bbbd10ba7 92d0dbde-6a18-48d8-9c70-6bc5d73425d6 in service none none off + oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone/oxz_internal_dns_aae73b3c-14cf-485b-ab97-ebeffcf3fbdc cb5d97eb-c0d6-4006-a747-7971634a58cf in service none none off + oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone/oxz_nexus_5424157d-fb7c-4816-9fd1-fedea5eaa4d8 e4504980-52c5-4345-b2d6-3c40d95ec378 in service none none off + oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone/oxz_ntp_db6ac8f4-eeba-4dad-81b5-dbac0dbf3529 522e92c9-748e-4e46-9e22-5f85e70bf039 in service none none off + oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/debug 472c10e2-8919-4b4a-a17b-27d886ef8b28 in service 100 GiB none gzip-9 + oxp_5f877424-eca4-4c5d-af7f-41627382cfd8/crypt/debug 8c119af1-d840-4b9d-827e-8064501f0c7a in service 100 GiB none gzip-9 + oxp_65ebc532-cbb7-43e1-923b-37c5cb7236d7/crypt/debug c227c948-b83f-44c0-9e2d-2b65237b0e8d in service 100 GiB none gzip-9 + oxp_8277a18f-3187-4893-8ef1-5cbfe2284616/crypt/debug 8ef34a90-1e48-4d2e-b49e-e84200a5143b in service 100 GiB none gzip-9 + oxp_83592889-d746-4c5d-98e8-582d9c34a15f/crypt/debug ed1845c2-e1a4-481d-b569-de693c8cf267 in service 100 GiB none gzip-9 + oxp_88e423b5-98c9-4e78-992a-5d01e1c33272/crypt/debug e3566f33-41c7-4aff-a790-adc53e2a94cc in service 100 GiB none gzip-9 + oxp_a5553017-9991-4ffb-ae37-f9c0e3428562/crypt/debug decc30a9-2c66-4bbd-9388-c711f7233f0e in service 100 GiB none gzip-9 + oxp_b2c5a75b-9f72-405a-8134-691c0f45a1fd/crypt/debug 38bc5f30-17f4-4610-b87d-918f04c859ed in service 100 GiB none gzip-9 + oxp_d4d665fc-df4d-4a13-b9c2-ad13549c0845/crypt/debug a84a2e72-8032-451a-862d-06f4eb18db24 in service 100 GiB none gzip-9 + oxp_facb28ca-94fd-47a0-bf63-ee394d32c43b/crypt/debug dd44015d-6b42-4970-9080-49267bf44c48 in service 100 GiB none gzip-9 +* oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/clickhouse_keeper 1589e72c-6719-46bf-bd6b-496eb5bdded5 - in service none none off + └─ + expunged +* oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/clickhouse_server bd823ad1-bcd2-4bfb-9f98-4080f8c5a6d0 - in service none none off + └─ + expunged +* oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone/oxz_clickhouse_keeper_0326e8e8-1d52-495e-9773-cd3fa559edbe 579beffb-3093-445a-823c-3dbd96e882ff - in service none none off + └─ + expunged +* oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone/oxz_clickhouse_server_1b6b784b-d157-4544-b7ff-6c71f3622a0f af0cfce5-065b-4444-a1aa-fe6f82ab3f3f - in service none none off + └─ + expunged ++ oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/clickhouse 3514fa60-ee1a-4917-9893-def35dd0043d in service none none off ++ oxp_288d864c-3a9e-4f21-8c6e-720702c82a29/crypt/zone/oxz_clickhouse_bf9a0f08-fd0d-480c-ae73-3d7507a52b1d 9ef55ba9-8462-424e-a0ff-d4ba686a0bca in service none none off omicron zones generation 3 -> 4: diff --git a/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_1_2.txt b/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_1_2.txt index e7357e5bbfa..c61b71d6c96 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_1_2.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_1_2.txt @@ -22,56 +22,56 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 datasets at generation 2: - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crucible 01b78855-bc58-45bd-937e-49221a71b875 none none off - oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crucible 99ddb9cf-a52c-4b59-884e-dea52e6b4f5d none none off - oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crucible 354e3bc2-e6c8-49c0-bf1d-c136e499037c none none off - oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crucible 7f36c891-2cf8-4e94-b12a-24199b83462b none none off - oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crucible 8dd12603-6cfc-42dd-8912-2a16cb7a748d none none off - oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crucible 8ff2aecd-a1e8-47bd-8001-97c3e5efb99b none none off - oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crucible dab52576-17e4-4bf8-b87e-c49983a388c2 none none off - oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crucible d2c5b427-f956-4cd1-b174-6caca3685e6f none none off - oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crucible e2e73bed-32f9-4111-803b-561cbd7faa1a none none off - oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crucible 5ba5e79d-0a13-41e5-b4d2-6c7cb468cb26 none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/clickhouse 37aac368-1b57-4934-b771-5802ae6d6606 none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/internal_dns 2f276f3f-ad8c-458e-bb62-03f5ec7643f3 none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone a8381430-0bf6-49fd-8e5a-4e7c7eb4edf4 none none off - oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crypt/zone 34fb7c7c-17c2-4cbb-af27-12b693965a4b none none off - oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crypt/zone a6f2fa57-1161-4b49-b591-2a9cd5a992f3 none none off - oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crypt/zone df22d065-beb6-45e4-984e-874dfdd3b285 none none off - oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crypt/zone 59656ee4-d86f-49ff-b4b8-39e1021642f4 none none off - oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crypt/zone ea5ee557-cc4e-4a9b-87a7-7bb9b30589da none none off - oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crypt/zone 5b0f2d79-6120-4b28-8fd6-919a121f5875 none none off - oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crypt/zone dd56b58b-871e-4f55-bcf5-0bd4e8184761 none none off - oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crypt/zone bafeb8db-cb8e-45fc-8030-3a85a26e2feb none none off - oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crypt/zone b567319c-bb7a-4ac0-a95b-20bd88c26579 none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_clickhouse_5fbb489a-141d-4de2-86c4-4fd7b9d9f315 648fecf4-8ce6-4bce-9020-789057c92f95 none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_crucible_0ce2b998-f5ad-4dc5-b2ec-5250a308506d 4fe9bcd8-399f-444e-aa01-f8cb285de102 none none off - oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crypt/zone/oxz_crucible_0e8e9f2d-291d-47fc-ba0f-84cb50e713fd ff5a6a51-2797-4016-903f-69ec69e59ef9 none none off - oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crypt/zone/oxz_crucible_11fc3b08-2470-4f1b-9187-acff1fc4c5ea 32b45c55-cc53-4635-ae2b-559821b409fe none none off - oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crypt/zone/oxz_crucible_673ecd68-d12a-46d9-9126-0a6be6245f84 0377cfc0-2bf6-4906-87f7-031121797594 none none off - oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crypt/zone/oxz_crucible_966c4f15-0aa8-4bef-95e4-49d686cffdfc 9ef1c45c-753a-4ecf-9145-72889ece2ad2 none none off - oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crypt/zone/oxz_crucible_979a7b5b-81a5-49bc-82e5-d88b6eaf7d96 b075b63e-f072-4f35-86d1-a81e50065994 none none off - oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crypt/zone/oxz_crucible_b6beadb1-351b-461d-a887-e7641d976a9e 9d2477db-7dea-4e19-b563-60a18a659cca none none off - oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crypt/zone/oxz_crucible_cf7add30-1c49-4d49-a2d2-1c46a60cd884 3b71883e-8704-468e-96fa-7b4fd85d37e8 none none off - oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crypt/zone/oxz_crucible_d0d4a23e-45fa-4f80-9bdf-a348de3f7b8f 5888130a-54bf-4358-bb1b-099347648757 none none off - oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crypt/zone/oxz_crucible_e46d1442-2a63-44e3-a6aa-e88150b85d92 c4739101-dd65-4649-8e99-e221dc9ce93e none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_crucible_pantry_45b6f382-3590-4281-b65d-083ba7aff2d3 f07a8f89-a4e1-4c71-b223-a4c09af0e443 none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_internal_dns_4fd906d8-94cd-44b3-ad5e-34b4d193bd3c 3681f68d-2840-47be-8bb7-8c7354daf8a7 none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_nexus_88602518-f176-49a1-af12-02fac36214c3 99c53b55-b716-414d-b8ff-a9d56bd9cd6c none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_ntp_b0a48e5a-e2bd-46b2-9bc6-8babbbdc0adc ed9b8ac9-88f4-46fa-8ecf-5a7534d4f020 none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/debug 97bc5b54-dd6a-4b98-b9e0-081657a3db89 100 GiB none gzip-9 - oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crypt/debug 8d054703-b940-4395-8c46-2ff519f5133a 100 GiB none gzip-9 - oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crypt/debug bb388082-2d09-4a4b-bb22-ee3f4b7b5025 100 GiB none gzip-9 - oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crypt/debug fe2005ba-7f3d-4fc3-b324-09a258fc4a4b 100 GiB none gzip-9 - oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crypt/debug e20df72b-3d75-48ad-8349-3e39cc886886 100 GiB none gzip-9 - oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crypt/debug cf2b245f-c667-49a9-bbc2-ada9a51e63f0 100 GiB none gzip-9 - oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crypt/debug 1c606d5c-ce8c-42e8-9359-d2e0fe31d525 100 GiB none gzip-9 - oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crypt/debug 1f3f9209-c380-40ab-a2f0-16ecddb6d4a8 100 GiB none gzip-9 - oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crypt/debug 89b81a7c-3bc3-455d-97e3-75067de991d5 100 GiB none gzip-9 - oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crypt/debug 1e581e94-bb9d-4514-8dbb-3a882e342d1b 100 GiB none gzip-9 + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crucible 01b78855-bc58-45bd-937e-49221a71b875 in service none none off + oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crucible 99ddb9cf-a52c-4b59-884e-dea52e6b4f5d in service none none off + oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crucible 354e3bc2-e6c8-49c0-bf1d-c136e499037c in service none none off + oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crucible 7f36c891-2cf8-4e94-b12a-24199b83462b in service none none off + oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crucible 8dd12603-6cfc-42dd-8912-2a16cb7a748d in service none none off + oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crucible 8ff2aecd-a1e8-47bd-8001-97c3e5efb99b in service none none off + oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crucible dab52576-17e4-4bf8-b87e-c49983a388c2 in service none none off + oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crucible d2c5b427-f956-4cd1-b174-6caca3685e6f in service none none off + oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crucible e2e73bed-32f9-4111-803b-561cbd7faa1a in service none none off + oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crucible 5ba5e79d-0a13-41e5-b4d2-6c7cb468cb26 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/clickhouse 37aac368-1b57-4934-b771-5802ae6d6606 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/internal_dns 2f276f3f-ad8c-458e-bb62-03f5ec7643f3 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone a8381430-0bf6-49fd-8e5a-4e7c7eb4edf4 in service none none off + oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crypt/zone 34fb7c7c-17c2-4cbb-af27-12b693965a4b in service none none off + oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crypt/zone a6f2fa57-1161-4b49-b591-2a9cd5a992f3 in service none none off + oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crypt/zone df22d065-beb6-45e4-984e-874dfdd3b285 in service none none off + oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crypt/zone 59656ee4-d86f-49ff-b4b8-39e1021642f4 in service none none off + oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crypt/zone ea5ee557-cc4e-4a9b-87a7-7bb9b30589da in service none none off + oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crypt/zone 5b0f2d79-6120-4b28-8fd6-919a121f5875 in service none none off + oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crypt/zone dd56b58b-871e-4f55-bcf5-0bd4e8184761 in service none none off + oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crypt/zone bafeb8db-cb8e-45fc-8030-3a85a26e2feb in service none none off + oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crypt/zone b567319c-bb7a-4ac0-a95b-20bd88c26579 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_clickhouse_5fbb489a-141d-4de2-86c4-4fd7b9d9f315 648fecf4-8ce6-4bce-9020-789057c92f95 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_crucible_0ce2b998-f5ad-4dc5-b2ec-5250a308506d 4fe9bcd8-399f-444e-aa01-f8cb285de102 in service none none off + oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crypt/zone/oxz_crucible_0e8e9f2d-291d-47fc-ba0f-84cb50e713fd ff5a6a51-2797-4016-903f-69ec69e59ef9 in service none none off + oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crypt/zone/oxz_crucible_11fc3b08-2470-4f1b-9187-acff1fc4c5ea 32b45c55-cc53-4635-ae2b-559821b409fe in service none none off + oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crypt/zone/oxz_crucible_673ecd68-d12a-46d9-9126-0a6be6245f84 0377cfc0-2bf6-4906-87f7-031121797594 in service none none off + oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crypt/zone/oxz_crucible_966c4f15-0aa8-4bef-95e4-49d686cffdfc 9ef1c45c-753a-4ecf-9145-72889ece2ad2 in service none none off + oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crypt/zone/oxz_crucible_979a7b5b-81a5-49bc-82e5-d88b6eaf7d96 b075b63e-f072-4f35-86d1-a81e50065994 in service none none off + oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crypt/zone/oxz_crucible_b6beadb1-351b-461d-a887-e7641d976a9e 9d2477db-7dea-4e19-b563-60a18a659cca in service none none off + oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crypt/zone/oxz_crucible_cf7add30-1c49-4d49-a2d2-1c46a60cd884 3b71883e-8704-468e-96fa-7b4fd85d37e8 in service none none off + oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crypt/zone/oxz_crucible_d0d4a23e-45fa-4f80-9bdf-a348de3f7b8f 5888130a-54bf-4358-bb1b-099347648757 in service none none off + oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crypt/zone/oxz_crucible_e46d1442-2a63-44e3-a6aa-e88150b85d92 c4739101-dd65-4649-8e99-e221dc9ce93e in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_crucible_pantry_45b6f382-3590-4281-b65d-083ba7aff2d3 f07a8f89-a4e1-4c71-b223-a4c09af0e443 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_internal_dns_4fd906d8-94cd-44b3-ad5e-34b4d193bd3c 3681f68d-2840-47be-8bb7-8c7354daf8a7 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_nexus_88602518-f176-49a1-af12-02fac36214c3 99c53b55-b716-414d-b8ff-a9d56bd9cd6c in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_ntp_b0a48e5a-e2bd-46b2-9bc6-8babbbdc0adc ed9b8ac9-88f4-46fa-8ecf-5a7534d4f020 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/debug 97bc5b54-dd6a-4b98-b9e0-081657a3db89 in service 100 GiB none gzip-9 + oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crypt/debug 8d054703-b940-4395-8c46-2ff519f5133a in service 100 GiB none gzip-9 + oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crypt/debug bb388082-2d09-4a4b-bb22-ee3f4b7b5025 in service 100 GiB none gzip-9 + oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crypt/debug fe2005ba-7f3d-4fc3-b324-09a258fc4a4b in service 100 GiB none gzip-9 + oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crypt/debug e20df72b-3d75-48ad-8349-3e39cc886886 in service 100 GiB none gzip-9 + oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crypt/debug cf2b245f-c667-49a9-bbc2-ada9a51e63f0 in service 100 GiB none gzip-9 + oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crypt/debug 1c606d5c-ce8c-42e8-9359-d2e0fe31d525 in service 100 GiB none gzip-9 + oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crypt/debug 1f3f9209-c380-40ab-a2f0-16ecddb6d4a8 in service 100 GiB none gzip-9 + oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crypt/debug 89b81a7c-3bc3-455d-97e3-75067de991d5 in service 100 GiB none gzip-9 + oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crypt/debug 1e581e94-bb9d-4514-8dbb-3a882e342d1b in service 100 GiB none gzip-9 omicron zones at generation 2: @@ -116,54 +116,54 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 datasets from generation 2: - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crucible 4393326c-f79e-497e-8539-e8268de235ae none none off -- oxp_24155070-8a43-4244-a3ba-853d8c71972d/crucible 6bcb7a19-f5e8-49a2-b2ff-35a97be53a4e none none off -- oxp_494782c7-3821-4f49-918b-ce42cc4d18ad/crucible ee61b0d0-a302-41c0-aba7-1fc4bc9c1f29 none none off -- oxp_6ea8a67f-d27d-472b-844c-6c8245b00e2b/crucible 6d5d6e6a-d1cd-4ca2-aaf9-1db561847e58 none none off -- oxp_77565d57-c235-4905-b3c7-32d1c2ca2c44/crucible 0ae3e100-879c-4aed-9671-51405148857c none none off -- oxp_8746874c-dc3b-4454-93cd-2a8fc13720fe/crucible 0e520292-0605-4508-8b87-bc9f4bdb2d17 none none off -- oxp_a42c5a67-6e10-4586-a56e-48bb8260e75f/crucible baf9409f-9730-4c3b-9969-6d0af7abfa96 none none off -- oxp_ca89b120-7bcd-4eeb-baa7-71031fbd103b/crucible 87efc84a-b983-4c40-8dcf-711348dfab9a none none off -- oxp_ef61aa97-c862-428c-82f3-0a69a50d6155/crucible 4a0fdd0e-ae77-45d3-b3b9-889898179f86 none none off -- oxp_ef64ff6d-250d-47ac-8686-e696cfb46966/crucible 84296646-39b7-4329-8c7b-83651c0501f9 none none off -- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crypt/internal_dns 50eb638f-21eb-41f1-bb0b-fc8e3adbf516 none none off -- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crypt/zone 6348353d-db1d-4016-9686-ea46eb9ffafe none none off -- oxp_24155070-8a43-4244-a3ba-853d8c71972d/crypt/zone 6760b9f3-b130-4604-8212-964507005533 none none off -- oxp_494782c7-3821-4f49-918b-ce42cc4d18ad/crypt/zone 81a147f6-4f29-490d-862f-09333e6c0331 none none off -- oxp_6ea8a67f-d27d-472b-844c-6c8245b00e2b/crypt/zone 7ba4cc5a-05d5-48f8-bf1f-c19431c02e21 none none off -- oxp_77565d57-c235-4905-b3c7-32d1c2ca2c44/crypt/zone d2b96129-68b8-428c-9041-f92a28b231d2 none none off -- oxp_8746874c-dc3b-4454-93cd-2a8fc13720fe/crypt/zone edce7c97-7d0e-4da9-9d34-86b577bb5477 none none off -- oxp_a42c5a67-6e10-4586-a56e-48bb8260e75f/crypt/zone 02c0a9a5-0b9b-4421-9643-4e8b9c5ff39e none none off -- oxp_ca89b120-7bcd-4eeb-baa7-71031fbd103b/crypt/zone ddb27eda-8f02-438d-8956-87aa3d11ae9a none none off -- oxp_ef61aa97-c862-428c-82f3-0a69a50d6155/crypt/zone 54f218fb-6023-4693-ad38-8e8fb2056a36 none none off -- oxp_ef64ff6d-250d-47ac-8686-e696cfb46966/crypt/zone c1b62139-e0fe-4458-a7fd-593d6fc0b7a0 none none off -- oxp_ef64ff6d-250d-47ac-8686-e696cfb46966/crypt/zone/oxz_crucible_085d10cb-a6f0-46de-86bc-ad2f7f1defcf e365431d-2c6b-4ab8-ac38-66bda9a09c58 none none off -- oxp_ca89b120-7bcd-4eeb-baa7-71031fbd103b/crypt/zone/oxz_crucible_2bf62dfa-537a-4616-aad5-64447faaec53 30584efb-cb2a-4446-8e92-979e1e3ad21c none none off -- oxp_6ea8a67f-d27d-472b-844c-6c8245b00e2b/crypt/zone/oxz_crucible_50d43a78-e9af-4051-9f5d-85410f44214b f165f189-8f8d-4e75-b947-8cde0b3b9d1a none none off -- oxp_a42c5a67-6e10-4586-a56e-48bb8260e75f/crypt/zone/oxz_crucible_6e7b5239-0d2e-42a5-80aa-51a3bc859318 9d9170ef-3f05-4893-a322-31d80038fcbc none none off -- oxp_494782c7-3821-4f49-918b-ce42cc4d18ad/crypt/zone/oxz_crucible_8d87b485-3fb4-480b-97ce-02d066b799d7 51767a5b-953f-4333-b123-630d38803e98 none none off -- oxp_24155070-8a43-4244-a3ba-853d8c71972d/crypt/zone/oxz_crucible_b3d757b8-033f-4a68-82db-6ff5331b9739 ac210527-730a-41a7-bb39-b5ab118b0176 none none off -- oxp_77565d57-c235-4905-b3c7-32d1c2ca2c44/crypt/zone/oxz_crucible_bcd98cf5-a798-4aa0-81cc-8972a376073c 36312983-f969-4f3e-9008-23439cfdf85b none none off -- oxp_8746874c-dc3b-4454-93cd-2a8fc13720fe/crypt/zone/oxz_crucible_bd12d9d5-bccf-433a-b078-794a69aeb89a 112c4751-37b3-4dd1-9669-9d78eb778221 none none off -- oxp_ef61aa97-c862-428c-82f3-0a69a50d6155/crypt/zone/oxz_crucible_d283707c-1b8f-4cb9-946d-041b25a83967 4a35ecb6-9930-499b-a784-7f423a7d1975 none none off -- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crypt/zone/oxz_crucible_e362415d-2d54-4574-b823-3f01b9b751de 7991a9e3-04df-42f3-9ce5-ad6d9f54a308 none none off -- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crypt/zone/oxz_crucible_pantry_208c987a-ab33-47a3-a103-6108dd6dc4cb d8a25751-04a7-4f92-920d-e4294cd0d9f5 none none off -- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crypt/zone/oxz_internal_dns_c428175e-6a1c-40bf-aa36-f608a57431f5 c9e9ec7e-68d6-4d78-88ae-144336a5f68d none none off -- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crypt/zone/oxz_nexus_533416e6-d0bd-482d-b592-29346c8a3471 e3638c01-8669-41a4-a4a6-9b981bf478ed none none off -- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crypt/zone/oxz_ntp_a8f1b53a-4231-4f04-9939-29e50a0f0e2c a943567c-1e12-48b9-80f3-a1c48242191c none none off -- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crypt/debug 3dfdb70d-6884-4143-939b-3a973ae7314e 100 GiB none gzip-9 -- oxp_24155070-8a43-4244-a3ba-853d8c71972d/crypt/debug e6fe9880-110a-4e55-8390-5a7d9205aea0 100 GiB none gzip-9 -- oxp_494782c7-3821-4f49-918b-ce42cc4d18ad/crypt/debug 730e9778-32bb-4eb9-9488-5412e8c00e9a 100 GiB none gzip-9 -- oxp_6ea8a67f-d27d-472b-844c-6c8245b00e2b/crypt/debug 38509c13-7948-4bf3-b34b-8f51862b135a 100 GiB none gzip-9 -- oxp_77565d57-c235-4905-b3c7-32d1c2ca2c44/crypt/debug aff03579-cf55-4e57-b22c-84e54788bcfe 100 GiB none gzip-9 -- oxp_8746874c-dc3b-4454-93cd-2a8fc13720fe/crypt/debug f8b506cf-c947-4579-a852-dc017f59e092 100 GiB none gzip-9 -- oxp_a42c5a67-6e10-4586-a56e-48bb8260e75f/crypt/debug 06ee31c6-5e75-444b-af7d-49695a1fbff4 100 GiB none gzip-9 -- oxp_ca89b120-7bcd-4eeb-baa7-71031fbd103b/crypt/debug 20745882-62c8-48db-a8fd-c0b0dc967897 100 GiB none gzip-9 -- oxp_ef61aa97-c862-428c-82f3-0a69a50d6155/crypt/debug a6ca9c24-86cc-4e94-b921-38c0f1c922d4 100 GiB none gzip-9 -- oxp_ef64ff6d-250d-47ac-8686-e696cfb46966/crypt/debug 5d4ce100-3838-401c-8f2e-46b5b5374115 100 GiB none gzip-9 + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crucible 4393326c-f79e-497e-8539-e8268de235ae in service none none off +- oxp_24155070-8a43-4244-a3ba-853d8c71972d/crucible 6bcb7a19-f5e8-49a2-b2ff-35a97be53a4e in service none none off +- oxp_494782c7-3821-4f49-918b-ce42cc4d18ad/crucible ee61b0d0-a302-41c0-aba7-1fc4bc9c1f29 in service none none off +- oxp_6ea8a67f-d27d-472b-844c-6c8245b00e2b/crucible 6d5d6e6a-d1cd-4ca2-aaf9-1db561847e58 in service none none off +- oxp_77565d57-c235-4905-b3c7-32d1c2ca2c44/crucible 0ae3e100-879c-4aed-9671-51405148857c in service none none off +- oxp_8746874c-dc3b-4454-93cd-2a8fc13720fe/crucible 0e520292-0605-4508-8b87-bc9f4bdb2d17 in service none none off +- oxp_a42c5a67-6e10-4586-a56e-48bb8260e75f/crucible baf9409f-9730-4c3b-9969-6d0af7abfa96 in service none none off +- oxp_ca89b120-7bcd-4eeb-baa7-71031fbd103b/crucible 87efc84a-b983-4c40-8dcf-711348dfab9a in service none none off +- oxp_ef61aa97-c862-428c-82f3-0a69a50d6155/crucible 4a0fdd0e-ae77-45d3-b3b9-889898179f86 in service none none off +- oxp_ef64ff6d-250d-47ac-8686-e696cfb46966/crucible 84296646-39b7-4329-8c7b-83651c0501f9 in service none none off +- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crypt/internal_dns 50eb638f-21eb-41f1-bb0b-fc8e3adbf516 in service none none off +- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crypt/zone 6348353d-db1d-4016-9686-ea46eb9ffafe in service none none off +- oxp_24155070-8a43-4244-a3ba-853d8c71972d/crypt/zone 6760b9f3-b130-4604-8212-964507005533 in service none none off +- oxp_494782c7-3821-4f49-918b-ce42cc4d18ad/crypt/zone 81a147f6-4f29-490d-862f-09333e6c0331 in service none none off +- oxp_6ea8a67f-d27d-472b-844c-6c8245b00e2b/crypt/zone 7ba4cc5a-05d5-48f8-bf1f-c19431c02e21 in service none none off +- oxp_77565d57-c235-4905-b3c7-32d1c2ca2c44/crypt/zone d2b96129-68b8-428c-9041-f92a28b231d2 in service none none off +- oxp_8746874c-dc3b-4454-93cd-2a8fc13720fe/crypt/zone edce7c97-7d0e-4da9-9d34-86b577bb5477 in service none none off +- oxp_a42c5a67-6e10-4586-a56e-48bb8260e75f/crypt/zone 02c0a9a5-0b9b-4421-9643-4e8b9c5ff39e in service none none off +- oxp_ca89b120-7bcd-4eeb-baa7-71031fbd103b/crypt/zone ddb27eda-8f02-438d-8956-87aa3d11ae9a in service none none off +- oxp_ef61aa97-c862-428c-82f3-0a69a50d6155/crypt/zone 54f218fb-6023-4693-ad38-8e8fb2056a36 in service none none off +- oxp_ef64ff6d-250d-47ac-8686-e696cfb46966/crypt/zone c1b62139-e0fe-4458-a7fd-593d6fc0b7a0 in service none none off +- oxp_ef64ff6d-250d-47ac-8686-e696cfb46966/crypt/zone/oxz_crucible_085d10cb-a6f0-46de-86bc-ad2f7f1defcf e365431d-2c6b-4ab8-ac38-66bda9a09c58 in service none none off +- oxp_ca89b120-7bcd-4eeb-baa7-71031fbd103b/crypt/zone/oxz_crucible_2bf62dfa-537a-4616-aad5-64447faaec53 30584efb-cb2a-4446-8e92-979e1e3ad21c in service none none off +- oxp_6ea8a67f-d27d-472b-844c-6c8245b00e2b/crypt/zone/oxz_crucible_50d43a78-e9af-4051-9f5d-85410f44214b f165f189-8f8d-4e75-b947-8cde0b3b9d1a in service none none off +- oxp_a42c5a67-6e10-4586-a56e-48bb8260e75f/crypt/zone/oxz_crucible_6e7b5239-0d2e-42a5-80aa-51a3bc859318 9d9170ef-3f05-4893-a322-31d80038fcbc in service none none off +- oxp_494782c7-3821-4f49-918b-ce42cc4d18ad/crypt/zone/oxz_crucible_8d87b485-3fb4-480b-97ce-02d066b799d7 51767a5b-953f-4333-b123-630d38803e98 in service none none off +- oxp_24155070-8a43-4244-a3ba-853d8c71972d/crypt/zone/oxz_crucible_b3d757b8-033f-4a68-82db-6ff5331b9739 ac210527-730a-41a7-bb39-b5ab118b0176 in service none none off +- oxp_77565d57-c235-4905-b3c7-32d1c2ca2c44/crypt/zone/oxz_crucible_bcd98cf5-a798-4aa0-81cc-8972a376073c 36312983-f969-4f3e-9008-23439cfdf85b in service none none off +- oxp_8746874c-dc3b-4454-93cd-2a8fc13720fe/crypt/zone/oxz_crucible_bd12d9d5-bccf-433a-b078-794a69aeb89a 112c4751-37b3-4dd1-9669-9d78eb778221 in service none none off +- oxp_ef61aa97-c862-428c-82f3-0a69a50d6155/crypt/zone/oxz_crucible_d283707c-1b8f-4cb9-946d-041b25a83967 4a35ecb6-9930-499b-a784-7f423a7d1975 in service none none off +- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crypt/zone/oxz_crucible_e362415d-2d54-4574-b823-3f01b9b751de 7991a9e3-04df-42f3-9ce5-ad6d9f54a308 in service none none off +- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crypt/zone/oxz_crucible_pantry_208c987a-ab33-47a3-a103-6108dd6dc4cb d8a25751-04a7-4f92-920d-e4294cd0d9f5 in service none none off +- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crypt/zone/oxz_internal_dns_c428175e-6a1c-40bf-aa36-f608a57431f5 c9e9ec7e-68d6-4d78-88ae-144336a5f68d in service none none off +- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crypt/zone/oxz_nexus_533416e6-d0bd-482d-b592-29346c8a3471 e3638c01-8669-41a4-a4a6-9b981bf478ed in service none none off +- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crypt/zone/oxz_ntp_a8f1b53a-4231-4f04-9939-29e50a0f0e2c a943567c-1e12-48b9-80f3-a1c48242191c in service none none off +- oxp_22930645-144a-415c-bceb-2dbfafb9c29e/crypt/debug 3dfdb70d-6884-4143-939b-3a973ae7314e in service 100 GiB none gzip-9 +- oxp_24155070-8a43-4244-a3ba-853d8c71972d/crypt/debug e6fe9880-110a-4e55-8390-5a7d9205aea0 in service 100 GiB none gzip-9 +- oxp_494782c7-3821-4f49-918b-ce42cc4d18ad/crypt/debug 730e9778-32bb-4eb9-9488-5412e8c00e9a in service 100 GiB none gzip-9 +- oxp_6ea8a67f-d27d-472b-844c-6c8245b00e2b/crypt/debug 38509c13-7948-4bf3-b34b-8f51862b135a in service 100 GiB none gzip-9 +- oxp_77565d57-c235-4905-b3c7-32d1c2ca2c44/crypt/debug aff03579-cf55-4e57-b22c-84e54788bcfe in service 100 GiB none gzip-9 +- oxp_8746874c-dc3b-4454-93cd-2a8fc13720fe/crypt/debug f8b506cf-c947-4579-a852-dc017f59e092 in service 100 GiB none gzip-9 +- oxp_a42c5a67-6e10-4586-a56e-48bb8260e75f/crypt/debug 06ee31c6-5e75-444b-af7d-49695a1fbff4 in service 100 GiB none gzip-9 +- oxp_ca89b120-7bcd-4eeb-baa7-71031fbd103b/crypt/debug 20745882-62c8-48db-a8fd-c0b0dc967897 in service 100 GiB none gzip-9 +- oxp_ef61aa97-c862-428c-82f3-0a69a50d6155/crypt/debug a6ca9c24-86cc-4e94-b921-38c0f1c922d4 in service 100 GiB none gzip-9 +- oxp_ef64ff6d-250d-47ac-8686-e696cfb46966/crypt/debug 5d4ce100-3838-401c-8f2e-46b5b5374115 in service 100 GiB none gzip-9 omicron zones generation 2 -> 3: @@ -219,54 +219,54 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 datasets from generation 2: - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crucible b77e647a-9173-499a-854a-6c0b4968b7e0 none none off -- oxp_11b8eccf-7c78-4bde-8639-b35a83082a95/crucible 58fdafab-31e5-4fa2-89c6-322e3a2b482e none none off -- oxp_1931c422-4c6a-4597-8ae7-ecb44718462c/crucible d0437bf1-8860-49d3-8fb3-da4c67a5a08b none none off -- oxp_21a8a87e-73a4-42d4-a426-f6eec94004e3/crucible 55406728-458a-4768-8c60-4bda237e5eee none none off -- oxp_222c0b55-2966-46b6-816c-9063a7587806/crucible 541775da-bd2a-47da-b3a7-0554f1b318d7 none none off -- oxp_3676f688-f41c-4f89-936a-6b04c3011b2a/crucible cf342d78-595a-4871-badc-4b4abf86df59 none none off -- oxp_5e9e14c4-d60d-4b5c-a11c-bba54eb24c9f/crucible f90acbe5-1565-4f3d-bab7-c82dbc5d88e0 none none off -- oxp_74f7b89e-88f5-4336-ba8b-22283a6966c5/crucible 572b2277-6c1c-45b7-afaa-85c6838c4fb1 none none off -- oxp_a787cac8-b5e3-49e3-aaab-20d8eadd8a63/crucible 46699296-d0e9-4fdd-bd1a-f6f7e23bf14e none none off -- oxp_d56b0c9f-0e57-43d8-a1ac-8b4d2c303c29/crucible 17e494d7-7797-4f2f-9f0e-f01340c5d20c none none off -- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crypt/internal_dns 6b3c8095-3f2e-4844-adad-58c2a9672b0f none none off -- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crypt/zone 0a15e4d5-df40-4084-b60d-cdf7ee46ab4e none none off -- oxp_11b8eccf-7c78-4bde-8639-b35a83082a95/crypt/zone 5d9f6772-bda9-4ad1-af28-06fe072d49ce none none off -- oxp_1931c422-4c6a-4597-8ae7-ecb44718462c/crypt/zone 22a21aab-ef00-4741-b1af-83628f9176ed none none off -- oxp_21a8a87e-73a4-42d4-a426-f6eec94004e3/crypt/zone 7d4d36bb-db99-44a8-9542-c18644925ecd none none off -- oxp_222c0b55-2966-46b6-816c-9063a7587806/crypt/zone d9255b0c-5115-4b4c-9a15-20b7abc6a625 none none off -- oxp_3676f688-f41c-4f89-936a-6b04c3011b2a/crypt/zone 5bd021b1-e4dd-4dfb-af5d-30a5d5fc6de6 none none off -- oxp_5e9e14c4-d60d-4b5c-a11c-bba54eb24c9f/crypt/zone 1c0a27d1-5feb-4c88-8ef5-ad438e2e337b none none off -- oxp_74f7b89e-88f5-4336-ba8b-22283a6966c5/crypt/zone 378cde4a-b2e0-4c04-8a77-c8a333b21e79 none none off -- oxp_a787cac8-b5e3-49e3-aaab-20d8eadd8a63/crypt/zone 6982b864-f299-4a0c-bc1c-b05cfd923ad4 none none off -- oxp_d56b0c9f-0e57-43d8-a1ac-8b4d2c303c29/crypt/zone 21aba03d-0506-4ded-992c-2198a9df8db8 none none off -- oxp_11b8eccf-7c78-4bde-8639-b35a83082a95/crypt/zone/oxz_crucible_258c5106-ebcd-4651-96e4-d5b0895691f6 d3b4685c-6b3c-4547-8f31-914760b52b6f none none off -- oxp_5e9e14c4-d60d-4b5c-a11c-bba54eb24c9f/crypt/zone/oxz_crucible_2b046f65-00f5-46da-988c-90c1de32a1dd 68670f81-967f-410a-89f5-5aeed7725f18 none none off -- oxp_d56b0c9f-0e57-43d8-a1ac-8b4d2c303c29/crypt/zone/oxz_crucible_30c770a8-625e-4864-8977-d83a11c1c596 bf61091c-be19-4e3c-9665-61fe5d3f984f none none off -- oxp_21a8a87e-73a4-42d4-a426-f6eec94004e3/crypt/zone/oxz_crucible_35e3587d-25d3-4234-822f-2d68713b8cbf ac9ca46f-4a0a-4cd0-ad58-e89609ebb241 none none off -- oxp_222c0b55-2966-46b6-816c-9063a7587806/crypt/zone/oxz_crucible_46293b15-fd26-48f9-9ccb-122fa0ef41b4 d406c3ce-a277-42c2-beac-9fe311e7a2f9 none none off -- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crypt/zone/oxz_crucible_462c6b8d-1872-4671-b84a-bdcbb69e3baf 83c9535d-cf93-440a-bfda-e7d17d5ad31e none none off -- oxp_1931c422-4c6a-4597-8ae7-ecb44718462c/crypt/zone/oxz_crucible_a046c5f9-25e7-47c3-9c67-43d68fb39c5e e485343e-cf15-4484-82eb-7913b388cdf0 none none off -- oxp_a787cac8-b5e3-49e3-aaab-20d8eadd8a63/crypt/zone/oxz_crucible_a49d4037-506e-4732-8e21-1f8c136a3c17 45e58d60-6bb9-4bc0-a925-a13952eef7bb none none off -- oxp_74f7b89e-88f5-4336-ba8b-22283a6966c5/crypt/zone/oxz_crucible_df94dc9a-74d9-43a9-8879-199740665f29 1db67d8d-5443-4304-a4fc-22ee0ecf9a14 none none off -- oxp_3676f688-f41c-4f89-936a-6b04c3011b2a/crypt/zone/oxz_crucible_f1622981-7f0b-4a9f-9a70-6b46ab9d5e86 8d49a774-0f12-41ad-acd5-2853553044e4 none none off -- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crypt/zone/oxz_crucible_pantry_b217d3a5-4ebb-45e3-b5be-2ebb2c57d8fa 03429538-a04b-453e-85e0-4495f18d80c9 none none off -- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crypt/zone/oxz_internal_dns_0efed95e-f052-4535-b45a-fac1148c0e6a 0be7365d-2d85-4d99-a186-e404eb93ef59 none none off -- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crypt/zone/oxz_nexus_ee146b15-bc59-43a3-9567-bb8596e6188d 14cd103e-65f0-42f6-a03d-c03b1e865b4c none none off -- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crypt/zone/oxz_ntp_61a79cb4-7fcb-432d-bbe9-3f9882452db2 0af1fd16-7dde-4bf5-8da6-dceb05bf4aef none none off -- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crypt/debug 455486dc-8ab4-4405-99fc-862d6dbfcda3 100 GiB none gzip-9 -- oxp_11b8eccf-7c78-4bde-8639-b35a83082a95/crypt/debug de5f06bb-1d18-4dec-b8ca-e0947efd7605 100 GiB none gzip-9 -- oxp_1931c422-4c6a-4597-8ae7-ecb44718462c/crypt/debug 000775a7-f52a-4b4c-845e-f9ec8b27e32c 100 GiB none gzip-9 -- oxp_21a8a87e-73a4-42d4-a426-f6eec94004e3/crypt/debug cd6d3991-5be5-49e3-8d2d-b0a29acc479c 100 GiB none gzip-9 -- oxp_222c0b55-2966-46b6-816c-9063a7587806/crypt/debug 5cfe962a-ff3d-4ab7-8c1b-8979dba15bb0 100 GiB none gzip-9 -- oxp_3676f688-f41c-4f89-936a-6b04c3011b2a/crypt/debug 0d918a12-c470-472e-9711-7e79ddd9b90b 100 GiB none gzip-9 -- oxp_5e9e14c4-d60d-4b5c-a11c-bba54eb24c9f/crypt/debug 56d77912-628f-4a06-8e60-ae83e0bd7292 100 GiB none gzip-9 -- oxp_74f7b89e-88f5-4336-ba8b-22283a6966c5/crypt/debug 54b2745f-9c22-4407-858e-31ea0c9db415 100 GiB none gzip-9 -- oxp_a787cac8-b5e3-49e3-aaab-20d8eadd8a63/crypt/debug 69c359cd-15e4-485f-8f32-e84c1a19eec8 100 GiB none gzip-9 -- oxp_d56b0c9f-0e57-43d8-a1ac-8b4d2c303c29/crypt/debug 34d0a7d0-56f8-4a8e-9e71-657c9ebc71f3 100 GiB none gzip-9 + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crucible b77e647a-9173-499a-854a-6c0b4968b7e0 in service none none off +- oxp_11b8eccf-7c78-4bde-8639-b35a83082a95/crucible 58fdafab-31e5-4fa2-89c6-322e3a2b482e in service none none off +- oxp_1931c422-4c6a-4597-8ae7-ecb44718462c/crucible d0437bf1-8860-49d3-8fb3-da4c67a5a08b in service none none off +- oxp_21a8a87e-73a4-42d4-a426-f6eec94004e3/crucible 55406728-458a-4768-8c60-4bda237e5eee in service none none off +- oxp_222c0b55-2966-46b6-816c-9063a7587806/crucible 541775da-bd2a-47da-b3a7-0554f1b318d7 in service none none off +- oxp_3676f688-f41c-4f89-936a-6b04c3011b2a/crucible cf342d78-595a-4871-badc-4b4abf86df59 in service none none off +- oxp_5e9e14c4-d60d-4b5c-a11c-bba54eb24c9f/crucible f90acbe5-1565-4f3d-bab7-c82dbc5d88e0 in service none none off +- oxp_74f7b89e-88f5-4336-ba8b-22283a6966c5/crucible 572b2277-6c1c-45b7-afaa-85c6838c4fb1 in service none none off +- oxp_a787cac8-b5e3-49e3-aaab-20d8eadd8a63/crucible 46699296-d0e9-4fdd-bd1a-f6f7e23bf14e in service none none off +- oxp_d56b0c9f-0e57-43d8-a1ac-8b4d2c303c29/crucible 17e494d7-7797-4f2f-9f0e-f01340c5d20c in service none none off +- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crypt/internal_dns 6b3c8095-3f2e-4844-adad-58c2a9672b0f in service none none off +- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crypt/zone 0a15e4d5-df40-4084-b60d-cdf7ee46ab4e in service none none off +- oxp_11b8eccf-7c78-4bde-8639-b35a83082a95/crypt/zone 5d9f6772-bda9-4ad1-af28-06fe072d49ce in service none none off +- oxp_1931c422-4c6a-4597-8ae7-ecb44718462c/crypt/zone 22a21aab-ef00-4741-b1af-83628f9176ed in service none none off +- oxp_21a8a87e-73a4-42d4-a426-f6eec94004e3/crypt/zone 7d4d36bb-db99-44a8-9542-c18644925ecd in service none none off +- oxp_222c0b55-2966-46b6-816c-9063a7587806/crypt/zone d9255b0c-5115-4b4c-9a15-20b7abc6a625 in service none none off +- oxp_3676f688-f41c-4f89-936a-6b04c3011b2a/crypt/zone 5bd021b1-e4dd-4dfb-af5d-30a5d5fc6de6 in service none none off +- oxp_5e9e14c4-d60d-4b5c-a11c-bba54eb24c9f/crypt/zone 1c0a27d1-5feb-4c88-8ef5-ad438e2e337b in service none none off +- oxp_74f7b89e-88f5-4336-ba8b-22283a6966c5/crypt/zone 378cde4a-b2e0-4c04-8a77-c8a333b21e79 in service none none off +- oxp_a787cac8-b5e3-49e3-aaab-20d8eadd8a63/crypt/zone 6982b864-f299-4a0c-bc1c-b05cfd923ad4 in service none none off +- oxp_d56b0c9f-0e57-43d8-a1ac-8b4d2c303c29/crypt/zone 21aba03d-0506-4ded-992c-2198a9df8db8 in service none none off +- oxp_11b8eccf-7c78-4bde-8639-b35a83082a95/crypt/zone/oxz_crucible_258c5106-ebcd-4651-96e4-d5b0895691f6 d3b4685c-6b3c-4547-8f31-914760b52b6f in service none none off +- oxp_5e9e14c4-d60d-4b5c-a11c-bba54eb24c9f/crypt/zone/oxz_crucible_2b046f65-00f5-46da-988c-90c1de32a1dd 68670f81-967f-410a-89f5-5aeed7725f18 in service none none off +- oxp_d56b0c9f-0e57-43d8-a1ac-8b4d2c303c29/crypt/zone/oxz_crucible_30c770a8-625e-4864-8977-d83a11c1c596 bf61091c-be19-4e3c-9665-61fe5d3f984f in service none none off +- oxp_21a8a87e-73a4-42d4-a426-f6eec94004e3/crypt/zone/oxz_crucible_35e3587d-25d3-4234-822f-2d68713b8cbf ac9ca46f-4a0a-4cd0-ad58-e89609ebb241 in service none none off +- oxp_222c0b55-2966-46b6-816c-9063a7587806/crypt/zone/oxz_crucible_46293b15-fd26-48f9-9ccb-122fa0ef41b4 d406c3ce-a277-42c2-beac-9fe311e7a2f9 in service none none off +- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crypt/zone/oxz_crucible_462c6b8d-1872-4671-b84a-bdcbb69e3baf 83c9535d-cf93-440a-bfda-e7d17d5ad31e in service none none off +- oxp_1931c422-4c6a-4597-8ae7-ecb44718462c/crypt/zone/oxz_crucible_a046c5f9-25e7-47c3-9c67-43d68fb39c5e e485343e-cf15-4484-82eb-7913b388cdf0 in service none none off +- oxp_a787cac8-b5e3-49e3-aaab-20d8eadd8a63/crypt/zone/oxz_crucible_a49d4037-506e-4732-8e21-1f8c136a3c17 45e58d60-6bb9-4bc0-a925-a13952eef7bb in service none none off +- oxp_74f7b89e-88f5-4336-ba8b-22283a6966c5/crypt/zone/oxz_crucible_df94dc9a-74d9-43a9-8879-199740665f29 1db67d8d-5443-4304-a4fc-22ee0ecf9a14 in service none none off +- oxp_3676f688-f41c-4f89-936a-6b04c3011b2a/crypt/zone/oxz_crucible_f1622981-7f0b-4a9f-9a70-6b46ab9d5e86 8d49a774-0f12-41ad-acd5-2853553044e4 in service none none off +- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crypt/zone/oxz_crucible_pantry_b217d3a5-4ebb-45e3-b5be-2ebb2c57d8fa 03429538-a04b-453e-85e0-4495f18d80c9 in service none none off +- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crypt/zone/oxz_internal_dns_0efed95e-f052-4535-b45a-fac1148c0e6a 0be7365d-2d85-4d99-a186-e404eb93ef59 in service none none off +- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crypt/zone/oxz_nexus_ee146b15-bc59-43a3-9567-bb8596e6188d 14cd103e-65f0-42f6-a03d-c03b1e865b4c in service none none off +- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crypt/zone/oxz_ntp_61a79cb4-7fcb-432d-bbe9-3f9882452db2 0af1fd16-7dde-4bf5-8da6-dceb05bf4aef in service none none off +- oxp_09a5de95-c15f-486e-b776-fca62bf5e179/crypt/debug 455486dc-8ab4-4405-99fc-862d6dbfcda3 in service 100 GiB none gzip-9 +- oxp_11b8eccf-7c78-4bde-8639-b35a83082a95/crypt/debug de5f06bb-1d18-4dec-b8ca-e0947efd7605 in service 100 GiB none gzip-9 +- oxp_1931c422-4c6a-4597-8ae7-ecb44718462c/crypt/debug 000775a7-f52a-4b4c-845e-f9ec8b27e32c in service 100 GiB none gzip-9 +- oxp_21a8a87e-73a4-42d4-a426-f6eec94004e3/crypt/debug cd6d3991-5be5-49e3-8d2d-b0a29acc479c in service 100 GiB none gzip-9 +- oxp_222c0b55-2966-46b6-816c-9063a7587806/crypt/debug 5cfe962a-ff3d-4ab7-8c1b-8979dba15bb0 in service 100 GiB none gzip-9 +- oxp_3676f688-f41c-4f89-936a-6b04c3011b2a/crypt/debug 0d918a12-c470-472e-9711-7e79ddd9b90b in service 100 GiB none gzip-9 +- oxp_5e9e14c4-d60d-4b5c-a11c-bba54eb24c9f/crypt/debug 56d77912-628f-4a06-8e60-ae83e0bd7292 in service 100 GiB none gzip-9 +- oxp_74f7b89e-88f5-4336-ba8b-22283a6966c5/crypt/debug 54b2745f-9c22-4407-858e-31ea0c9db415 in service 100 GiB none gzip-9 +- oxp_a787cac8-b5e3-49e3-aaab-20d8eadd8a63/crypt/debug 69c359cd-15e4-485f-8f32-e84c1a19eec8 in service 100 GiB none gzip-9 +- oxp_d56b0c9f-0e57-43d8-a1ac-8b4d2c303c29/crypt/debug 34d0a7d0-56f8-4a8e-9e71-657c9ebc71f3 in service 100 GiB none gzip-9 omicron zones at generation 2: @@ -308,54 +308,54 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 datasets generation 2 -> 3: - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crucible 081aff15-bc64-4b57-bbcc-287d7267caa4 none none off - oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crucible 0beeebcf-b558-47e9-9274-bc3dd4a475b8 none none off - oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crucible 757dd9e5-74db-4860-a87e-0aafd6795b91 none none off - oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crucible bd64099e-57f0-447f-9c21-e493e2809372 none none off - oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crucible 3bd0565c-1170-4727-824b-f180454e4ff1 none none off - oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crucible 010c6c12-6ea3-4bbd-9a69-90209dab73ab none none off - oxp_a5f75431-3795-426c-8f80-176f658281a5/crucible 2dbc8272-64ae-4d2d-ac1f-92f120204ddd none none off - oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crucible b4e4e724-ddfb-4d0a-bf6b-edd6dd91172d none none off - oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crucible 8fdfaea0-1da2-429f-b64e-ef0107f2884d none none off - oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crucible 74dc30b1-2c84-4e9d-910c-938d33f9a537 none none off - oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone f282431f-2ed2-4386-bc0f-0f3130b175bf none none off - oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/zone ee3f0e38-23ac-45c6-8157-e611887572a6 none none off - oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/zone acf672d0-effd-491a-bde8-a4253e078f14 none none off - oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/zone d5be658f-367a-4703-a377-7d8067aade3a none none off - oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crypt/zone adbebdd0-4d0d-4794-9bb5-6681b5119624 none none off - oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crypt/zone 1e063fbb-083c-4e2e-a4f5-c40ce854f1d0 none none off - oxp_a5f75431-3795-426c-8f80-176f658281a5/crypt/zone 6b476700-d002-4173-8a83-fb24d49be32f none none off - oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crypt/zone abaa13f5-c3ec-45b2-86da-2be74a259878 none none off - oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crypt/zone d8c2da98-ef6d-4746-ae4b-ed537c78fc89 none none off - oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crypt/zone b1c8156e-7490-46d2-a4af-7fc5dd39991d none none off - oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/zone/oxz_crucible_05ba6d6e-90a7-402a-aaba-fd92190a9f48 6a6e744c-c4a9-4e58-b0ed-ef44eef0c6e0 none none off - oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crypt/zone/oxz_crucible_2097bad3-ee65-4a1c-8fe2-75ed52e69ac8 54941545-0cee-4c36-8516-c63b3cbd02fb none none off - oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone/oxz_crucible_430c8fe1-7296-4a73-b260-fc185260ec5e d0ee4ede-c9a6-4d6a-9dbe-63b4c07a9cdd none none off - oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crypt/zone/oxz_crucible_a720288d-3e5b-44b7-9dab-a69a10768e0b 3fa16efe-c488-4d45-92ee-18eeb8b9453f none none off - oxp_a5f75431-3795-426c-8f80-176f658281a5/crypt/zone/oxz_crucible_b2170eef-aa6f-4ec5-aaa9-2b4289eae65c e20a6e28-7a52-480a-9d36-33f8d4474bf5 none none off - oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crypt/zone/oxz_crucible_b505d6e1-07b9-48bf-bc8a-d4081c25b12a 6b965329-4398-4738-84e6-b893f21a724c none none off - oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/zone/oxz_crucible_cbe34d65-017e-4c26-966d-b1ce27bc1d94 8ad4a9ed-7be5-4f49-8a38-1686144ceaf6 none none off - oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crypt/zone/oxz_crucible_e01462d1-5173-4d95-8477-78ca2157efbb 03fbd010-e16e-48a9-a9a9-5be665c0bdff none none off - oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/zone/oxz_crucible_e49b0403-3d7c-480f-9113-4bc0fca74a8a 62053fe9-281c-4949-9357-bf818004aef2 none none off - oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crypt/zone/oxz_crucible_e6ec9399-b81b-4bdd-8e6e-b0f043aad942 f761d5be-fef1-47d7-850c-1f28a1f8a8b3 none none off - oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone/oxz_nexus_81f79040-bcf7-4eff-9a87-8e7bcb5a6db9 2694f256-cd46-4841-a009-6460f4ca0616 none none off - oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone/oxz_ntp_8f94a160-67ab-4ed5-bc3f-01e19fdd7e9b 225c385b-de3e-4262-a5c4-0250abc910f9 none none off - oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/debug 041c4e17-e958-41aa-b621-03dd3b3e7da8 100 GiB none gzip-9 - oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/debug 7e551f2b-ac22-4637-bd2a-188f106b57c0 100 GiB none gzip-9 - oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/debug 1e4208d8-041e-49eb-ab6d-dcedceee170c 100 GiB none gzip-9 - oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/debug 0872720b-c454-45f6-8816-2835d595894e 100 GiB none gzip-9 - oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crypt/debug fc7195f4-4472-4283-9094-2f6f7db01e71 100 GiB none gzip-9 - oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crypt/debug baa19cce-f379-427c-9b5e-c413b050c2d5 100 GiB none gzip-9 - oxp_a5f75431-3795-426c-8f80-176f658281a5/crypt/debug 5828eb26-b03b-4481-b88d-027a90a24c50 100 GiB none gzip-9 - oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crypt/debug 5e7deb25-14c2-4633-8728-6eff7833e14f 100 GiB none gzip-9 - oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crypt/debug e02c1929-a38a-49c2-8909-555c3e046d18 100 GiB none gzip-9 - oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crypt/debug 0aeb1237-4ad7-41ae-abd2-45789a3ab2f2 100 GiB none gzip-9 -+ oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/zone/oxz_nexus_2ed23118-6137-45ca-824c-04df3bc3d085 047b92e1-2286-44bb-988e-403f20973ee4 none none off -+ oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/zone/oxz_nexus_33365de5-8a83-46c0-9d34-eddd68e54c6f 4f6d72db-de32-4a55-ae9d-30d776580c33 none none off -+ oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/zone/oxz_nexus_80e4964b-a8c8-41ef-ae23-f86cfe5f3a7b 6944260c-23fd-47db-8a2c-02196b399f57 none none off + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crucible 081aff15-bc64-4b57-bbcc-287d7267caa4 in service none none off + oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crucible 0beeebcf-b558-47e9-9274-bc3dd4a475b8 in service none none off + oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crucible 757dd9e5-74db-4860-a87e-0aafd6795b91 in service none none off + oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crucible bd64099e-57f0-447f-9c21-e493e2809372 in service none none off + oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crucible 3bd0565c-1170-4727-824b-f180454e4ff1 in service none none off + oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crucible 010c6c12-6ea3-4bbd-9a69-90209dab73ab in service none none off + oxp_a5f75431-3795-426c-8f80-176f658281a5/crucible 2dbc8272-64ae-4d2d-ac1f-92f120204ddd in service none none off + oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crucible b4e4e724-ddfb-4d0a-bf6b-edd6dd91172d in service none none off + oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crucible 8fdfaea0-1da2-429f-b64e-ef0107f2884d in service none none off + oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crucible 74dc30b1-2c84-4e9d-910c-938d33f9a537 in service none none off + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone f282431f-2ed2-4386-bc0f-0f3130b175bf in service none none off + oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/zone ee3f0e38-23ac-45c6-8157-e611887572a6 in service none none off + oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/zone acf672d0-effd-491a-bde8-a4253e078f14 in service none none off + oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/zone d5be658f-367a-4703-a377-7d8067aade3a in service none none off + oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crypt/zone adbebdd0-4d0d-4794-9bb5-6681b5119624 in service none none off + oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crypt/zone 1e063fbb-083c-4e2e-a4f5-c40ce854f1d0 in service none none off + oxp_a5f75431-3795-426c-8f80-176f658281a5/crypt/zone 6b476700-d002-4173-8a83-fb24d49be32f in service none none off + oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crypt/zone abaa13f5-c3ec-45b2-86da-2be74a259878 in service none none off + oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crypt/zone d8c2da98-ef6d-4746-ae4b-ed537c78fc89 in service none none off + oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crypt/zone b1c8156e-7490-46d2-a4af-7fc5dd39991d in service none none off + oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/zone/oxz_crucible_05ba6d6e-90a7-402a-aaba-fd92190a9f48 6a6e744c-c4a9-4e58-b0ed-ef44eef0c6e0 in service none none off + oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crypt/zone/oxz_crucible_2097bad3-ee65-4a1c-8fe2-75ed52e69ac8 54941545-0cee-4c36-8516-c63b3cbd02fb in service none none off + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone/oxz_crucible_430c8fe1-7296-4a73-b260-fc185260ec5e d0ee4ede-c9a6-4d6a-9dbe-63b4c07a9cdd in service none none off + oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crypt/zone/oxz_crucible_a720288d-3e5b-44b7-9dab-a69a10768e0b 3fa16efe-c488-4d45-92ee-18eeb8b9453f in service none none off + oxp_a5f75431-3795-426c-8f80-176f658281a5/crypt/zone/oxz_crucible_b2170eef-aa6f-4ec5-aaa9-2b4289eae65c e20a6e28-7a52-480a-9d36-33f8d4474bf5 in service none none off + oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crypt/zone/oxz_crucible_b505d6e1-07b9-48bf-bc8a-d4081c25b12a 6b965329-4398-4738-84e6-b893f21a724c in service none none off + oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/zone/oxz_crucible_cbe34d65-017e-4c26-966d-b1ce27bc1d94 8ad4a9ed-7be5-4f49-8a38-1686144ceaf6 in service none none off + oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crypt/zone/oxz_crucible_e01462d1-5173-4d95-8477-78ca2157efbb 03fbd010-e16e-48a9-a9a9-5be665c0bdff in service none none off + oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/zone/oxz_crucible_e49b0403-3d7c-480f-9113-4bc0fca74a8a 62053fe9-281c-4949-9357-bf818004aef2 in service none none off + oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crypt/zone/oxz_crucible_e6ec9399-b81b-4bdd-8e6e-b0f043aad942 f761d5be-fef1-47d7-850c-1f28a1f8a8b3 in service none none off + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone/oxz_nexus_81f79040-bcf7-4eff-9a87-8e7bcb5a6db9 2694f256-cd46-4841-a009-6460f4ca0616 in service none none off + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone/oxz_ntp_8f94a160-67ab-4ed5-bc3f-01e19fdd7e9b 225c385b-de3e-4262-a5c4-0250abc910f9 in service none none off + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/debug 041c4e17-e958-41aa-b621-03dd3b3e7da8 in service 100 GiB none gzip-9 + oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/debug 7e551f2b-ac22-4637-bd2a-188f106b57c0 in service 100 GiB none gzip-9 + oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/debug 1e4208d8-041e-49eb-ab6d-dcedceee170c in service 100 GiB none gzip-9 + oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/debug 0872720b-c454-45f6-8816-2835d595894e in service 100 GiB none gzip-9 + oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crypt/debug fc7195f4-4472-4283-9094-2f6f7db01e71 in service 100 GiB none gzip-9 + oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crypt/debug baa19cce-f379-427c-9b5e-c413b050c2d5 in service 100 GiB none gzip-9 + oxp_a5f75431-3795-426c-8f80-176f658281a5/crypt/debug 5828eb26-b03b-4481-b88d-027a90a24c50 in service 100 GiB none gzip-9 + oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crypt/debug 5e7deb25-14c2-4633-8728-6eff7833e14f in service 100 GiB none gzip-9 + oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crypt/debug e02c1929-a38a-49c2-8909-555c3e046d18 in service 100 GiB none gzip-9 + oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crypt/debug 0aeb1237-4ad7-41ae-abd2-45789a3ab2f2 in service 100 GiB none gzip-9 ++ oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/zone/oxz_nexus_2ed23118-6137-45ca-824c-04df3bc3d085 047b92e1-2286-44bb-988e-403f20973ee4 in service none none off ++ oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/zone/oxz_nexus_33365de5-8a83-46c0-9d34-eddd68e54c6f 4f6d72db-de32-4a55-ae9d-30d776580c33 in service none none off ++ oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/zone/oxz_nexus_80e4964b-a8c8-41ef-ae23-f86cfe5f3a7b 6944260c-23fd-47db-8a2c-02196b399f57 in service none none off omicron zones generation 2 -> 3: @@ -398,54 +398,54 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 datasets generation 2 -> 3: - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crucible e7187a07-3759-4185-8893-36b01e1a7295 none none off - oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crucible f9901e16-a9e4-4c49-a3b9-464405830043 none none off - oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crucible 024a9e5e-f8a8-4b8f-b75e-5b05509fa69a none none off - oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crucible 22547c0a-a710-4d4c-8984-32445fbf993b none none off - oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crucible dec5883c-1abd-4425-8cc4-b2f57c85cdd4 none none off - oxp_789d607d-d196-428e-a988-f7886a327859/crucible fda176fb-2cea-4646-8601-8d719bcdbda0 none none off - oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crucible 4ded36d4-7e98-47fe-a0f4-c580e7d1eb21 none none off - oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crucible 623c87b5-8848-4e42-aa5e-6e706e11cf63 none none off - oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crucible e98d07df-27a8-4868-a3f9-066ac235516c none none off - oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crucible 639c96d6-265a-45dc-b03f-c145d2ea8c43 none none off - oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone 64c4eb2e-82bf-450c-9379-594af3a4794b none none off - oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/zone f6c13b9c-4e22-448d-b7b8-04652f06423c none none off - oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/zone a15671b5-d3f3-43d9-b143-81bcd5170edf none none off - oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/zone dd78cd99-4aa3-4946-b4c3-b9fad49c6da6 none none off - oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crypt/zone 1c30ecb3-32ba-49e7-a3dd-771a75d38c3a none none off - oxp_789d607d-d196-428e-a988-f7886a327859/crypt/zone 7ac707a2-5bcf-49d1-88eb-1c09841082cf none none off - oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crypt/zone b0d96454-0a1d-47ac-9a13-5c4866131c37 none none off - oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crypt/zone 082509f2-115a-4a71-b8f8-86be21efc081 none none off - oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crypt/zone 01b79cba-881c-4bda-a48d-baaef2fcb122 none none off - oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crypt/zone 32d3d763-0665-4945-a3d0-e3d862f7a718 none none off - oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crypt/zone/oxz_crucible_1b38728b-8552-435b-b621-359ba20d465b c02c8635-e2f5-4974-a8b9-f4fdfe231365 none none off - oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/zone/oxz_crucible_31c42e26-3cdf-41a8-8826-ce71a513ed04 4876b95c-457b-4e81-9a04-ca1319429627 none none off - oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crypt/zone/oxz_crucible_4f38e475-396a-4650-a49c-c3cc4acc3ab9 2aff7d20-2a2b-4ded-9e03-eb0d72d29e35 none none off - oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crypt/zone/oxz_crucible_5cd47e9f-1faf-4afd-970a-18b9076b3407 686fcd72-5da5-4f8c-a740-88866e30b8da none none off - oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crypt/zone/oxz_crucible_768ab86c-d5d2-4734-a381-02df1032d5e9 d1bbe8aa-aeda-496b-93cd-f330f85da352 none none off - oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/zone/oxz_crucible_abbf71e1-6568-42cf-9526-7e31549ba934 782adc3d-3a2f-400d-a6ce-531edc8cf546 none none off - oxp_789d607d-d196-428e-a988-f7886a327859/crypt/zone/oxz_crucible_e37d04f9-ed3f-4665-800e-b51ba7d5d306 6c55265b-7515-4259-adf1-ac07f847c2fb none none off - oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone/oxz_crucible_e6c28c27-39d2-4aec-bf34-5d9f6b3cbd7f 803ed7a0-bb24-489f-8737-b01ff28e3278 none none off - oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crypt/zone/oxz_crucible_f19f884a-3e97-458d-b8fb-533882750cd6 b1044d62-0afd-473e-8719-ca3ecb57d801 none none off - oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/zone/oxz_crucible_f54c359e-a980-4996-9462-25a548d96265 518e80f5-3074-44ec-8da3-ea64f3c0ad3e none none off - oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone/oxz_nexus_b854f752-383d-4e0b-8557-8c62d22ba994 537edbee-609e-40df-9a10-4c6f57c5f15f none none off - oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone/oxz_ntp_706286e2-8b09-42ff-9841-eaef65635eee 617a44e3-250b-4db1-a8e7-e42da46a0a0f none none off - oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/debug 856e98db-f5c6-4cbd-a8ad-c02f59f207d7 100 GiB none gzip-9 - oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/debug f14ef549-31db-4fae-a540-3a50f0fba233 100 GiB none gzip-9 - oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/debug e44949f2-403b-4944-b966-de77d4b9365c 100 GiB none gzip-9 - oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/debug 425255d5-c1e8-44eb-855f-fe1770e83362 100 GiB none gzip-9 - oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crypt/debug dc613555-a790-45af-9af4-0127d376f3c6 100 GiB none gzip-9 - oxp_789d607d-d196-428e-a988-f7886a327859/crypt/debug 4f359243-9639-431f-a0d1-5b2f2d6b5b0d 100 GiB none gzip-9 - oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crypt/debug 1315d3d7-e347-4e68-8381-8c010be44ef0 100 GiB none gzip-9 - oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crypt/debug 0e8321af-4634-4d31-aa79-145f8e171674 100 GiB none gzip-9 - oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crypt/debug 5a0f4402-7d87-4b6b-b4d2-72f48000627c 100 GiB none gzip-9 - oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crypt/debug a2120fee-01bd-4f49-8c58-720384b1cbde 100 GiB none gzip-9 -+ oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/zone/oxz_nexus_b539cea9-c37c-49ef-874f-170d898187b2 113c40a7-e9fd-492f-814e-528db4fd0e83 none none off -+ oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/zone/oxz_nexus_c5a0c592-319e-44df-9d00-1ddb1d5ad6aa 61e536fd-043c-4741-aed7-640d18d32b26 none none off -+ oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/zone/oxz_nexus_cab211e1-3ab1-475f-81fa-984748044d8c 92f259d0-cda4-44e4-bb22-8b82d025d502 none none off + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crucible e7187a07-3759-4185-8893-36b01e1a7295 in service none none off + oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crucible f9901e16-a9e4-4c49-a3b9-464405830043 in service none none off + oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crucible 024a9e5e-f8a8-4b8f-b75e-5b05509fa69a in service none none off + oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crucible 22547c0a-a710-4d4c-8984-32445fbf993b in service none none off + oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crucible dec5883c-1abd-4425-8cc4-b2f57c85cdd4 in service none none off + oxp_789d607d-d196-428e-a988-f7886a327859/crucible fda176fb-2cea-4646-8601-8d719bcdbda0 in service none none off + oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crucible 4ded36d4-7e98-47fe-a0f4-c580e7d1eb21 in service none none off + oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crucible 623c87b5-8848-4e42-aa5e-6e706e11cf63 in service none none off + oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crucible e98d07df-27a8-4868-a3f9-066ac235516c in service none none off + oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crucible 639c96d6-265a-45dc-b03f-c145d2ea8c43 in service none none off + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone 64c4eb2e-82bf-450c-9379-594af3a4794b in service none none off + oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/zone f6c13b9c-4e22-448d-b7b8-04652f06423c in service none none off + oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/zone a15671b5-d3f3-43d9-b143-81bcd5170edf in service none none off + oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/zone dd78cd99-4aa3-4946-b4c3-b9fad49c6da6 in service none none off + oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crypt/zone 1c30ecb3-32ba-49e7-a3dd-771a75d38c3a in service none none off + oxp_789d607d-d196-428e-a988-f7886a327859/crypt/zone 7ac707a2-5bcf-49d1-88eb-1c09841082cf in service none none off + oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crypt/zone b0d96454-0a1d-47ac-9a13-5c4866131c37 in service none none off + oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crypt/zone 082509f2-115a-4a71-b8f8-86be21efc081 in service none none off + oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crypt/zone 01b79cba-881c-4bda-a48d-baaef2fcb122 in service none none off + oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crypt/zone 32d3d763-0665-4945-a3d0-e3d862f7a718 in service none none off + oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crypt/zone/oxz_crucible_1b38728b-8552-435b-b621-359ba20d465b c02c8635-e2f5-4974-a8b9-f4fdfe231365 in service none none off + oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/zone/oxz_crucible_31c42e26-3cdf-41a8-8826-ce71a513ed04 4876b95c-457b-4e81-9a04-ca1319429627 in service none none off + oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crypt/zone/oxz_crucible_4f38e475-396a-4650-a49c-c3cc4acc3ab9 2aff7d20-2a2b-4ded-9e03-eb0d72d29e35 in service none none off + oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crypt/zone/oxz_crucible_5cd47e9f-1faf-4afd-970a-18b9076b3407 686fcd72-5da5-4f8c-a740-88866e30b8da in service none none off + oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crypt/zone/oxz_crucible_768ab86c-d5d2-4734-a381-02df1032d5e9 d1bbe8aa-aeda-496b-93cd-f330f85da352 in service none none off + oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/zone/oxz_crucible_abbf71e1-6568-42cf-9526-7e31549ba934 782adc3d-3a2f-400d-a6ce-531edc8cf546 in service none none off + oxp_789d607d-d196-428e-a988-f7886a327859/crypt/zone/oxz_crucible_e37d04f9-ed3f-4665-800e-b51ba7d5d306 6c55265b-7515-4259-adf1-ac07f847c2fb in service none none off + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone/oxz_crucible_e6c28c27-39d2-4aec-bf34-5d9f6b3cbd7f 803ed7a0-bb24-489f-8737-b01ff28e3278 in service none none off + oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crypt/zone/oxz_crucible_f19f884a-3e97-458d-b8fb-533882750cd6 b1044d62-0afd-473e-8719-ca3ecb57d801 in service none none off + oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/zone/oxz_crucible_f54c359e-a980-4996-9462-25a548d96265 518e80f5-3074-44ec-8da3-ea64f3c0ad3e in service none none off + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone/oxz_nexus_b854f752-383d-4e0b-8557-8c62d22ba994 537edbee-609e-40df-9a10-4c6f57c5f15f in service none none off + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone/oxz_ntp_706286e2-8b09-42ff-9841-eaef65635eee 617a44e3-250b-4db1-a8e7-e42da46a0a0f in service none none off + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/debug 856e98db-f5c6-4cbd-a8ad-c02f59f207d7 in service 100 GiB none gzip-9 + oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/debug f14ef549-31db-4fae-a540-3a50f0fba233 in service 100 GiB none gzip-9 + oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/debug e44949f2-403b-4944-b966-de77d4b9365c in service 100 GiB none gzip-9 + oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/debug 425255d5-c1e8-44eb-855f-fe1770e83362 in service 100 GiB none gzip-9 + oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crypt/debug dc613555-a790-45af-9af4-0127d376f3c6 in service 100 GiB none gzip-9 + oxp_789d607d-d196-428e-a988-f7886a327859/crypt/debug 4f359243-9639-431f-a0d1-5b2f2d6b5b0d in service 100 GiB none gzip-9 + oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crypt/debug 1315d3d7-e347-4e68-8381-8c010be44ef0 in service 100 GiB none gzip-9 + oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crypt/debug 0e8321af-4634-4d31-aa79-145f8e171674 in service 100 GiB none gzip-9 + oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crypt/debug 5a0f4402-7d87-4b6b-b4d2-72f48000627c in service 100 GiB none gzip-9 + oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crypt/debug a2120fee-01bd-4f49-8c58-720384b1cbde in service 100 GiB none gzip-9 ++ oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/zone/oxz_nexus_b539cea9-c37c-49ef-874f-170d898187b2 113c40a7-e9fd-492f-814e-528db4fd0e83 in service none none off ++ oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/zone/oxz_nexus_c5a0c592-319e-44df-9d00-1ddb1d5ad6aa 61e536fd-043c-4741-aed7-640d18d32b26 in service none none off ++ oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/zone/oxz_nexus_cab211e1-3ab1-475f-81fa-984748044d8c 92f259d0-cda4-44e4-bb22-8b82d025d502 in service none none off omicron zones generation 2 -> 3: diff --git a/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_2_2a.txt b/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_2_2a.txt index a6d7163af26..c2be7bc846c 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_2_2a.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_2_2a.txt @@ -22,54 +22,54 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 datasets at generation 3: - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crucible 081aff15-bc64-4b57-bbcc-287d7267caa4 none none off - oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crucible 0beeebcf-b558-47e9-9274-bc3dd4a475b8 none none off - oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crucible 757dd9e5-74db-4860-a87e-0aafd6795b91 none none off - oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crucible bd64099e-57f0-447f-9c21-e493e2809372 none none off - oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crucible 3bd0565c-1170-4727-824b-f180454e4ff1 none none off - oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crucible 010c6c12-6ea3-4bbd-9a69-90209dab73ab none none off - oxp_a5f75431-3795-426c-8f80-176f658281a5/crucible 2dbc8272-64ae-4d2d-ac1f-92f120204ddd none none off - oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crucible b4e4e724-ddfb-4d0a-bf6b-edd6dd91172d none none off - oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crucible 8fdfaea0-1da2-429f-b64e-ef0107f2884d none none off - oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crucible 74dc30b1-2c84-4e9d-910c-938d33f9a537 none none off - oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone f282431f-2ed2-4386-bc0f-0f3130b175bf none none off - oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/zone ee3f0e38-23ac-45c6-8157-e611887572a6 none none off - oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/zone acf672d0-effd-491a-bde8-a4253e078f14 none none off - oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/zone d5be658f-367a-4703-a377-7d8067aade3a none none off - oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crypt/zone adbebdd0-4d0d-4794-9bb5-6681b5119624 none none off - oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crypt/zone 1e063fbb-083c-4e2e-a4f5-c40ce854f1d0 none none off - oxp_a5f75431-3795-426c-8f80-176f658281a5/crypt/zone 6b476700-d002-4173-8a83-fb24d49be32f none none off - oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crypt/zone abaa13f5-c3ec-45b2-86da-2be74a259878 none none off - oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crypt/zone d8c2da98-ef6d-4746-ae4b-ed537c78fc89 none none off - oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crypt/zone b1c8156e-7490-46d2-a4af-7fc5dd39991d none none off - oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/zone/oxz_crucible_05ba6d6e-90a7-402a-aaba-fd92190a9f48 6a6e744c-c4a9-4e58-b0ed-ef44eef0c6e0 none none off - oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crypt/zone/oxz_crucible_2097bad3-ee65-4a1c-8fe2-75ed52e69ac8 54941545-0cee-4c36-8516-c63b3cbd02fb none none off - oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone/oxz_crucible_430c8fe1-7296-4a73-b260-fc185260ec5e d0ee4ede-c9a6-4d6a-9dbe-63b4c07a9cdd none none off - oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crypt/zone/oxz_crucible_a720288d-3e5b-44b7-9dab-a69a10768e0b 3fa16efe-c488-4d45-92ee-18eeb8b9453f none none off - oxp_a5f75431-3795-426c-8f80-176f658281a5/crypt/zone/oxz_crucible_b2170eef-aa6f-4ec5-aaa9-2b4289eae65c e20a6e28-7a52-480a-9d36-33f8d4474bf5 none none off - oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crypt/zone/oxz_crucible_b505d6e1-07b9-48bf-bc8a-d4081c25b12a 6b965329-4398-4738-84e6-b893f21a724c none none off - oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/zone/oxz_crucible_cbe34d65-017e-4c26-966d-b1ce27bc1d94 8ad4a9ed-7be5-4f49-8a38-1686144ceaf6 none none off - oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crypt/zone/oxz_crucible_e01462d1-5173-4d95-8477-78ca2157efbb 03fbd010-e16e-48a9-a9a9-5be665c0bdff none none off - oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/zone/oxz_crucible_e49b0403-3d7c-480f-9113-4bc0fca74a8a 62053fe9-281c-4949-9357-bf818004aef2 none none off - oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crypt/zone/oxz_crucible_e6ec9399-b81b-4bdd-8e6e-b0f043aad942 f761d5be-fef1-47d7-850c-1f28a1f8a8b3 none none off - oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/zone/oxz_nexus_2ed23118-6137-45ca-824c-04df3bc3d085 047b92e1-2286-44bb-988e-403f20973ee4 none none off - oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/zone/oxz_nexus_33365de5-8a83-46c0-9d34-eddd68e54c6f 4f6d72db-de32-4a55-ae9d-30d776580c33 none none off - oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/zone/oxz_nexus_80e4964b-a8c8-41ef-ae23-f86cfe5f3a7b 6944260c-23fd-47db-8a2c-02196b399f57 none none off - oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone/oxz_nexus_81f79040-bcf7-4eff-9a87-8e7bcb5a6db9 2694f256-cd46-4841-a009-6460f4ca0616 none none off - oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone/oxz_ntp_8f94a160-67ab-4ed5-bc3f-01e19fdd7e9b 225c385b-de3e-4262-a5c4-0250abc910f9 none none off - oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/debug 041c4e17-e958-41aa-b621-03dd3b3e7da8 100 GiB none gzip-9 - oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/debug 7e551f2b-ac22-4637-bd2a-188f106b57c0 100 GiB none gzip-9 - oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/debug 1e4208d8-041e-49eb-ab6d-dcedceee170c 100 GiB none gzip-9 - oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/debug 0872720b-c454-45f6-8816-2835d595894e 100 GiB none gzip-9 - oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crypt/debug fc7195f4-4472-4283-9094-2f6f7db01e71 100 GiB none gzip-9 - oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crypt/debug baa19cce-f379-427c-9b5e-c413b050c2d5 100 GiB none gzip-9 - oxp_a5f75431-3795-426c-8f80-176f658281a5/crypt/debug 5828eb26-b03b-4481-b88d-027a90a24c50 100 GiB none gzip-9 - oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crypt/debug 5e7deb25-14c2-4633-8728-6eff7833e14f 100 GiB none gzip-9 - oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crypt/debug e02c1929-a38a-49c2-8909-555c3e046d18 100 GiB none gzip-9 - oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crypt/debug 0aeb1237-4ad7-41ae-abd2-45789a3ab2f2 100 GiB none gzip-9 + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crucible 081aff15-bc64-4b57-bbcc-287d7267caa4 in service none none off + oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crucible 0beeebcf-b558-47e9-9274-bc3dd4a475b8 in service none none off + oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crucible 757dd9e5-74db-4860-a87e-0aafd6795b91 in service none none off + oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crucible bd64099e-57f0-447f-9c21-e493e2809372 in service none none off + oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crucible 3bd0565c-1170-4727-824b-f180454e4ff1 in service none none off + oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crucible 010c6c12-6ea3-4bbd-9a69-90209dab73ab in service none none off + oxp_a5f75431-3795-426c-8f80-176f658281a5/crucible 2dbc8272-64ae-4d2d-ac1f-92f120204ddd in service none none off + oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crucible b4e4e724-ddfb-4d0a-bf6b-edd6dd91172d in service none none off + oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crucible 8fdfaea0-1da2-429f-b64e-ef0107f2884d in service none none off + oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crucible 74dc30b1-2c84-4e9d-910c-938d33f9a537 in service none none off + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone f282431f-2ed2-4386-bc0f-0f3130b175bf in service none none off + oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/zone ee3f0e38-23ac-45c6-8157-e611887572a6 in service none none off + oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/zone acf672d0-effd-491a-bde8-a4253e078f14 in service none none off + oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/zone d5be658f-367a-4703-a377-7d8067aade3a in service none none off + oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crypt/zone adbebdd0-4d0d-4794-9bb5-6681b5119624 in service none none off + oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crypt/zone 1e063fbb-083c-4e2e-a4f5-c40ce854f1d0 in service none none off + oxp_a5f75431-3795-426c-8f80-176f658281a5/crypt/zone 6b476700-d002-4173-8a83-fb24d49be32f in service none none off + oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crypt/zone abaa13f5-c3ec-45b2-86da-2be74a259878 in service none none off + oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crypt/zone d8c2da98-ef6d-4746-ae4b-ed537c78fc89 in service none none off + oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crypt/zone b1c8156e-7490-46d2-a4af-7fc5dd39991d in service none none off + oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/zone/oxz_crucible_05ba6d6e-90a7-402a-aaba-fd92190a9f48 6a6e744c-c4a9-4e58-b0ed-ef44eef0c6e0 in service none none off + oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crypt/zone/oxz_crucible_2097bad3-ee65-4a1c-8fe2-75ed52e69ac8 54941545-0cee-4c36-8516-c63b3cbd02fb in service none none off + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone/oxz_crucible_430c8fe1-7296-4a73-b260-fc185260ec5e d0ee4ede-c9a6-4d6a-9dbe-63b4c07a9cdd in service none none off + oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crypt/zone/oxz_crucible_a720288d-3e5b-44b7-9dab-a69a10768e0b 3fa16efe-c488-4d45-92ee-18eeb8b9453f in service none none off + oxp_a5f75431-3795-426c-8f80-176f658281a5/crypt/zone/oxz_crucible_b2170eef-aa6f-4ec5-aaa9-2b4289eae65c e20a6e28-7a52-480a-9d36-33f8d4474bf5 in service none none off + oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crypt/zone/oxz_crucible_b505d6e1-07b9-48bf-bc8a-d4081c25b12a 6b965329-4398-4738-84e6-b893f21a724c in service none none off + oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/zone/oxz_crucible_cbe34d65-017e-4c26-966d-b1ce27bc1d94 8ad4a9ed-7be5-4f49-8a38-1686144ceaf6 in service none none off + oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crypt/zone/oxz_crucible_e01462d1-5173-4d95-8477-78ca2157efbb 03fbd010-e16e-48a9-a9a9-5be665c0bdff in service none none off + oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/zone/oxz_crucible_e49b0403-3d7c-480f-9113-4bc0fca74a8a 62053fe9-281c-4949-9357-bf818004aef2 in service none none off + oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crypt/zone/oxz_crucible_e6ec9399-b81b-4bdd-8e6e-b0f043aad942 f761d5be-fef1-47d7-850c-1f28a1f8a8b3 in service none none off + oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/zone/oxz_nexus_2ed23118-6137-45ca-824c-04df3bc3d085 047b92e1-2286-44bb-988e-403f20973ee4 in service none none off + oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/zone/oxz_nexus_33365de5-8a83-46c0-9d34-eddd68e54c6f 4f6d72db-de32-4a55-ae9d-30d776580c33 in service none none off + oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/zone/oxz_nexus_80e4964b-a8c8-41ef-ae23-f86cfe5f3a7b 6944260c-23fd-47db-8a2c-02196b399f57 in service none none off + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone/oxz_nexus_81f79040-bcf7-4eff-9a87-8e7bcb5a6db9 2694f256-cd46-4841-a009-6460f4ca0616 in service none none off + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone/oxz_ntp_8f94a160-67ab-4ed5-bc3f-01e19fdd7e9b 225c385b-de3e-4262-a5c4-0250abc910f9 in service none none off + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/debug 041c4e17-e958-41aa-b621-03dd3b3e7da8 in service 100 GiB none gzip-9 + oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/debug 7e551f2b-ac22-4637-bd2a-188f106b57c0 in service 100 GiB none gzip-9 + oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/debug 1e4208d8-041e-49eb-ab6d-dcedceee170c in service 100 GiB none gzip-9 + oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/debug 0872720b-c454-45f6-8816-2835d595894e in service 100 GiB none gzip-9 + oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crypt/debug fc7195f4-4472-4283-9094-2f6f7db01e71 in service 100 GiB none gzip-9 + oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crypt/debug baa19cce-f379-427c-9b5e-c413b050c2d5 in service 100 GiB none gzip-9 + oxp_a5f75431-3795-426c-8f80-176f658281a5/crypt/debug 5828eb26-b03b-4481-b88d-027a90a24c50 in service 100 GiB none gzip-9 + oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crypt/debug 5e7deb25-14c2-4633-8728-6eff7833e14f in service 100 GiB none gzip-9 + oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crypt/debug e02c1929-a38a-49c2-8909-555c3e046d18 in service 100 GiB none gzip-9 + oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crypt/debug 0aeb1237-4ad7-41ae-abd2-45789a3ab2f2 in service 100 GiB none gzip-9 omicron zones at generation 3: @@ -112,54 +112,54 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 datasets at generation 3: - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crucible e7187a07-3759-4185-8893-36b01e1a7295 none none off - oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crucible f9901e16-a9e4-4c49-a3b9-464405830043 none none off - oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crucible 024a9e5e-f8a8-4b8f-b75e-5b05509fa69a none none off - oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crucible 22547c0a-a710-4d4c-8984-32445fbf993b none none off - oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crucible dec5883c-1abd-4425-8cc4-b2f57c85cdd4 none none off - oxp_789d607d-d196-428e-a988-f7886a327859/crucible fda176fb-2cea-4646-8601-8d719bcdbda0 none none off - oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crucible 4ded36d4-7e98-47fe-a0f4-c580e7d1eb21 none none off - oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crucible 623c87b5-8848-4e42-aa5e-6e706e11cf63 none none off - oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crucible e98d07df-27a8-4868-a3f9-066ac235516c none none off - oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crucible 639c96d6-265a-45dc-b03f-c145d2ea8c43 none none off - oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone 64c4eb2e-82bf-450c-9379-594af3a4794b none none off - oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/zone f6c13b9c-4e22-448d-b7b8-04652f06423c none none off - oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/zone a15671b5-d3f3-43d9-b143-81bcd5170edf none none off - oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/zone dd78cd99-4aa3-4946-b4c3-b9fad49c6da6 none none off - oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crypt/zone 1c30ecb3-32ba-49e7-a3dd-771a75d38c3a none none off - oxp_789d607d-d196-428e-a988-f7886a327859/crypt/zone 7ac707a2-5bcf-49d1-88eb-1c09841082cf none none off - oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crypt/zone b0d96454-0a1d-47ac-9a13-5c4866131c37 none none off - oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crypt/zone 082509f2-115a-4a71-b8f8-86be21efc081 none none off - oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crypt/zone 01b79cba-881c-4bda-a48d-baaef2fcb122 none none off - oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crypt/zone 32d3d763-0665-4945-a3d0-e3d862f7a718 none none off - oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crypt/zone/oxz_crucible_1b38728b-8552-435b-b621-359ba20d465b c02c8635-e2f5-4974-a8b9-f4fdfe231365 none none off - oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/zone/oxz_crucible_31c42e26-3cdf-41a8-8826-ce71a513ed04 4876b95c-457b-4e81-9a04-ca1319429627 none none off - oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crypt/zone/oxz_crucible_4f38e475-396a-4650-a49c-c3cc4acc3ab9 2aff7d20-2a2b-4ded-9e03-eb0d72d29e35 none none off - oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crypt/zone/oxz_crucible_5cd47e9f-1faf-4afd-970a-18b9076b3407 686fcd72-5da5-4f8c-a740-88866e30b8da none none off - oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crypt/zone/oxz_crucible_768ab86c-d5d2-4734-a381-02df1032d5e9 d1bbe8aa-aeda-496b-93cd-f330f85da352 none none off - oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/zone/oxz_crucible_abbf71e1-6568-42cf-9526-7e31549ba934 782adc3d-3a2f-400d-a6ce-531edc8cf546 none none off - oxp_789d607d-d196-428e-a988-f7886a327859/crypt/zone/oxz_crucible_e37d04f9-ed3f-4665-800e-b51ba7d5d306 6c55265b-7515-4259-adf1-ac07f847c2fb none none off - oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone/oxz_crucible_e6c28c27-39d2-4aec-bf34-5d9f6b3cbd7f 803ed7a0-bb24-489f-8737-b01ff28e3278 none none off - oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crypt/zone/oxz_crucible_f19f884a-3e97-458d-b8fb-533882750cd6 b1044d62-0afd-473e-8719-ca3ecb57d801 none none off - oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/zone/oxz_crucible_f54c359e-a980-4996-9462-25a548d96265 518e80f5-3074-44ec-8da3-ea64f3c0ad3e none none off - oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/zone/oxz_nexus_b539cea9-c37c-49ef-874f-170d898187b2 113c40a7-e9fd-492f-814e-528db4fd0e83 none none off - oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone/oxz_nexus_b854f752-383d-4e0b-8557-8c62d22ba994 537edbee-609e-40df-9a10-4c6f57c5f15f none none off - oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/zone/oxz_nexus_c5a0c592-319e-44df-9d00-1ddb1d5ad6aa 61e536fd-043c-4741-aed7-640d18d32b26 none none off - oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/zone/oxz_nexus_cab211e1-3ab1-475f-81fa-984748044d8c 92f259d0-cda4-44e4-bb22-8b82d025d502 none none off - oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone/oxz_ntp_706286e2-8b09-42ff-9841-eaef65635eee 617a44e3-250b-4db1-a8e7-e42da46a0a0f none none off - oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/debug 856e98db-f5c6-4cbd-a8ad-c02f59f207d7 100 GiB none gzip-9 - oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/debug f14ef549-31db-4fae-a540-3a50f0fba233 100 GiB none gzip-9 - oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/debug e44949f2-403b-4944-b966-de77d4b9365c 100 GiB none gzip-9 - oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/debug 425255d5-c1e8-44eb-855f-fe1770e83362 100 GiB none gzip-9 - oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crypt/debug dc613555-a790-45af-9af4-0127d376f3c6 100 GiB none gzip-9 - oxp_789d607d-d196-428e-a988-f7886a327859/crypt/debug 4f359243-9639-431f-a0d1-5b2f2d6b5b0d 100 GiB none gzip-9 - oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crypt/debug 1315d3d7-e347-4e68-8381-8c010be44ef0 100 GiB none gzip-9 - oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crypt/debug 0e8321af-4634-4d31-aa79-145f8e171674 100 GiB none gzip-9 - oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crypt/debug 5a0f4402-7d87-4b6b-b4d2-72f48000627c 100 GiB none gzip-9 - oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crypt/debug a2120fee-01bd-4f49-8c58-720384b1cbde 100 GiB none gzip-9 + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crucible e7187a07-3759-4185-8893-36b01e1a7295 in service none none off + oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crucible f9901e16-a9e4-4c49-a3b9-464405830043 in service none none off + oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crucible 024a9e5e-f8a8-4b8f-b75e-5b05509fa69a in service none none off + oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crucible 22547c0a-a710-4d4c-8984-32445fbf993b in service none none off + oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crucible dec5883c-1abd-4425-8cc4-b2f57c85cdd4 in service none none off + oxp_789d607d-d196-428e-a988-f7886a327859/crucible fda176fb-2cea-4646-8601-8d719bcdbda0 in service none none off + oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crucible 4ded36d4-7e98-47fe-a0f4-c580e7d1eb21 in service none none off + oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crucible 623c87b5-8848-4e42-aa5e-6e706e11cf63 in service none none off + oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crucible e98d07df-27a8-4868-a3f9-066ac235516c in service none none off + oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crucible 639c96d6-265a-45dc-b03f-c145d2ea8c43 in service none none off + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone 64c4eb2e-82bf-450c-9379-594af3a4794b in service none none off + oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/zone f6c13b9c-4e22-448d-b7b8-04652f06423c in service none none off + oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/zone a15671b5-d3f3-43d9-b143-81bcd5170edf in service none none off + oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/zone dd78cd99-4aa3-4946-b4c3-b9fad49c6da6 in service none none off + oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crypt/zone 1c30ecb3-32ba-49e7-a3dd-771a75d38c3a in service none none off + oxp_789d607d-d196-428e-a988-f7886a327859/crypt/zone 7ac707a2-5bcf-49d1-88eb-1c09841082cf in service none none off + oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crypt/zone b0d96454-0a1d-47ac-9a13-5c4866131c37 in service none none off + oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crypt/zone 082509f2-115a-4a71-b8f8-86be21efc081 in service none none off + oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crypt/zone 01b79cba-881c-4bda-a48d-baaef2fcb122 in service none none off + oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crypt/zone 32d3d763-0665-4945-a3d0-e3d862f7a718 in service none none off + oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crypt/zone/oxz_crucible_1b38728b-8552-435b-b621-359ba20d465b c02c8635-e2f5-4974-a8b9-f4fdfe231365 in service none none off + oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/zone/oxz_crucible_31c42e26-3cdf-41a8-8826-ce71a513ed04 4876b95c-457b-4e81-9a04-ca1319429627 in service none none off + oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crypt/zone/oxz_crucible_4f38e475-396a-4650-a49c-c3cc4acc3ab9 2aff7d20-2a2b-4ded-9e03-eb0d72d29e35 in service none none off + oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crypt/zone/oxz_crucible_5cd47e9f-1faf-4afd-970a-18b9076b3407 686fcd72-5da5-4f8c-a740-88866e30b8da in service none none off + oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crypt/zone/oxz_crucible_768ab86c-d5d2-4734-a381-02df1032d5e9 d1bbe8aa-aeda-496b-93cd-f330f85da352 in service none none off + oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/zone/oxz_crucible_abbf71e1-6568-42cf-9526-7e31549ba934 782adc3d-3a2f-400d-a6ce-531edc8cf546 in service none none off + oxp_789d607d-d196-428e-a988-f7886a327859/crypt/zone/oxz_crucible_e37d04f9-ed3f-4665-800e-b51ba7d5d306 6c55265b-7515-4259-adf1-ac07f847c2fb in service none none off + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone/oxz_crucible_e6c28c27-39d2-4aec-bf34-5d9f6b3cbd7f 803ed7a0-bb24-489f-8737-b01ff28e3278 in service none none off + oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crypt/zone/oxz_crucible_f19f884a-3e97-458d-b8fb-533882750cd6 b1044d62-0afd-473e-8719-ca3ecb57d801 in service none none off + oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/zone/oxz_crucible_f54c359e-a980-4996-9462-25a548d96265 518e80f5-3074-44ec-8da3-ea64f3c0ad3e in service none none off + oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/zone/oxz_nexus_b539cea9-c37c-49ef-874f-170d898187b2 113c40a7-e9fd-492f-814e-528db4fd0e83 in service none none off + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone/oxz_nexus_b854f752-383d-4e0b-8557-8c62d22ba994 537edbee-609e-40df-9a10-4c6f57c5f15f in service none none off + oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/zone/oxz_nexus_c5a0c592-319e-44df-9d00-1ddb1d5ad6aa 61e536fd-043c-4741-aed7-640d18d32b26 in service none none off + oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/zone/oxz_nexus_cab211e1-3ab1-475f-81fa-984748044d8c 92f259d0-cda4-44e4-bb22-8b82d025d502 in service none none off + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone/oxz_ntp_706286e2-8b09-42ff-9841-eaef65635eee 617a44e3-250b-4db1-a8e7-e42da46a0a0f in service none none off + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/debug 856e98db-f5c6-4cbd-a8ad-c02f59f207d7 in service 100 GiB none gzip-9 + oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/debug f14ef549-31db-4fae-a540-3a50f0fba233 in service 100 GiB none gzip-9 + oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/debug e44949f2-403b-4944-b966-de77d4b9365c in service 100 GiB none gzip-9 + oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/debug 425255d5-c1e8-44eb-855f-fe1770e83362 in service 100 GiB none gzip-9 + oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crypt/debug dc613555-a790-45af-9af4-0127d376f3c6 in service 100 GiB none gzip-9 + oxp_789d607d-d196-428e-a988-f7886a327859/crypt/debug 4f359243-9639-431f-a0d1-5b2f2d6b5b0d in service 100 GiB none gzip-9 + oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crypt/debug 1315d3d7-e347-4e68-8381-8c010be44ef0 in service 100 GiB none gzip-9 + oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crypt/debug 0e8321af-4634-4d31-aa79-145f8e171674 in service 100 GiB none gzip-9 + oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crypt/debug 5a0f4402-7d87-4b6b-b4d2-72f48000627c in service 100 GiB none gzip-9 + oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crypt/debug a2120fee-01bd-4f49-8c58-720384b1cbde in service 100 GiB none gzip-9 omicron zones at generation 3: @@ -228,56 +228,56 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 datasets at generation 2: - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dataset name dataset uuid quota reservation compression - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crucible 01b78855-bc58-45bd-937e-49221a71b875 none none off - oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crucible 99ddb9cf-a52c-4b59-884e-dea52e6b4f5d none none off - oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crucible 354e3bc2-e6c8-49c0-bf1d-c136e499037c none none off - oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crucible 7f36c891-2cf8-4e94-b12a-24199b83462b none none off - oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crucible 8dd12603-6cfc-42dd-8912-2a16cb7a748d none none off - oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crucible 8ff2aecd-a1e8-47bd-8001-97c3e5efb99b none none off - oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crucible dab52576-17e4-4bf8-b87e-c49983a388c2 none none off - oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crucible d2c5b427-f956-4cd1-b174-6caca3685e6f none none off - oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crucible e2e73bed-32f9-4111-803b-561cbd7faa1a none none off - oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crucible 5ba5e79d-0a13-41e5-b4d2-6c7cb468cb26 none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/clickhouse 37aac368-1b57-4934-b771-5802ae6d6606 none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/internal_dns 2f276f3f-ad8c-458e-bb62-03f5ec7643f3 none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone a8381430-0bf6-49fd-8e5a-4e7c7eb4edf4 none none off - oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crypt/zone 34fb7c7c-17c2-4cbb-af27-12b693965a4b none none off - oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crypt/zone a6f2fa57-1161-4b49-b591-2a9cd5a992f3 none none off - oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crypt/zone df22d065-beb6-45e4-984e-874dfdd3b285 none none off - oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crypt/zone 59656ee4-d86f-49ff-b4b8-39e1021642f4 none none off - oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crypt/zone ea5ee557-cc4e-4a9b-87a7-7bb9b30589da none none off - oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crypt/zone 5b0f2d79-6120-4b28-8fd6-919a121f5875 none none off - oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crypt/zone dd56b58b-871e-4f55-bcf5-0bd4e8184761 none none off - oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crypt/zone bafeb8db-cb8e-45fc-8030-3a85a26e2feb none none off - oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crypt/zone b567319c-bb7a-4ac0-a95b-20bd88c26579 none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_clickhouse_5fbb489a-141d-4de2-86c4-4fd7b9d9f315 648fecf4-8ce6-4bce-9020-789057c92f95 none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_crucible_0ce2b998-f5ad-4dc5-b2ec-5250a308506d 4fe9bcd8-399f-444e-aa01-f8cb285de102 none none off - oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crypt/zone/oxz_crucible_0e8e9f2d-291d-47fc-ba0f-84cb50e713fd ff5a6a51-2797-4016-903f-69ec69e59ef9 none none off - oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crypt/zone/oxz_crucible_11fc3b08-2470-4f1b-9187-acff1fc4c5ea 32b45c55-cc53-4635-ae2b-559821b409fe none none off - oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crypt/zone/oxz_crucible_673ecd68-d12a-46d9-9126-0a6be6245f84 0377cfc0-2bf6-4906-87f7-031121797594 none none off - oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crypt/zone/oxz_crucible_966c4f15-0aa8-4bef-95e4-49d686cffdfc 9ef1c45c-753a-4ecf-9145-72889ece2ad2 none none off - oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crypt/zone/oxz_crucible_979a7b5b-81a5-49bc-82e5-d88b6eaf7d96 b075b63e-f072-4f35-86d1-a81e50065994 none none off - oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crypt/zone/oxz_crucible_b6beadb1-351b-461d-a887-e7641d976a9e 9d2477db-7dea-4e19-b563-60a18a659cca none none off - oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crypt/zone/oxz_crucible_cf7add30-1c49-4d49-a2d2-1c46a60cd884 3b71883e-8704-468e-96fa-7b4fd85d37e8 none none off - oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crypt/zone/oxz_crucible_d0d4a23e-45fa-4f80-9bdf-a348de3f7b8f 5888130a-54bf-4358-bb1b-099347648757 none none off - oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crypt/zone/oxz_crucible_e46d1442-2a63-44e3-a6aa-e88150b85d92 c4739101-dd65-4649-8e99-e221dc9ce93e none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_crucible_pantry_45b6f382-3590-4281-b65d-083ba7aff2d3 f07a8f89-a4e1-4c71-b223-a4c09af0e443 none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_internal_dns_4fd906d8-94cd-44b3-ad5e-34b4d193bd3c 3681f68d-2840-47be-8bb7-8c7354daf8a7 none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_nexus_88602518-f176-49a1-af12-02fac36214c3 99c53b55-b716-414d-b8ff-a9d56bd9cd6c none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_ntp_b0a48e5a-e2bd-46b2-9bc6-8babbbdc0adc ed9b8ac9-88f4-46fa-8ecf-5a7534d4f020 none none off - oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/debug 97bc5b54-dd6a-4b98-b9e0-081657a3db89 100 GiB none gzip-9 - oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crypt/debug 8d054703-b940-4395-8c46-2ff519f5133a 100 GiB none gzip-9 - oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crypt/debug bb388082-2d09-4a4b-bb22-ee3f4b7b5025 100 GiB none gzip-9 - oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crypt/debug fe2005ba-7f3d-4fc3-b324-09a258fc4a4b 100 GiB none gzip-9 - oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crypt/debug e20df72b-3d75-48ad-8349-3e39cc886886 100 GiB none gzip-9 - oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crypt/debug cf2b245f-c667-49a9-bbc2-ada9a51e63f0 100 GiB none gzip-9 - oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crypt/debug 1c606d5c-ce8c-42e8-9359-d2e0fe31d525 100 GiB none gzip-9 - oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crypt/debug 1f3f9209-c380-40ab-a2f0-16ecddb6d4a8 100 GiB none gzip-9 - oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crypt/debug 89b81a7c-3bc3-455d-97e3-75067de991d5 100 GiB none gzip-9 - oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crypt/debug 1e581e94-bb9d-4514-8dbb-3a882e342d1b 100 GiB none gzip-9 + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crucible 01b78855-bc58-45bd-937e-49221a71b875 in service none none off + oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crucible 99ddb9cf-a52c-4b59-884e-dea52e6b4f5d in service none none off + oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crucible 354e3bc2-e6c8-49c0-bf1d-c136e499037c in service none none off + oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crucible 7f36c891-2cf8-4e94-b12a-24199b83462b in service none none off + oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crucible 8dd12603-6cfc-42dd-8912-2a16cb7a748d in service none none off + oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crucible 8ff2aecd-a1e8-47bd-8001-97c3e5efb99b in service none none off + oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crucible dab52576-17e4-4bf8-b87e-c49983a388c2 in service none none off + oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crucible d2c5b427-f956-4cd1-b174-6caca3685e6f in service none none off + oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crucible e2e73bed-32f9-4111-803b-561cbd7faa1a in service none none off + oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crucible 5ba5e79d-0a13-41e5-b4d2-6c7cb468cb26 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/clickhouse 37aac368-1b57-4934-b771-5802ae6d6606 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/internal_dns 2f276f3f-ad8c-458e-bb62-03f5ec7643f3 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone a8381430-0bf6-49fd-8e5a-4e7c7eb4edf4 in service none none off + oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crypt/zone 34fb7c7c-17c2-4cbb-af27-12b693965a4b in service none none off + oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crypt/zone a6f2fa57-1161-4b49-b591-2a9cd5a992f3 in service none none off + oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crypt/zone df22d065-beb6-45e4-984e-874dfdd3b285 in service none none off + oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crypt/zone 59656ee4-d86f-49ff-b4b8-39e1021642f4 in service none none off + oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crypt/zone ea5ee557-cc4e-4a9b-87a7-7bb9b30589da in service none none off + oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crypt/zone 5b0f2d79-6120-4b28-8fd6-919a121f5875 in service none none off + oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crypt/zone dd56b58b-871e-4f55-bcf5-0bd4e8184761 in service none none off + oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crypt/zone bafeb8db-cb8e-45fc-8030-3a85a26e2feb in service none none off + oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crypt/zone b567319c-bb7a-4ac0-a95b-20bd88c26579 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_clickhouse_5fbb489a-141d-4de2-86c4-4fd7b9d9f315 648fecf4-8ce6-4bce-9020-789057c92f95 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_crucible_0ce2b998-f5ad-4dc5-b2ec-5250a308506d 4fe9bcd8-399f-444e-aa01-f8cb285de102 in service none none off + oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crypt/zone/oxz_crucible_0e8e9f2d-291d-47fc-ba0f-84cb50e713fd ff5a6a51-2797-4016-903f-69ec69e59ef9 in service none none off + oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crypt/zone/oxz_crucible_11fc3b08-2470-4f1b-9187-acff1fc4c5ea 32b45c55-cc53-4635-ae2b-559821b409fe in service none none off + oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crypt/zone/oxz_crucible_673ecd68-d12a-46d9-9126-0a6be6245f84 0377cfc0-2bf6-4906-87f7-031121797594 in service none none off + oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crypt/zone/oxz_crucible_966c4f15-0aa8-4bef-95e4-49d686cffdfc 9ef1c45c-753a-4ecf-9145-72889ece2ad2 in service none none off + oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crypt/zone/oxz_crucible_979a7b5b-81a5-49bc-82e5-d88b6eaf7d96 b075b63e-f072-4f35-86d1-a81e50065994 in service none none off + oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crypt/zone/oxz_crucible_b6beadb1-351b-461d-a887-e7641d976a9e 9d2477db-7dea-4e19-b563-60a18a659cca in service none none off + oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crypt/zone/oxz_crucible_cf7add30-1c49-4d49-a2d2-1c46a60cd884 3b71883e-8704-468e-96fa-7b4fd85d37e8 in service none none off + oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crypt/zone/oxz_crucible_d0d4a23e-45fa-4f80-9bdf-a348de3f7b8f 5888130a-54bf-4358-bb1b-099347648757 in service none none off + oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crypt/zone/oxz_crucible_e46d1442-2a63-44e3-a6aa-e88150b85d92 c4739101-dd65-4649-8e99-e221dc9ce93e in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_crucible_pantry_45b6f382-3590-4281-b65d-083ba7aff2d3 f07a8f89-a4e1-4c71-b223-a4c09af0e443 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_internal_dns_4fd906d8-94cd-44b3-ad5e-34b4d193bd3c 3681f68d-2840-47be-8bb7-8c7354daf8a7 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_nexus_88602518-f176-49a1-af12-02fac36214c3 99c53b55-b716-414d-b8ff-a9d56bd9cd6c in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_ntp_b0a48e5a-e2bd-46b2-9bc6-8babbbdc0adc ed9b8ac9-88f4-46fa-8ecf-5a7534d4f020 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/debug 97bc5b54-dd6a-4b98-b9e0-081657a3db89 in service 100 GiB none gzip-9 + oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crypt/debug 8d054703-b940-4395-8c46-2ff519f5133a in service 100 GiB none gzip-9 + oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crypt/debug bb388082-2d09-4a4b-bb22-ee3f4b7b5025 in service 100 GiB none gzip-9 + oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crypt/debug fe2005ba-7f3d-4fc3-b324-09a258fc4a4b in service 100 GiB none gzip-9 + oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crypt/debug e20df72b-3d75-48ad-8349-3e39cc886886 in service 100 GiB none gzip-9 + oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crypt/debug cf2b245f-c667-49a9-bbc2-ada9a51e63f0 in service 100 GiB none gzip-9 + oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crypt/debug 1c606d5c-ce8c-42e8-9359-d2e0fe31d525 in service 100 GiB none gzip-9 + oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crypt/debug 1f3f9209-c380-40ab-a2f0-16ecddb6d4a8 in service 100 GiB none gzip-9 + oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crypt/debug 89b81a7c-3bc3-455d-97e3-75067de991d5 in service 100 GiB none gzip-9 + oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crypt/debug 1e581e94-bb9d-4514-8dbb-3a882e342d1b in service 100 GiB none gzip-9 omicron zones at generation 2: @@ -322,7 +322,7 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 - nexus 533416e6-d0bd-482d-b592-29346c8a3471 expunged fd00:1122:3344:103::22 -ERRORS: +ZONE ERRORS: sled 2d1cb4f2-cf44-40fc-b118-85036eb732a9 diff --git a/nexus/types/src/deployment.rs b/nexus/types/src/deployment.rs index a11435c8bec..e64b2ad7bb7 100644 --- a/nexus/types/src/deployment.rs +++ b/nexus/types/src/deployment.rs @@ -1014,6 +1014,17 @@ impl BlueprintDatasetDisposition { } } +impl fmt::Display for BlueprintDatasetDisposition { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + // Neither `write!(f, "...")` nor `f.write_str("...")` obey fill + // and alignment (used above), but this does. + BlueprintDatasetDisposition::InService => "in service".fmt(f), + BlueprintDatasetDisposition::Expunged => "expunged".fmt(f), + } + } +} + /// Information about a dataset as recorded in a blueprint #[derive( Debug, @@ -1028,9 +1039,7 @@ impl BlueprintDatasetDisposition { Diffable, )] pub struct BlueprintDatasetConfig { - // TODO: Display this in diffs - leave for now, for backwards compat pub disposition: BlueprintDatasetDisposition, - pub id: DatasetUuid, pub pool: ZpoolName, pub kind: DatasetKind, @@ -1063,6 +1072,7 @@ impl BlueprintDatasetConfig { vec![ DatasetName::new(self.pool.clone(), self.kind.clone()).full_name(), self.id.to_string(), + self.disposition.to_string(), unwrap_or_none(&self.quota), unwrap_or_none(&self.reservation), self.compression.to_string(), diff --git a/nexus/types/src/deployment/blueprint_diff.rs b/nexus/types/src/deployment/blueprint_diff.rs index 71f2bd59090..db75685cbd1 100644 --- a/nexus/types/src/deployment/blueprint_diff.rs +++ b/nexus/types/src/deployment/blueprint_diff.rs @@ -12,19 +12,20 @@ use super::blueprint_display::{ }; use super::{ unwrap_or_none, zone_sort_key, BlueprintDatasetConfigDiff, - BlueprintDatasetsConfigDiff, BlueprintDiff, BlueprintMetadata, - BlueprintPhysicalDiskConfig, BlueprintPhysicalDisksConfigDiff, - BlueprintZoneConfigDiff, BlueprintZonesConfigDiff, ClickhouseClusterConfig, + BlueprintDatasetDisposition, BlueprintDatasetsConfigDiff, BlueprintDiff, + BlueprintMetadata, BlueprintPhysicalDiskConfig, + BlueprintPhysicalDisksConfigDiff, BlueprintZoneConfigDiff, + BlueprintZonesConfigDiff, ClickhouseClusterConfig, CockroachDbPreserveDowngrade, }; use daft::Diffable; use nexus_sled_agent_shared::inventory::ZoneKind; -use omicron_common::api::external::Generation; -use omicron_common::disk::{DatasetName, DiskIdentity}; -use omicron_uuid_kinds::OmicronZoneUuid; +use omicron_common::api::external::{ByteCount, Generation}; +use omicron_common::disk::{CompressionAlgorithm, DatasetName, DiskIdentity}; use omicron_uuid_kinds::SledUuid; +use omicron_uuid_kinds::{DatasetUuid, OmicronZoneUuid}; use std::collections::{BTreeMap, BTreeSet}; -use std::fmt; +use std::fmt::{self, Write as _}; use crate::deployment::blueprint_display::BpClickhouseKeepersTableSchema; use crate::deployment::{ @@ -603,21 +604,18 @@ impl<'a> BlueprintDiffSummary<'a> { pub fn modified_datasets( &'a self, sled_id: &SledUuid, - ) -> Option> { + ) -> Option<(BpDiffDatasetsModified, BpDiffDatasetErrors)> { // Check if the sled is modified and there are any modified datasets let datasets_cfg_diff = self.diff.blueprint_datasets.modified.get(sled_id)?; if datasets_cfg_diff.datasets.modified.is_empty() { return None; } - let mut datasets: Vec<_> = - datasets_cfg_diff.datasets.modified.values().collect(); - datasets.sort_unstable_by_key(|d| (d.kind.before, d.pool.before)); - Some(BpDiffDatasetsModified { - generation_before: *datasets_cfg_diff.generation.before, - generation_after: *datasets_cfg_diff.generation.after, - datasets, - }) + Some(BpDiffDatasetsModified::new( + *datasets_cfg_diff.generation.before, + *datasets_cfg_diff.generation.after, + datasets_cfg_diff.datasets.modified.values(), + )) } } @@ -796,8 +794,8 @@ impl BpTableData for BpDiffZonesModified { } } -#[derive(Debug)] /// Errors arising from illegally modified zone fields +#[derive(Debug)] pub struct BpDiffZoneErrors { pub generation_before: Generation, pub generation_after: Generation, @@ -1048,14 +1046,147 @@ impl BpTableData for DiffDatasetsDetails { } } +/// Properties of a dataset that may change from one blueprint to another. +/// +/// Other properties of a dataset (e.g., its `pool`, `kind`, and `address`) are +/// not expected to change, and we'll record an error if they do. +#[derive(Debug)] +pub struct ModifiableDatasetProperties { + pub disposition: BlueprintDatasetDisposition, + pub quota: Option, + pub reservation: Option, + pub compression: CompressionAlgorithm, +} + +/// Errors arising from illegally modified dataset fields +#[derive(Debug)] +pub struct BpDiffDatasetErrors { + pub generation_before: Generation, + pub generation_after: Generation, + pub errors: Vec, +} + +#[derive(Debug)] +pub struct BpDiffDatasetError { + pub dataset_id: DatasetUuid, + pub reason: String, +} + +#[derive(Debug)] +pub struct ModifiedDataset { + pub prior_properties: ModifiableDatasetProperties, + pub dataset: BlueprintDatasetConfig, +} + +impl ModifiedDataset { + pub fn from_diff( + diff: &BlueprintDatasetConfigDiff, + ) -> Result { + // Do we have any errors? If so, create a "reason" string. + let mut reason = String::new(); + let BlueprintDatasetConfigDiff { + disposition, + id, + pool, + kind, + address, + quota, + reservation, + compression, + } = diff; + + // If we're a "modified" dataset, we must have the same ID before and + // after. (Otherwise our "before" or "after" should've been recorded as + // removed/added.) + debug_assert_eq!(id.before, id.after); + + let prior_properties = ModifiableDatasetProperties { + disposition: *disposition.before, + quota: *quota.before, + reservation: *reservation.before, + compression: *compression.before, + }; + if pool.before != pool.after { + writeln!( + &mut reason, + "mismatched zpool: before: {}, after: {}", + pool.before, pool.after + ) + .expect("write to String is infallible"); + } + if kind.before != kind.after { + writeln!( + &mut reason, + "mismatched kind: before: {}, after: {}", + kind.before, kind.after + ) + .expect("write to String is infallible"); + } + if address.before != address.after { + writeln!( + &mut reason, + "mismatched address: before: {:?}, after: {:?}", + address.before, address.after + ) + .expect("write to String is infallible"); + } + + if reason.is_empty() { + Ok(Self { + prior_properties, + dataset: BlueprintDatasetConfig { + disposition: *disposition.after, + id: *id.after, + pool: pool.after.clone(), + kind: kind.after.clone(), + address: *address.after, + quota: *quota.after, + reservation: *reservation.after, + compression: *compression.after, + }, + }) + } else { + Err(BpDiffDatasetError { dataset_id: *id.after, reason }) + } + } +} + #[derive(Debug)] -pub struct BpDiffDatasetsModified<'a> { +pub struct BpDiffDatasetsModified { pub generation_before: Generation, pub generation_after: Generation, - pub datasets: Vec<&'a BlueprintDatasetConfigDiff<'a>>, + pub datasets: Vec, } -impl BpTableData for BpDiffDatasetsModified<'_> { +impl BpDiffDatasetsModified { + pub fn new<'a>( + generation_before: Generation, + generation_after: Generation, + dataset_diffs: impl Iterator>, + ) -> (BpDiffDatasetsModified, BpDiffDatasetErrors) { + let mut datasets = vec![]; + let mut errors = vec![]; + for diff in dataset_diffs { + match ModifiedDataset::from_diff(diff) { + Ok(modified_zone) => datasets.push(modified_zone), + Err(error) => errors.push(error), + } + } + datasets.sort_unstable_by_key(|d| { + (d.dataset.kind.clone(), d.dataset.pool.clone()) + }); + ( + BpDiffDatasetsModified { + generation_before, + generation_after, + datasets, + }, + BpDiffDatasetErrors { generation_before, generation_after, errors }, + ) + } +} + +impl BpTableData for BpDiffDatasetsModified { fn bp_generation(&self) -> BpGeneration { BpGeneration::Diff { before: Some(self.generation_before), @@ -1064,55 +1195,60 @@ impl BpTableData for BpDiffDatasetsModified<'_> { } fn rows(&self, state: BpDiffState) -> impl Iterator { - self.datasets.iter().map(move |&dataset| { - let mut columns = vec![]; + self.datasets.iter().map(move |dataset| { + let ModifiableDatasetProperties { + disposition: before_disposition, + quota: before_quota, + reservation: before_reservation, + compression: before_compression, + } = &dataset.prior_properties; - // Dataset Name - let before = DatasetName::new( - dataset.pool.before.clone(), - dataset.kind.before.clone(), - ) - .full_name(); - let after = DatasetName::new( - dataset.pool.after.clone(), - dataset.kind.after.clone(), + BpTableRow::new( + state, + vec![ + BpTableColumn::value( + DatasetName::new( + dataset.dataset.pool.clone(), + dataset.dataset.kind.clone(), + ) + .full_name(), + ), + BpTableColumn::value(dataset.dataset.id.to_string()), + BpTableColumn::new( + before_disposition.to_string(), + dataset.dataset.disposition.to_string(), + ), + BpTableColumn::new( + unwrap_or_none(&before_quota), + unwrap_or_none(&dataset.dataset.quota), + ), + BpTableColumn::new( + unwrap_or_none(&before_reservation), + unwrap_or_none(&dataset.dataset.reservation), + ), + BpTableColumn::new( + before_compression.to_string(), + dataset.dataset.compression.to_string(), + ), + ], ) - .full_name(); - columns.push(BpTableColumn::new(before, after)); - - // IDs don't change - columns.push(BpTableColumn::Value(dataset.id.before.to_string())); - - // Quota - let before = unwrap_or_none(dataset.quota.before); - let after = unwrap_or_none(dataset.quota.after); - columns.push(BpTableColumn::new(before, after)); - - // Reservation - let before = unwrap_or_none(dataset.reservation.before); - let after = unwrap_or_none(dataset.reservation.after); - columns.push(BpTableColumn::new(before, after)); - - // Compression - let before = dataset.compression.before.to_string(); - let after = dataset.compression.after.to_string(); - columns.push(BpTableColumn::new(before, after)); - - BpTableRow::new(state, columns) }) } } #[derive(Debug, Default)] -pub struct BpDiffDatasets<'a> { +pub struct BpDiffDatasets { pub added: BTreeMap, pub removed: BTreeMap, - pub modified: BTreeMap>, + pub modified: BTreeMap, pub unchanged: BTreeMap, + pub errors: BTreeMap, } -impl<'a> BpDiffDatasets<'a> { - pub fn from_diff_summary(summary: &'a BlueprintDiffSummary<'a>) -> Self { +impl BpDiffDatasets { + pub fn from_diff_summary<'a>( + summary: &'a BlueprintDiffSummary<'a>, + ) -> Self { let mut diffs = BpDiffDatasets::default(); for sled_id in &summary.all_sleds { if let Some(added) = summary.added_datasets(sled_id) { @@ -1124,8 +1260,12 @@ impl<'a> BpDiffDatasets<'a> { if let Some(unchanged) = summary.unchanged_datasets(sled_id) { diffs.unchanged.insert(*sled_id, unchanged); } - if let Some(modified) = summary.modified_datasets(sled_id) { + if let Some((modified, errors)) = summary.modified_datasets(sled_id) + { diffs.modified.insert(*sled_id, modified); + if !errors.errors.is_empty() { + diffs.errors.insert(*sled_id, errors); + } } } diffs @@ -1565,7 +1705,7 @@ pub struct BlueprintDiffDisplay<'diff> { after_meta: BlueprintMetadata, zones: BpDiffZones, disks: BpDiffPhysicalDisks, - datasets: BpDiffDatasets<'diff>, + datasets: BpDiffDatasets, } impl<'diff> BlueprintDiffDisplay<'diff> { @@ -1820,7 +1960,7 @@ impl fmt::Display for BlueprintDiffDisplay<'_> { // Write out zone errors. if !self.zones.errors.is_empty() { - writeln!(f, "ERRORS:")?; + writeln!(f, "ZONE ERRORS:")?; for (sled_id, errors) in &self.zones.errors { writeln!(f, "\n sled {sled_id}\n")?; writeln!( @@ -1836,6 +1976,24 @@ impl fmt::Display for BlueprintDiffDisplay<'_> { } } + // Write out dataset errors. + if !self.datasets.errors.is_empty() { + writeln!(f, "DATASET ERRORS:")?; + for (sled_id, errors) in &self.datasets.errors { + writeln!(f, "\n sled {sled_id}\n")?; + writeln!( + f, + " dataset diff errors: before gen {}, after gen {}\n", + errors.generation_before, errors.generation_after + )?; + + for err in &errors.errors { + writeln!(f, " dataset id: {}", err.dataset_id)?; + writeln!(f, " reason: {}", err.reason)?; + } + } + } + // Write out metadata diff table for table in self.make_metadata_diff_tables() { writeln!(f, "{}", table)?; diff --git a/nexus/types/src/deployment/blueprint_display.rs b/nexus/types/src/deployment/blueprint_display.rs index 76c102e0812..2cf664e0c19 100644 --- a/nexus/types/src/deployment/blueprint_display.rs +++ b/nexus/types/src/deployment/blueprint_display.rs @@ -122,6 +122,7 @@ impl fmt::Display for BpGeneration { } } +#[derive(Debug)] pub enum BpTableColumn { Value(String), Diff { before: String, after: String }, @@ -343,7 +344,14 @@ impl BpTableSchema for BpDatasetsTableSchema { } fn column_names(&self) -> &'static [&'static str] { - &["dataset name", "dataset uuid", "quota", "reservation", "compression"] + &[ + "dataset name", + "dataset id", + "disposition", + "quota", + "reservation", + "compression", + ] } } From 3ae42bf76cb9b55993705b817157e4f60935b6dd Mon Sep 17 00:00:00 2001 From: Sean Klein Date: Fri, 7 Feb 2025 08:32:13 -0800 Subject: [PATCH 22/43] [reconfigurator] Avoid deploying expunged datasets to sled agents (#7308) If a blueprint has marked a dataset as expunged, stop telling sled agents to deploy it. Fixes https://github.com/oxidecomputer/omicron/issues/7304 --- .../reconfigurator/execution/src/datasets.rs | 102 +++++++++++++++++- nexus/types/src/deployment.rs | 27 +++-- 2 files changed, 122 insertions(+), 7 deletions(-) diff --git a/nexus/reconfigurator/execution/src/datasets.rs b/nexus/reconfigurator/execution/src/datasets.rs index 30c656eca5f..92506718bc0 100644 --- a/nexus/reconfigurator/execution/src/datasets.rs +++ b/nexus/reconfigurator/execution/src/datasets.rs @@ -49,7 +49,7 @@ pub(crate) async fn deploy_datasets( &log, ); - let config: DatasetsConfig = config.clone().into(); + let config: DatasetsConfig = config.clone().into_in_service_datasets(); let result = client.datasets_put(&config).await.with_context( || format!("Failed to put {config:#?} to sled {sled_id}"), @@ -100,3 +100,103 @@ pub(crate) async fn deploy_datasets( Err(errors) } } + +#[cfg(test)] +mod tests { + use super::*; + use nexus_sled_agent_shared::inventory::SledRole; + use nexus_test_utils_macros::nexus_test; + use nexus_types::deployment::id_map::IdMap; + use nexus_types::deployment::BlueprintDatasetConfig; + use nexus_types::deployment::BlueprintDatasetDisposition; + use nexus_types::deployment::BlueprintDatasetsConfig; + use omicron_common::api::external::Generation; + use omicron_common::api::internal::shared::DatasetKind; + use omicron_common::disk::CompressionAlgorithm; + use omicron_common::zpool_name::ZpoolName; + use omicron_uuid_kinds::DatasetUuid; + use omicron_uuid_kinds::ZpoolUuid; + use std::net::SocketAddr; + + type ControlPlaneTestContext = + nexus_test_utils::ControlPlaneTestContext; + + #[nexus_test] + async fn test_deploy_datasets(cptestctx: &ControlPlaneTestContext) { + // Set up. + let nexus = &cptestctx.server.server_context().nexus; + let datastore = nexus.datastore(); + let opctx = OpContext::for_tests( + cptestctx.logctx.log.clone(), + datastore.clone(), + ); + + let sim_sled_agent_addr = match cptestctx.sled_agents[0].local_addr() { + SocketAddr::V6(addr) => addr, + _ => panic!("Unexpected address type for sled agent (wanted IPv6)"), + }; + let sim_sled_agent = &cptestctx.sled_agents[0].sled_agent(); + + // This is a fully fabricated dataset list for a simulated sled agent. + // + // We're testing the validity of the deployment calls here, not of any + // blueprint. + + let sleds_by_id = BTreeMap::from([( + sim_sled_agent.id, + Sled::new( + sim_sled_agent.id, + sim_sled_agent_addr, + SledRole::Scrimlet, + ), + )]); + + // Create two datasets which look like they came from the blueprint: One + // which is in-service, and one which is expunged. + // + // During deployment, the in-service dataset should be deployed, but the + // expunged dataset should be ignored. + let dataset_id = DatasetUuid::new_v4(); + let expunged_dataset_id = DatasetUuid::new_v4(); + let mut datasets = IdMap::new(); + datasets.insert(BlueprintDatasetConfig { + disposition: BlueprintDatasetDisposition::InService, + id: dataset_id, + pool: ZpoolName::new_external(ZpoolUuid::new_v4()), + kind: DatasetKind::Crucible, + address: None, + quota: None, + reservation: None, + compression: CompressionAlgorithm::Off, + }); + datasets.insert(BlueprintDatasetConfig { + disposition: BlueprintDatasetDisposition::Expunged, + id: expunged_dataset_id, + pool: ZpoolName::new_external(ZpoolUuid::new_v4()), + kind: DatasetKind::Crucible, + address: None, + quota: None, + reservation: None, + compression: CompressionAlgorithm::Off, + }); + + let datasets_config = + BlueprintDatasetsConfig { generation: Generation::new(), datasets }; + let sled_configs = + BTreeMap::from([(sim_sled_agent.id, datasets_config.clone())]); + + // Give the simulated sled agent a configuration to deploy + deploy_datasets(&opctx, &sleds_by_id, &sled_configs) + .await + .expect("Deploying datasets should have succeeded"); + + // Observe the latest configuration stored on the simulated sled agent, + // and verify that this output matches the "deploy_datasets" input. + let observed_config = sim_sled_agent.datasets_config_list().unwrap(); + assert_eq!(observed_config, datasets_config.into_in_service_datasets()); + + // We expect to see the single in-service dataset we supplied as input. + assert_eq!(observed_config.datasets.len(), 1,); + assert!(observed_config.datasets.contains_key(&dataset_id)); + } +} diff --git a/nexus/types/src/deployment.rs b/nexus/types/src/deployment.rs index e64b2ad7bb7..9b3e2fcb3c4 100644 --- a/nexus/types/src/deployment.rs +++ b/nexus/types/src/deployment.rs @@ -949,14 +949,29 @@ pub struct BlueprintDatasetsConfig { pub datasets: IdMap, } -impl From for DatasetsConfig { - fn from(config: BlueprintDatasetsConfig) -> Self { - Self { - generation: config.generation, - datasets: config +impl BlueprintDatasetsConfig { + /// Converts [Self] into [DatasetsConfig]. + /// + /// [DatasetsConfig] is a format of the dataset configuration that can be + /// passed to Sled Agents for deployment. + /// + /// This function is effectively a [std::convert::From] implementation, but + /// is named slightly more explicitly, as it filters the blueprint + /// configuration to only consider in-service datasets. + pub fn into_in_service_datasets(self) -> DatasetsConfig { + DatasetsConfig { + generation: self.generation, + datasets: self .datasets .into_iter() - .map(|d| (d.id, d.into())) + .filter_map(|d| { + if d.disposition.matches(BlueprintDatasetFilter::InService) + { + Some((d.id, d.into())) + } else { + None + } + }) .collect(), } } From 0c6ab099ecbdff21fb54d14b55c398540800a304 Mon Sep 17 00:00:00 2001 From: Kyle Simpson Date: Fri, 7 Feb 2025 17:08:13 +0000 Subject: [PATCH 23/43] Fixup migration query for #7463 (#7503) From testing on dogfood, vpc-subnet-contention/up02.sql has been reviving deleted subnet routes. This has been interfering with our ability to create new subnets when reusing old names. This commit puts in the missing constraint, regenerating subnet routes for only *live* subnets. --- schema/crdb/vpc-subnet-contention/up02.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/schema/crdb/vpc-subnet-contention/up02.sql b/schema/crdb/vpc-subnet-contention/up02.sql index f05a01443a4..e5be7a33ba1 100644 --- a/schema/crdb/vpc-subnet-contention/up02.sql +++ b/schema/crdb/vpc-subnet-contention/up02.sql @@ -29,7 +29,7 @@ FROM ON vpc_subnet.vpc_id = vpc.id) JOIN omicron.public.vpc_router ON (vpc_router.vpc_id = vpc.id AND vpc_router.id = vpc.system_router_id) WHERE - vpc_router.kind = 'system' AND + vpc_router.kind = 'system' AND vpc_subnet.time_deleted IS NULL AND vpc_subnet.name != 'default-v4' AND vpc_subnet.name != 'default-v6' ON CONFLICT DO NOTHING; @@ -58,7 +58,7 @@ FROM ON vpc_subnet.vpc_id = vpc.id) JOIN omicron.public.vpc_router ON (vpc_router.vpc_id = vpc.id AND vpc_router.id = vpc.system_router_id) WHERE - vpc_router.kind = 'system' AND + vpc_router.kind = 'system' AND vpc_subnet.time_deleted IS NULL AND (vpc_subnet.name = 'default-v4' OR vpc_subnet.name = 'default-v6') ON CONFLICT DO NOTHING; From 21d47c57b6f7faa096262966b2be7bf7b3c5a953 Mon Sep 17 00:00:00 2001 From: John Gallagher Date: Mon, 10 Feb 2025 10:34:19 -0500 Subject: [PATCH 24/43] [reconfigurator] Remove spicy blueprint -> sled-agent From impls (#7505) This is followup from #7308 and https://github.com/oxidecomputer/omicron/issues/7500#issuecomment-2641963974: * Remove `From for OmicronZonesConfig`. This included expunged zones, but thankfully had no callers. * Change `BlueprintZonesConfig::to_omicron_zones_config(filter)` to `BlueprintZonesConfig::into_running_omicron_zones_config()` (no `filter` argument). All the callers of this method were passing `BlueprintZoneFilter::ShouldBeRunning`, and I don't think there's a reason to use any other filter? * Remove `From for OmicronPhysicalDisksConfig` (which included expunged disks), and replace it with `BlueprintPhysicalDisksConfig::into_in_service_disks()`. This one _did_ have callers, including the blueprint executor, but I think we've avoided problems because the planner current [drops disks if the incoming planning input says they're not in service](https://github.com/oxidecomputer/omicron/blob/3ae42bf76cb9b55993705b817157e4f60935b6dd/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs#L1090-L1097). I'm not sure that planner behavior is right, and might change with #7286, so it seemed safer to go ahead and fix this now. --- .../execution/src/clickhouse.rs | 17 +--- .../execution/src/omicron_physical_disks.rs | 4 +- .../execution/src/omicron_zones.rs | 5 +- nexus/reconfigurator/planning/src/example.rs | 7 +- nexus/reconfigurator/planning/src/planner.rs | 5 +- nexus/types/src/deployment.rs | 81 +++++++++++-------- sled-agent/src/rack_setup/service.rs | 2 +- 7 files changed, 60 insertions(+), 61 deletions(-) diff --git a/nexus/reconfigurator/execution/src/clickhouse.rs b/nexus/reconfigurator/execution/src/clickhouse.rs index a5642015c47..7eb6aff155f 100644 --- a/nexus/reconfigurator/execution/src/clickhouse.rs +++ b/nexus/reconfigurator/execution/src/clickhouse.rs @@ -22,7 +22,7 @@ use futures::future::Either; use futures::stream::FuturesUnordered; use futures::stream::StreamExt; use nexus_db_queries::context::OpContext; -use nexus_sled_agent_shared::inventory::OmicronZoneType; +use nexus_types::deployment::Blueprint; use nexus_types::deployment::BlueprintZoneFilter; use nexus_types::deployment::BlueprintZonesConfig; use nexus_types::deployment::ClickhouseClusterConfig; @@ -182,18 +182,9 @@ pub(crate) async fn deploy_single_node( opctx: &OpContext, zones: &BTreeMap, ) -> Result<(), anyhow::Error> { - if let Some(zone) = zones - .values() - .flat_map(|zones| { - zones - .to_omicron_zones_config(BlueprintZoneFilter::ShouldBeRunning) - .zones - .into_iter() - .find(|zone| { - matches!(zone.zone_type, OmicronZoneType::Clickhouse { .. }) - }) - }) - .next() + if let Some((_, zone)) = + Blueprint::filtered_zones(zones, BlueprintZoneFilter::ShouldBeRunning) + .find(|(_, zone)| zone.zone_type.is_clickhouse()) { let admin_addr = SocketAddr::V6(SocketAddrV6::new( zone.underlay_ip(), diff --git a/nexus/reconfigurator/execution/src/omicron_physical_disks.rs b/nexus/reconfigurator/execution/src/omicron_physical_disks.rs index d856a333213..6655eeb8b62 100644 --- a/nexus/reconfigurator/execution/src/omicron_physical_disks.rs +++ b/nexus/reconfigurator/execution/src/omicron_physical_disks.rs @@ -48,7 +48,9 @@ pub(crate) async fn deploy_disks( &log, ); let result = client - .omicron_physical_disks_put(&config.clone().into()) + .omicron_physical_disks_put( + &config.clone().into_in_service_disks(), + ) .await .with_context(|| { format!("Failed to put {config:#?} to sled {sled_id}") diff --git a/nexus/reconfigurator/execution/src/omicron_zones.rs b/nexus/reconfigurator/execution/src/omicron_zones.rs index 8f7a5b7d96c..73ef7fcaa79 100644 --- a/nexus/reconfigurator/execution/src/omicron_zones.rs +++ b/nexus/reconfigurator/execution/src/omicron_zones.rs @@ -19,7 +19,6 @@ use nexus_db_queries::db::datastore::CollectorReassignment; use nexus_db_queries::db::DataStore; use nexus_types::deployment::BlueprintZoneConfig; use nexus_types::deployment::BlueprintZoneDisposition; -use nexus_types::deployment::BlueprintZoneFilter; use nexus_types::deployment::BlueprintZoneType; use nexus_types::deployment::BlueprintZonesConfig; use omicron_common::address::COCKROACH_ADMIN_PORT; @@ -65,8 +64,8 @@ pub(crate) async fn deploy_zones( db_sled.sled_agent_address(), &opctx.log, ); - let omicron_zones = config - .to_omicron_zones_config(BlueprintZoneFilter::ShouldBeRunning); + let omicron_zones = + config.clone().into_running_omicron_zones_config(); let result = client .omicron_zones_put(&omicron_zones) .await diff --git a/nexus/reconfigurator/planning/src/example.rs b/nexus/reconfigurator/planning/src/example.rs index 0431d356d3d..b2dd869c20e 100644 --- a/nexus/reconfigurator/planning/src/example.rs +++ b/nexus/reconfigurator/planning/src/example.rs @@ -15,7 +15,6 @@ use crate::system::SledBuilder; use crate::system::SystemDescription; use nexus_inventory::CollectionBuilderRng; use nexus_types::deployment::Blueprint; -use nexus_types::deployment::BlueprintZoneFilter; use nexus_types::deployment::OmicronZoneNic; use nexus_types::deployment::PlanningInput; use nexus_types::deployment::SledFilter; @@ -490,9 +489,7 @@ impl ExampleSystemBuilder { system .sled_set_omicron_zones( *sled_id, - zones.to_omicron_zones_config( - BlueprintZoneFilter::ShouldBeRunning, - ), + zones.clone().into_running_omicron_zones_config(), ) .unwrap(); } @@ -546,7 +543,7 @@ impl ZoneCount { mod tests { use chrono::{NaiveDateTime, TimeZone, Utc}; use nexus_sled_agent_shared::inventory::{OmicronZoneConfig, ZoneKind}; - use nexus_types::deployment::BlueprintZoneConfig; + use nexus_types::deployment::{BlueprintZoneConfig, BlueprintZoneFilter}; use omicron_test_utils::dev::test_setup_log; use super::*; diff --git a/nexus/reconfigurator/planning/src/planner.rs b/nexus/reconfigurator/planning/src/planner.rs index 524ffaaa974..fc353d0c53c 100644 --- a/nexus/reconfigurator/planning/src/planner.rs +++ b/nexus/reconfigurator/planning/src/planner.rs @@ -976,9 +976,8 @@ mod test { .blueprint_zones .get(&new_sled_id) .expect("blueprint should contain zones for new sled") - .to_omicron_zones_config( - BlueprintZoneFilter::ShouldBeRunning, - ), + .clone() + .into_running_omicron_zones_config(), ) .unwrap(); let collection = diff --git a/nexus/types/src/deployment.rs b/nexus/types/src/deployment.rs index 9b3e2fcb3c4..7328cd3d835 100644 --- a/nexus/types/src/deployment.rs +++ b/nexus/types/src/deployment.rs @@ -547,33 +547,30 @@ pub struct BlueprintZonesConfig { pub zones: IdMap, } -impl From for OmicronZonesConfig { - fn from(config: BlueprintZonesConfig) -> Self { - Self { - generation: config.generation, - zones: config.zones.into_iter().map(From::from).collect(), - } - } -} - impl BlueprintZonesConfig { - /// Converts self to an [`OmicronZonesConfig`], applying the provided - /// [`BlueprintZoneFilter`]. + /// Converts self into [`OmicronZonesConfig`]. /// - /// The filter controls which zones should be exported into the resulting - /// [`OmicronZonesConfig`]. - pub fn to_omicron_zones_config( - &self, - filter: BlueprintZoneFilter, - ) -> OmicronZonesConfig { + /// [`OmicronZonesConfig`] is a format of the zones configuration that can + /// be passed to Sled Agents for deployment. + /// + /// This function is effectively a `From` implementation, but + /// is named slightly more explicitly, as it filters the blueprint + /// configuration to only consider zones that should be running. + pub fn into_running_omicron_zones_config(self) -> OmicronZonesConfig { OmicronZonesConfig { generation: self.generation, zones: self .zones - .iter() - .filter(|z| z.disposition.matches(filter)) - .cloned() - .map(OmicronZoneConfig::from) + .into_iter() + .filter_map(|z| { + if z.disposition + .matches(BlueprintZoneFilter::ShouldBeRunning) + { + Some(z.into()) + } else { + None + } + }) .collect(), } } @@ -899,6 +896,33 @@ pub struct BlueprintPhysicalDisksConfig { pub disks: IdMap, } +impl BlueprintPhysicalDisksConfig { + /// Converts self into [`OmicronPhysicalDisksConfig`]. + /// + /// [`OmicronPhysicalDisksConfig`] is a format of the disks configuration + /// that can be passed to Sled Agents for deployment. + /// + /// This function is effectively a `From` implementation, but + /// is named slightly more explicitly, as it filters the blueprint + /// configuration to only consider in-service disks. + pub fn into_in_service_disks(self) -> OmicronPhysicalDisksConfig { + OmicronPhysicalDisksConfig { + generation: self.generation, + disks: self + .disks + .into_iter() + .filter_map(|d| { + if d.disposition.matches(DiskFilter::InService) { + Some(d.into()) + } else { + None + } + }) + .collect(), + } + } +} + impl IdMappable for BlueprintPhysicalDiskConfig { type Id = PhysicalDiskUuid; @@ -927,19 +951,6 @@ impl From for OmicronPhysicalDiskConfig { } } -impl From for OmicronPhysicalDisksConfig { - fn from(value: BlueprintPhysicalDisksConfig) -> Self { - OmicronPhysicalDisksConfig { - generation: value.generation, - disks: value - .disks - .into_iter() - .map(OmicronPhysicalDiskConfig::from) - .collect(), - } - } -} - /// Information about Omicron datasets as recorded in a blueprint. #[derive( Debug, Clone, Eq, PartialEq, JsonSchema, Deserialize, Serialize, Diffable, @@ -950,7 +961,7 @@ pub struct BlueprintDatasetsConfig { } impl BlueprintDatasetsConfig { - /// Converts [Self] into [DatasetsConfig]. + /// Converts self into [DatasetsConfig]. /// /// [DatasetsConfig] is a format of the dataset configuration that can be /// passed to Sled Agents for deployment. diff --git a/sled-agent/src/rack_setup/service.rs b/sled-agent/src/rack_setup/service.rs index 39b1d1d27be..c9bc0f339fd 100644 --- a/sled-agent/src/rack_setup/service.rs +++ b/sled-agent/src/rack_setup/service.rs @@ -344,7 +344,7 @@ impl ServiceInner { // Ensure all the physical disks are initialized self.initialize_disks_on_sled( *sled_address, - config.disks.clone().into(), + config.disks.clone().into_in_service_disks(), ) .await?; From 5bab2550651326901d641ace436ec1ea8ade81e9 Mon Sep 17 00:00:00 2001 From: Alan Hanson Date: Mon, 10 Feb 2025 11:12:54 -0800 Subject: [PATCH 25/43] Update Propolis and Crucible (#7509) Crucible changes are: Nexus notifications have different importance (#1621) Propolis changes are: lib: don't send CPUID settings in vCPU device state payload (#848) server/lib: add generic hypervisor enlightenment interface (#846) server: read host CPUID values if the spec has none (#844) Added a new field to the Board struct that propolis requires. Co-authored-by: Alan Hanson --- Cargo.lock | 30 +++++++++++++++--------------- Cargo.toml | 16 ++++++++-------- package-manifest.toml | 16 ++++++++-------- sled-agent/src/instance.rs | 1 + sled-agent/src/sim/sled_agent.rs | 1 + 5 files changed, 33 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bf4a6d3d058..3434e15dce8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -693,7 +693,7 @@ dependencies = [ [[package]] name = "bhyve_api" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=99251f841debbe9aaceb4a407a984190c63dead5#99251f841debbe9aaceb4a407a984190c63dead5" +source = "git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309#0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" dependencies = [ "bhyve_api_sys", "libc", @@ -703,7 +703,7 @@ dependencies = [ [[package]] name = "bhyve_api_sys" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=99251f841debbe9aaceb4a407a984190c63dead5#99251f841debbe9aaceb4a407a984190c63dead5" +source = "git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309#0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" dependencies = [ "libc", "strum", @@ -1880,7 +1880,7 @@ dependencies = [ [[package]] name = "crucible-agent-client" version = "0.0.1" -source = "git+https://github.com/oxidecomputer/crucible?rev=86a2ce1f9f13912a5fe652472de765ec5fc22e76#86a2ce1f9f13912a5fe652472de765ec5fc22e76" +source = "git+https://github.com/oxidecomputer/crucible?rev=03f940b8387750d8955b37e3cc31cc91a2727262#03f940b8387750d8955b37e3cc31cc91a2727262" dependencies = [ "anyhow", "chrono", @@ -1896,7 +1896,7 @@ dependencies = [ [[package]] name = "crucible-client-types" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/crucible?rev=86a2ce1f9f13912a5fe652472de765ec5fc22e76#86a2ce1f9f13912a5fe652472de765ec5fc22e76" +source = "git+https://github.com/oxidecomputer/crucible?rev=03f940b8387750d8955b37e3cc31cc91a2727262#03f940b8387750d8955b37e3cc31cc91a2727262" dependencies = [ "base64 0.22.1", "crucible-workspace-hack", @@ -1909,7 +1909,7 @@ dependencies = [ [[package]] name = "crucible-common" version = "0.0.1" -source = "git+https://github.com/oxidecomputer/crucible?rev=86a2ce1f9f13912a5fe652472de765ec5fc22e76#86a2ce1f9f13912a5fe652472de765ec5fc22e76" +source = "git+https://github.com/oxidecomputer/crucible?rev=03f940b8387750d8955b37e3cc31cc91a2727262#03f940b8387750d8955b37e3cc31cc91a2727262" dependencies = [ "anyhow", "atty", @@ -1939,7 +1939,7 @@ dependencies = [ [[package]] name = "crucible-pantry-client" version = "0.0.1" -source = "git+https://github.com/oxidecomputer/crucible?rev=86a2ce1f9f13912a5fe652472de765ec5fc22e76#86a2ce1f9f13912a5fe652472de765ec5fc22e76" +source = "git+https://github.com/oxidecomputer/crucible?rev=03f940b8387750d8955b37e3cc31cc91a2727262#03f940b8387750d8955b37e3cc31cc91a2727262" dependencies = [ "anyhow", "chrono", @@ -1956,7 +1956,7 @@ dependencies = [ [[package]] name = "crucible-smf" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/crucible?rev=86a2ce1f9f13912a5fe652472de765ec5fc22e76#86a2ce1f9f13912a5fe652472de765ec5fc22e76" +source = "git+https://github.com/oxidecomputer/crucible?rev=03f940b8387750d8955b37e3cc31cc91a2727262#03f940b8387750d8955b37e3cc31cc91a2727262" dependencies = [ "crucible-workspace-hack", "libc", @@ -7105,7 +7105,7 @@ dependencies = [ "pq-sys", "pretty_assertions", "progenitor-client 0.9.1", - "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=99251f841debbe9aaceb4a407a984190c63dead5)", + "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309)", "qorb", "rand", "range-requests", @@ -7392,7 +7392,7 @@ dependencies = [ "oximeter-producer", "oxnet", "pretty_assertions", - "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=99251f841debbe9aaceb4a407a984190c63dead5)", + "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309)", "propolis-mock-server", "propolis_api_types", "rand", @@ -9177,7 +9177,7 @@ dependencies = [ [[package]] name = "propolis-client" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=99251f841debbe9aaceb4a407a984190c63dead5#99251f841debbe9aaceb4a407a984190c63dead5" +source = "git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309#0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" dependencies = [ "async-trait", "base64 0.21.7", @@ -9222,7 +9222,7 @@ dependencies = [ [[package]] name = "propolis-mock-server" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=99251f841debbe9aaceb4a407a984190c63dead5#99251f841debbe9aaceb4a407a984190c63dead5" +source = "git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309#0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" dependencies = [ "anyhow", "atty", @@ -9264,7 +9264,7 @@ dependencies = [ [[package]] name = "propolis_api_types" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=99251f841debbe9aaceb4a407a984190c63dead5#99251f841debbe9aaceb4a407a984190c63dead5" +source = "git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309#0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" dependencies = [ "crucible-client-types", "propolis_types", @@ -9278,7 +9278,7 @@ dependencies = [ [[package]] name = "propolis_types" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=99251f841debbe9aaceb4a407a984190c63dead5#99251f841debbe9aaceb4a407a984190c63dead5" +source = "git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309#0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" dependencies = [ "schemars", "serde", @@ -10905,7 +10905,7 @@ dependencies = [ "omicron-workspace-hack", "oxnet", "progenitor 0.9.1", - "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=99251f841debbe9aaceb4a407a984190c63dead5)", + "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309)", "regress 0.9.1", "reqwest", "schemars", @@ -10931,7 +10931,7 @@ dependencies = [ "omicron-uuid-kinds", "omicron-workspace-hack", "oxnet", - "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=99251f841debbe9aaceb4a407a984190c63dead5)", + "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309)", "rcgen", "schemars", "serde", diff --git a/Cargo.toml b/Cargo.toml index 69831097204..462e87b3bc8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -362,10 +362,10 @@ crossterm = { version = "0.28.1", features = ["event-stream"] } # NOTE: if you change the pinned revision of the `crucible` dependencies, you # must also update the references in package-manifest.toml to match the new # revision. -crucible-agent-client = { git = "https://github.com/oxidecomputer/crucible", rev = "86a2ce1f9f13912a5fe652472de765ec5fc22e76" } -crucible-pantry-client = { git = "https://github.com/oxidecomputer/crucible", rev = "86a2ce1f9f13912a5fe652472de765ec5fc22e76" } -crucible-smf = { git = "https://github.com/oxidecomputer/crucible", rev = "86a2ce1f9f13912a5fe652472de765ec5fc22e76" } -crucible-common = { git = "https://github.com/oxidecomputer/crucible", rev = "86a2ce1f9f13912a5fe652472de765ec5fc22e76" } +crucible-agent-client = { git = "https://github.com/oxidecomputer/crucible", rev = "03f940b8387750d8955b37e3cc31cc91a2727262" } +crucible-pantry-client = { git = "https://github.com/oxidecomputer/crucible", rev = "03f940b8387750d8955b37e3cc31cc91a2727262" } +crucible-smf = { git = "https://github.com/oxidecomputer/crucible", rev = "03f940b8387750d8955b37e3cc31cc91a2727262" } +crucible-common = { git = "https://github.com/oxidecomputer/crucible", rev = "03f940b8387750d8955b37e3cc31cc91a2727262" } # NOTE: See above! csv = "1.3.1" curve25519-dalek = "4" @@ -565,10 +565,10 @@ progenitor-client = "0.9.1" # NOTE: if you change the pinned revision of the `bhyve_api` and propolis # dependencies, you must also update the references in package-manifest.toml to # match the new revision. -bhyve_api = { git = "https://github.com/oxidecomputer/propolis", rev = "99251f841debbe9aaceb4a407a984190c63dead5" } -propolis_api_types = { git = "https://github.com/oxidecomputer/propolis", rev = "99251f841debbe9aaceb4a407a984190c63dead5" } -propolis-client = { git = "https://github.com/oxidecomputer/propolis", rev = "99251f841debbe9aaceb4a407a984190c63dead5" } -propolis-mock-server = { git = "https://github.com/oxidecomputer/propolis", rev = "99251f841debbe9aaceb4a407a984190c63dead5" } +bhyve_api = { git = "https://github.com/oxidecomputer/propolis", rev = "0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" } +propolis_api_types = { git = "https://github.com/oxidecomputer/propolis", rev = "0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" } +propolis-client = { git = "https://github.com/oxidecomputer/propolis", rev = "0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" } +propolis-mock-server = { git = "https://github.com/oxidecomputer/propolis", rev = "0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" } # NOTE: see above! proptest = "1.5.0" qorb = "0.2.1" diff --git a/package-manifest.toml b/package-manifest.toml index fc416faf28d..aa4e08ed610 100644 --- a/package-manifest.toml +++ b/package-manifest.toml @@ -579,10 +579,10 @@ only_for_targets.image = "standard" # 3. Use source.type = "manual" instead of "prebuilt" source.type = "prebuilt" source.repo = "crucible" -source.commit = "86a2ce1f9f13912a5fe652472de765ec5fc22e76" +source.commit = "03f940b8387750d8955b37e3cc31cc91a2727262" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/crucible/image//crucible.sha256.txt -source.sha256 = "ff41d5fb504982536445c34fb62ddccc78d40d5806326fe0d01094f4dc4ba58f" +source.sha256 = "4dbffda837d6c759faa843f8853a6e9323f49c5820daa4ab563efea5ff9cf5ae" output.type = "zone" output.intermediate_only = true @@ -591,10 +591,10 @@ service_name = "crucible_pantry_prebuilt" only_for_targets.image = "standard" source.type = "prebuilt" source.repo = "crucible" -source.commit = "86a2ce1f9f13912a5fe652472de765ec5fc22e76" +source.commit = "03f940b8387750d8955b37e3cc31cc91a2727262" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/crucible/image//crucible-pantry.sha256.txt -source.sha256 = "70b9423e0851afe9411957cd5ac515add0cd52dbe98a50f31c8c85ac7a43299c" +source.sha256 = "988b72e8808bdc7c204488b73e11104915640012fb7c9a75056ebc28f11e6d0d" output.type = "zone" output.intermediate_only = true @@ -608,10 +608,10 @@ service_name = "crucible_dtrace" only_for_targets.image = "standard" source.type = "prebuilt" source.repo = "crucible" -source.commit = "86a2ce1f9f13912a5fe652472de765ec5fc22e76" +source.commit = "03f940b8387750d8955b37e3cc31cc91a2727262" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/crucible/image//crucible-dtrace.sha256.txt -source.sha256 = "580e0ccb93c24835ada62b40a054042ab301fce3e1c26cd6b29611a60829f545" +source.sha256 = "73ebcc7a3e031f90361a08a99f9c3fc0ef1713209d2ead6fc44d55b0f8b7d040" output.type = "tarball" # Refer to @@ -622,10 +622,10 @@ service_name = "propolis-server" only_for_targets.image = "standard" source.type = "prebuilt" source.repo = "propolis" -source.commit = "99251f841debbe9aaceb4a407a984190c63dead5" +source.commit = "0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/propolis/image//propolis-server.sha256.txt -source.sha256 = "53721913ee25b2c649cd845c542fb1ebf86d3e61c68af4002fcfad60050c9e54" +source.sha256 = "369f67ad5f1c205a50228cd5e4a5fd41f3cbf76ff8f64ae8bca8ee38a2ba5b5a" output.type = "zone" [package.mg-ddm-gz] diff --git a/sled-agent/src/instance.rs b/sled-agent/src/instance.rs index 15b21e41071..39b6ea967e1 100644 --- a/sled-agent/src/instance.rs +++ b/sled-agent/src/instance.rs @@ -1115,6 +1115,7 @@ impl InstanceRunner { cpus: self.vcpus, memory_mb: self.memory_mib, cpuid: None, + guest_hv_interface: None, }, components: Default::default(), }; diff --git a/sled-agent/src/sim/sled_agent.rs b/sled-agent/src/sim/sled_agent.rs index 25fa5f38058..bd07db7d5c7 100644 --- a/sled-agent/src/sim/sled_agent.rs +++ b/sled-agent/src/sim/sled_agent.rs @@ -290,6 +290,7 @@ impl SledAgent { .memory .to_whole_mebibytes(), cpuid: None, + guest_hv_interface: None, }, components: [( "com1".to_string(), From bf09cd775686bcd8f1432649043366757300ffc2 Mon Sep 17 00:00:00 2001 From: John Gallagher Date: Mon, 10 Feb 2025 15:35:15 -0500 Subject: [PATCH 26/43] [omdb] Add datasets to `blueprints show ...` (#7506) A couple times debugging this week I tried to `omdb nexus blueprints show ...` to look at datasets, and had to resort to looking at diffs or raw JSON, so I figured it was time to flesh this out. The diff is almost all expectorate output; code changes are pretty small. I tried to make it slightly less likely we forget to update the blueprint display when fields are changed in the future. Fixes #7303. --- dev-tools/omdb/tests/successes.out | 36 ++ .../tests/output/cmd-example-stdout | 175 +++++++ .../output/cmd-expunge-newly-added-stdout | 485 ++++++++++++++++++ .../example_builder_zone_counts_blueprint.txt | 272 ++++++++++ .../planner_decommissions_sleds_bp2.txt | 109 +++- .../output/planner_nonprovisionable_bp2.txt | 157 +++++- nexus/types/src/deployment.rs | 129 ++++- 7 files changed, 1333 insertions(+), 30 deletions(-) diff --git a/dev-tools/omdb/tests/successes.out b/dev-tools/omdb/tests/successes.out index d4460bcc3d9..00c8c05b20f 100644 --- a/dev-tools/omdb/tests/successes.out +++ b/dev-tools/omdb/tests/successes.out @@ -1337,6 +1337,12 @@ parent: nexus-tests nexus-test-model nexus-test-disk-19 + datasets at generation 2: + --------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------- + + omicron zones at generation 2: ----------------------------------------------- zone type zone id disposition underlay IP @@ -1362,6 +1368,18 @@ parent: nexus-tests nexus-test-model nexus-test-disk-9 + datasets at generation 2: + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_...................../crypt/zone/oxz_clickhouse_..................... ..................... in service none none off + oxp_...................../crypt/zone/oxz_cockroachdb_..................... ..................... in service none none off + oxp_...................../crypt/zone/oxz_crucible_pantry_..................... ..................... in service none none off + oxp_...................../crypt/zone/oxz_external_dns_..................... ..................... in service none none off + oxp_...................../crypt/zone/oxz_internal_dns_..................... ..................... in service none none off + oxp_...................../crypt/zone/oxz_nexus_..................... ..................... in service none none off + + omicron zones at generation 2: --------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -1415,6 +1433,12 @@ parent: nexus-tests nexus-test-model nexus-test-disk-19 + datasets at generation 2: + --------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + --------------------------------------------------------------------------- + + omicron zones at generation 2: ----------------------------------------------- zone type zone id disposition underlay IP @@ -1440,6 +1464,18 @@ parent: nexus-tests nexus-test-model nexus-test-disk-9 + datasets at generation 2: + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_...................../crypt/zone/oxz_clickhouse_..................... ..................... in service none none off + oxp_...................../crypt/zone/oxz_cockroachdb_..................... ..................... in service none none off + oxp_...................../crypt/zone/oxz_crucible_pantry_..................... ..................... in service none none off + oxp_...................../crypt/zone/oxz_external_dns_..................... ..................... in service none none off + oxp_...................../crypt/zone/oxz_internal_dns_..................... ..................... in service none none off + oxp_...................../crypt/zone/oxz_nexus_..................... ..................... in service none none off + + omicron zones at generation 2: --------------------------------------------------------------------------------------- zone type zone id disposition underlay IP diff --git a/dev-tools/reconfigurator-cli/tests/output/cmd-example-stdout b/dev-tools/reconfigurator-cli/tests/output/cmd-example-stdout index 4d84b9a5bcc..de70fa82ea6 100644 --- a/dev-tools/reconfigurator-cli/tests/output/cmd-example-stdout +++ b/dev-tools/reconfigurator-cli/tests/output/cmd-example-stdout @@ -84,6 +84,61 @@ parent: 02697f74-b14a-4418-90f0-c28b2a3a6aa9 fake-vendor fake-model serial-d792c8cb-7490-40cb-bb1c-d4917242edf4 + datasets at generation 2: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_088ed702-551e-453b-80d7-57700372a844/crucible b95a9149-be08-4845-997a-1fde96cf0e85 in service none none off + oxp_09e51697-abad-47c0-a193-eaf74bc5d3cd/crucible 1fdbd927-34b1-48b4-9394-4b580ef9f6a3 in service none none off + oxp_3a512d49-edbe-47f3-8d0b-6051bfdc4044/crucible 1308f1bc-a249-4ba3-b65e-db6c979aa7da in service none none off + oxp_40517680-aa77-413c-bcf4-b9041dcf6612/crucible 0497b348-53f7-49c1-8bdf-b802261a571c in service none none off + oxp_78d3cb96-9295-4644-bf78-2e32191c71f9/crucible eeef27be-7691-4621-8025-bc06507ce481 in service none none off + oxp_853595e7-77da-404e-bc35-aba77478d55c/crucible edb2138e-849d-425e-aec0-5a6bb6a90c86 in service none none off + oxp_8926e0e7-65d9-4e2e-ac6d-f1298af81ef1/crucible 7e2a255b-1850-44bb-ad97-076ac75ff48d in service none none off + oxp_9c0b9151-17f3-4857-94cc-b5bfcd402326/crucible 1a98a7a8-3e4f-4011-b126-cba62033255e in service none none off + oxp_d61354fa-48d2-47c6-90bf-546e3ed1708b/crucible 321a27f9-669d-4c78-98d4-dd7201dc3fcb in service none none off + oxp_d792c8cb-7490-40cb-bb1c-d4917242edf4/crucible 27b0e4d4-8099-4916-9ab9-3ba5dcdda17a in service none none off + oxp_088ed702-551e-453b-80d7-57700372a844/crypt/clickhouse f2721ca7-c3b5-4c98-a24c-6c61401774ce in service none none off + oxp_088ed702-551e-453b-80d7-57700372a844/crypt/external_dns 516d5161-ba8e-45a0-a570-c141c868903d in service none none off + oxp_088ed702-551e-453b-80d7-57700372a844/crypt/internal_dns e1325cf0-47dc-4085-ac93-f6da943745e8 in service none none off + oxp_088ed702-551e-453b-80d7-57700372a844/crypt/zone 638501ff-3ae1-4de7-92a6-aae643f0f302 in service none none off + oxp_09e51697-abad-47c0-a193-eaf74bc5d3cd/crypt/zone 1a2a375a-1d9a-481f-93c9-4f89d01d7ed6 in service none none off + oxp_3a512d49-edbe-47f3-8d0b-6051bfdc4044/crypt/zone 1b544723-d28e-44da-ab51-b5a38633a9eb in service none none off + oxp_40517680-aa77-413c-bcf4-b9041dcf6612/crypt/zone 5373fee5-d77e-4f00-b3b4-f40ff0565783 in service none none off + oxp_78d3cb96-9295-4644-bf78-2e32191c71f9/crypt/zone 3c40fe80-ba7e-4444-95c1-2dac25b09ceb in service none none off + oxp_853595e7-77da-404e-bc35-aba77478d55c/crypt/zone 28889aed-e213-4f24-83ce-80c2bc979cb8 in service none none off + oxp_8926e0e7-65d9-4e2e-ac6d-f1298af81ef1/crypt/zone 63b4985a-f05b-41d0-bb4b-b28fc6342dd7 in service none none off + oxp_9c0b9151-17f3-4857-94cc-b5bfcd402326/crypt/zone aad54803-50a6-4733-b0d0-2d502b150404 in service none none off + oxp_d61354fa-48d2-47c6-90bf-546e3ed1708b/crypt/zone 1fde35b2-d4e0-4226-b83d-f9bdfac7cbe2 in service none none off + oxp_d792c8cb-7490-40cb-bb1c-d4917242edf4/crypt/zone a7337ad7-3321-4d49-a6ad-636b9f41a6a7 in service none none off + oxp_088ed702-551e-453b-80d7-57700372a844/crypt/zone/oxz_clickhouse_3a3f243b-7e9e-4818-bb7c-fe30966b2949 312df2ab-5582-4b0f-84a0-b9391c1adb57 in service none none off + oxp_78d3cb96-9295-4644-bf78-2e32191c71f9/crypt/zone/oxz_crucible_279b230f-5e77-4960-b08e-594c6f2f57c0 24b9d80d-2a88-4bef-acc3-db32075bdabe in service none none off + oxp_9c0b9151-17f3-4857-94cc-b5bfcd402326/crypt/zone/oxz_crucible_4328425e-f5ba-436a-9e46-3f337f07671e f5d6040a-d278-42d8-82ed-55114fe7a065 in service none none off + oxp_d792c8cb-7490-40cb-bb1c-d4917242edf4/crypt/zone/oxz_crucible_4e60ff64-155b-44e8-9d39-e6de8c5d5fd3 ee5156ad-6b94-40c5-819f-41019a40c8e2 in service none none off + oxp_853595e7-77da-404e-bc35-aba77478d55c/crypt/zone/oxz_crucible_61282e88-43b3-4011-9314-b0929880895a 7d53fd70-018c-4f1b-949b-206d4d36440e in service none none off + oxp_d61354fa-48d2-47c6-90bf-546e3ed1708b/crypt/zone/oxz_crucible_7537db8e-11c9-4a84-9dc7-b3ae7b657cc4 8936bf9c-264f-4106-8719-dc4dbe690b83 in service none none off + oxp_09e51697-abad-47c0-a193-eaf74bc5d3cd/crypt/zone/oxz_crucible_b37ebcb3-533b-4fd7-9960-bb1ac511bea2 dccc4c7e-7be8-48b4-ada1-6aa41275a040 in service none none off + oxp_8926e0e7-65d9-4e2e-ac6d-f1298af81ef1/crypt/zone/oxz_crucible_b8aba012-d4b3-48e1-af2d-cf6265e02bd7 6bff9e1a-fba4-48da-b5fb-325565c65cbe in service none none off + oxp_3a512d49-edbe-47f3-8d0b-6051bfdc4044/crypt/zone/oxz_crucible_e1b405aa-a32c-4410-8335-59237a7bc9ad c9c6fc54-5ff5-4231-8abd-0c1bddb6de92 in service none none off + oxp_40517680-aa77-413c-bcf4-b9041dcf6612/crypt/zone/oxz_crucible_e696d6f8-c706-4ca7-8846-561f0323ccbf 4c0f3572-d324-4299-b7a3-e3b26b060445 in service none none off + oxp_088ed702-551e-453b-80d7-57700372a844/crypt/zone/oxz_crucible_f69e36ff-ea67-4d1f-bc73-3d2a0315c77f 1a39a88e-0350-4e86-a83f-822af222686f in service none none off + oxp_088ed702-551e-453b-80d7-57700372a844/crypt/zone/oxz_crucible_pantry_b4c3734e-b6d8-47d8-a695-5dad2c21622e b3b784b5-1b6f-40f6-a388-8f8f210ee677 in service none none off + oxp_088ed702-551e-453b-80d7-57700372a844/crypt/zone/oxz_external_dns_c5fefafb-d65c-44e0-b45e-d2097dca02d1 001933b7-faf6-42d7-9f3a-13198b32e622 in service none none off + oxp_088ed702-551e-453b-80d7-57700372a844/crypt/zone/oxz_internal_dns_426face8-6cc4-4ba0-b3a3-8492876ecd37 2752a19b-3e30-4e24-b4b7-f0abaed80550 in service none none off + oxp_088ed702-551e-453b-80d7-57700372a844/crypt/zone/oxz_nexus_db1aa26e-7608-4ce0-933e-9968489f8a46 c85990bc-8643-4dc7-bbc9-c50e0a38db11 in service none none off + oxp_088ed702-551e-453b-80d7-57700372a844/crypt/zone/oxz_ntp_eaa48c21-f17c-41f7-9e85-fc6a10913b31 3eeb6d48-dc4a-4e0b-b499-b4815630611a in service none none off + oxp_088ed702-551e-453b-80d7-57700372a844/crypt/debug 55093b80-6478-4a6a-aa3b-64c0bd7395dc in service 100 GiB none gzip-9 + oxp_09e51697-abad-47c0-a193-eaf74bc5d3cd/crypt/debug b1d00974-356b-4188-80e5-2ad9dd1fbc96 in service 100 GiB none gzip-9 + oxp_3a512d49-edbe-47f3-8d0b-6051bfdc4044/crypt/debug a420bdde-b687-4b52-8029-5d8474ecd6a7 in service 100 GiB none gzip-9 + oxp_40517680-aa77-413c-bcf4-b9041dcf6612/crypt/debug 93900f81-e442-4567-b8bb-48fe9528462c in service 100 GiB none gzip-9 + oxp_78d3cb96-9295-4644-bf78-2e32191c71f9/crypt/debug 4cf44aa3-b0d3-4488-9bb6-e9f74eaf1160 in service 100 GiB none gzip-9 + oxp_853595e7-77da-404e-bc35-aba77478d55c/crypt/debug 0cb7d226-bfe4-4e0b-a355-ac483902f145 in service 100 GiB none gzip-9 + oxp_8926e0e7-65d9-4e2e-ac6d-f1298af81ef1/crypt/debug edf3043e-0cb3-4bce-b6ca-c1b531de8abb in service 100 GiB none gzip-9 + oxp_9c0b9151-17f3-4857-94cc-b5bfcd402326/crypt/debug 31a5bfe9-b4f4-4dc4-bd9b-0ec26a7c5662 in service 100 GiB none gzip-9 + oxp_d61354fa-48d2-47c6-90bf-546e3ed1708b/crypt/debug ce9d87eb-3e67-426d-be15-e5b056d7fbb4 in service 100 GiB none gzip-9 + oxp_d792c8cb-7490-40cb-bb1c-d4917242edf4/crypt/debug dad250d2-5a42-43a1-8272-dd7e29d31954 in service 100 GiB none gzip-9 + + omicron zones at generation 2: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -125,6 +180,59 @@ parent: 02697f74-b14a-4418-90f0-c28b2a3a6aa9 fake-vendor fake-model serial-d7410a1c-e01d-49a4-be9c-f861f086760a + datasets at generation 2: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_128b0f04-229b-48dc-9c5c-555cb5723ed8/crucible ae3ff0ec-7eaa-4aa2-88f8-385d50ab295c in service none none off + oxp_43ae0f4e-b0cf-4d74-8636-df0567ba01e6/crucible 3b8acee7-a8c1-4834-8af8-f42be32d576a in service none none off + oxp_4e9806d0-41cd-48c2-86ef-7f815c3ce3b1/crucible d2f61e61-612e-4ff6-8ebb-29ffb89c7615 in service none none off + oxp_70bb6d98-111f-4015-9d97-9ef1b2d6dcac/crucible 716bd089-ff3e-4aa9-a124-1c0f4a3e4987 in service none none off + oxp_7ce5029f-703c-4c08-8164-9af9cf1acf23/crucible 46a2171c-02e0-4ed7-8ac5-970792084d0e in service none none off + oxp_b113c11f-44e6-4fb4-a56e-1d91bd652faf/crucible f77a65b9-0698-405f-acd2-3fc493f141a2 in service none none off + oxp_bf149c80-2498-481c-9989-6344da914081/crucible 9c667167-c040-4939-9f6a-35717022366c in service none none off + oxp_c69b6237-09f9-45aa-962c-5dbdd1d894be/crucible 5a418594-920b-4d11-a302-1f51263099ab in service none none off + oxp_ccd5a87b-00ae-42ad-85da-b37d70436cb1/crucible 929430d8-4d9e-4643-a924-d4886ea06cc1 in service none none off + oxp_d7410a1c-e01d-49a4-be9c-f861f086760a/crucible 42cc77ea-602c-4ae7-9e0e-10a5b320c1aa in service none none off + oxp_128b0f04-229b-48dc-9c5c-555cb5723ed8/crypt/external_dns 8a3e2e54-c779-44fd-8e89-3ff3d9695e5a in service none none off + oxp_128b0f04-229b-48dc-9c5c-555cb5723ed8/crypt/internal_dns d353634c-51e0-4b56-b2af-fa08416a4307 in service none none off + oxp_128b0f04-229b-48dc-9c5c-555cb5723ed8/crypt/zone 0ab616d3-728d-4d5c-9657-6a7062ed33b4 in service none none off + oxp_43ae0f4e-b0cf-4d74-8636-df0567ba01e6/crypt/zone 5afb2ed7-1e0d-46e2-8cb2-24921a887883 in service none none off + oxp_4e9806d0-41cd-48c2-86ef-7f815c3ce3b1/crypt/zone eb02d392-27fe-4e0f-9e85-68d6ac4426e8 in service none none off + oxp_70bb6d98-111f-4015-9d97-9ef1b2d6dcac/crypt/zone 786fa5bd-b472-4e0e-9d20-1dc541bebd16 in service none none off + oxp_7ce5029f-703c-4c08-8164-9af9cf1acf23/crypt/zone 41092962-f1bc-4734-89c4-7bdc89548fab in service none none off + oxp_b113c11f-44e6-4fb4-a56e-1d91bd652faf/crypt/zone 6c9d0188-4369-4aa8-b5bd-762ef078c72a in service none none off + oxp_bf149c80-2498-481c-9989-6344da914081/crypt/zone a50c7543-96ae-45ad-ba66-9766b4a08ed2 in service none none off + oxp_c69b6237-09f9-45aa-962c-5dbdd1d894be/crypt/zone d1ddd3ad-ac27-4cd1-9943-1124dc31b762 in service none none off + oxp_ccd5a87b-00ae-42ad-85da-b37d70436cb1/crypt/zone 8bf57d85-6e39-4dd7-beb7-3f0d1c3a8d23 in service none none off + oxp_d7410a1c-e01d-49a4-be9c-f861f086760a/crypt/zone 5d2f99ec-1d49-4ddf-a83c-7178dc2d7f03 in service none none off + oxp_70bb6d98-111f-4015-9d97-9ef1b2d6dcac/crypt/zone/oxz_crucible_096964a1-a60b-4de9-b4b5-dada560870ca 562a77a8-a139-461d-8b5a-1b0a8ded4639 in service none none off + oxp_ccd5a87b-00ae-42ad-85da-b37d70436cb1/crypt/zone/oxz_crucible_1a07a7f2-76ae-4670-8491-3383bb3e2d19 22cf1a51-e484-4ea1-bdbd-6d4c59ef1ba5 in service none none off + oxp_43ae0f4e-b0cf-4d74-8636-df0567ba01e6/crypt/zone/oxz_crucible_1a7ddc8f-90c7-4842-81a9-2abfc76e3cb4 e9261b1f-6914-4764-ad1e-12b7e5a6473e in service none none off + oxp_128b0f04-229b-48dc-9c5c-555cb5723ed8/crypt/zone/oxz_crucible_2f5dec78-6071-41c1-8f3f-2f4e98fdad0a 58919e5b-6479-4c8f-95b0-4bf5d5c948db in service none none off + oxp_c69b6237-09f9-45aa-962c-5dbdd1d894be/crypt/zone/oxz_crucible_52960cc6-af73-4ae6-b776-b4bcc371fd68 bc2726a9-8447-42c8-877f-2e4c4b7b3bfe in service none none off + oxp_4e9806d0-41cd-48c2-86ef-7f815c3ce3b1/crypt/zone/oxz_crucible_6914b9aa-5712-405c-817a-77b2e6c6a824 fb6d9561-67ff-4464-b96b-85302afd2e6b in service none none off + oxp_bf149c80-2498-481c-9989-6344da914081/crypt/zone/oxz_crucible_8e92b0f0-77b7-4b95-905f-653ee962b932 dd7ec937-21f1-41d6-bfbd-15d8ceccede3 in service none none off + oxp_d7410a1c-e01d-49a4-be9c-f861f086760a/crypt/zone/oxz_crucible_a2a98ae0-ee42-4933-9c4b-660123bc693d 88e0dd87-292c-4284-9179-8cc538201b3f in service none none off + oxp_b113c11f-44e6-4fb4-a56e-1d91bd652faf/crypt/zone/oxz_crucible_d9ea5125-d6f0-4bfd-9ebd-497569d91adf 0387b296-b617-40b5-964b-be8c793d2f9b in service none none off + oxp_7ce5029f-703c-4c08-8164-9af9cf1acf23/crypt/zone/oxz_crucible_f7ced707-a517-4529-91fa-03dc7683f413 58b594a1-52d1-4e34-af4a-30ac392b2bfa in service none none off + oxp_128b0f04-229b-48dc-9c5c-555cb5723ed8/crypt/zone/oxz_crucible_pantry_41f7b32f-d85f-4cce-853c-144342cc8361 265a4c79-a14b-41dc-bcb7-2e437c97b043 in service none none off + oxp_128b0f04-229b-48dc-9c5c-555cb5723ed8/crypt/zone/oxz_external_dns_25087c5b-58b9-46f2-9e4c-e9440c081111 22fb3cce-7c6f-43dd-abf6-bbd00738b490 in service none none off + oxp_128b0f04-229b-48dc-9c5c-555cb5723ed8/crypt/zone/oxz_internal_dns_5c1386b0-ed6b-4e09-8a65-7d9f47c41839 2daf1716-1f5f-4553-81fa-06862226a825 in service none none off + oxp_128b0f04-229b-48dc-9c5c-555cb5723ed8/crypt/zone/oxz_nexus_3bfd90d6-0640-4f63-a578-76277ce9c7c6 e5551cbe-4f05-4492-848b-d81cc4eb9e34 in service none none off + oxp_128b0f04-229b-48dc-9c5c-555cb5723ed8/crypt/zone/oxz_ntp_9ec70cc1-a22d-40df-9697-8a4db3c72d74 46517374-da65-4bea-b454-90b627390e1e in service none none off + oxp_128b0f04-229b-48dc-9c5c-555cb5723ed8/crypt/debug 0ae02446-22d0-408c-9586-4b334d3958fb in service 100 GiB none gzip-9 + oxp_43ae0f4e-b0cf-4d74-8636-df0567ba01e6/crypt/debug a6aeb394-e1b2-42f0-9e2f-3859debcd829 in service 100 GiB none gzip-9 + oxp_4e9806d0-41cd-48c2-86ef-7f815c3ce3b1/crypt/debug e5e4be98-f1ec-46df-ae3f-6244e89ad97e in service 100 GiB none gzip-9 + oxp_70bb6d98-111f-4015-9d97-9ef1b2d6dcac/crypt/debug bac32918-715d-4011-ac63-20febaf734d3 in service 100 GiB none gzip-9 + oxp_7ce5029f-703c-4c08-8164-9af9cf1acf23/crypt/debug 904efd19-34cf-47ff-9e8b-637b344d869a in service 100 GiB none gzip-9 + oxp_b113c11f-44e6-4fb4-a56e-1d91bd652faf/crypt/debug 891b924c-668d-4e09-a237-fbf3d1baae8a in service 100 GiB none gzip-9 + oxp_bf149c80-2498-481c-9989-6344da914081/crypt/debug 1ba3e5a1-9023-490a-9620-e909ca13276a in service 100 GiB none gzip-9 + oxp_c69b6237-09f9-45aa-962c-5dbdd1d894be/crypt/debug 8394620a-43ed-4455-bf61-861a465abf0e in service 100 GiB none gzip-9 + oxp_ccd5a87b-00ae-42ad-85da-b37d70436cb1/crypt/debug 79527a9d-5967-4e8d-81c1-1d7abbd4e226 in service 100 GiB none gzip-9 + oxp_d7410a1c-e01d-49a4-be9c-f861f086760a/crypt/debug a2fe585f-e674-475d-94d6-f22c72d6d454 in service 100 GiB none gzip-9 + + omicron zones at generation 2: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -165,6 +273,59 @@ parent: 02697f74-b14a-4418-90f0-c28b2a3a6aa9 fake-vendor fake-model serial-fe1d5b9f-8db7-4e2d-bf17-c4b80e1f897c + datasets at generation 2: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_44fa7024-c2bc-4d2c-b478-c4997e4aece8/crucible 46e16066-441b-40b5-90da-858ea4d74d2d in service none none off + oxp_5265edc6-debf-4687-a758-a9746893ebd3/crucible 498e4d41-f8a8-4c14-a4e2-71d2b1decfcd in service none none off + oxp_532fbd69-b472-4445-86af-4c4c85afb313/crucible c8ef5f1a-4178-43ad-b0e1-79221e44987d in service none none off + oxp_54fd6fa6-ce3c-4abe-8c9d-7e107e159e84/crucible a427d44c-c036-417c-9254-d6c992b8b2f6 in service none none off + oxp_8562317c-4736-4cfc-9292-7dcab96a6fee/crucible 2ea203f3-c563-4a5c-a63c-3973513784de in service none none off + oxp_9a1327e4-d11b-4d98-8454-8c41862e9832/crucible cc5f848d-6fde-42b2-af38-07049da3a88f in service none none off + oxp_bf9d6692-64bc-459a-87dd-e7a83080a210/crucible d5619829-6b1e-48fa-8d2f-07ebbac995db in service none none off + oxp_ce1c13f3-bef2-4306-b0f2-4e39bd4a18b6/crucible b45102ca-a709-4e86-b41d-ab41b1eeec46 in service none none off + oxp_f931ec80-a3e3-4adb-a8ba-fa5adbd2294c/crucible c24ade2e-c994-4d09-ad18-0d7f12e23bab in service none none off + oxp_fe1d5b9f-8db7-4e2d-bf17-c4b80e1f897c/crucible 23b89730-f252-48fd-a813-33798c05b641 in service none none off + oxp_44fa7024-c2bc-4d2c-b478-c4997e4aece8/crypt/external_dns 7aa8f7da-fb93-4a57-8a90-2294429a6338 in service none none off + oxp_44fa7024-c2bc-4d2c-b478-c4997e4aece8/crypt/internal_dns ca1f5e8a-125a-4062-8eac-5f027dd5fd42 in service none none off + oxp_44fa7024-c2bc-4d2c-b478-c4997e4aece8/crypt/zone 7dbc438c-4e61-4c9c-8b40-970f61e6d2cb in service none none off + oxp_5265edc6-debf-4687-a758-a9746893ebd3/crypt/zone b5cf56eb-f9f7-4ad2-9eef-105485397e01 in service none none off + oxp_532fbd69-b472-4445-86af-4c4c85afb313/crypt/zone b6cf562b-50c1-4533-930d-fc882f22df60 in service none none off + oxp_54fd6fa6-ce3c-4abe-8c9d-7e107e159e84/crypt/zone 757a9351-2213-4005-9693-5efa04e62078 in service none none off + oxp_8562317c-4736-4cfc-9292-7dcab96a6fee/crypt/zone 9645f4e7-4381-4273-9e05-f076909f0624 in service none none off + oxp_9a1327e4-d11b-4d98-8454-8c41862e9832/crypt/zone 30f3927c-6236-4309-823b-17434e789769 in service none none off + oxp_bf9d6692-64bc-459a-87dd-e7a83080a210/crypt/zone 3f75edf4-fc61-49a9-ad48-f5d862acf1d9 in service none none off + oxp_ce1c13f3-bef2-4306-b0f2-4e39bd4a18b6/crypt/zone b48862cf-a4e1-4d82-8972-e6b8f81935df in service none none off + oxp_f931ec80-a3e3-4adb-a8ba-fa5adbd2294c/crypt/zone 46ced90c-8271-425f-bd29-818df820ceed in service none none off + oxp_fe1d5b9f-8db7-4e2d-bf17-c4b80e1f897c/crypt/zone ed9705a1-0faa-43c5-a119-33bf687420db in service none none off + oxp_54fd6fa6-ce3c-4abe-8c9d-7e107e159e84/crypt/zone/oxz_crucible_157d5b03-6897-4e80-9357-3cf733efe4b5 9f018b3f-8d6a-4c70-a0af-71d4ec3291ef in service none none off + oxp_9a1327e4-d11b-4d98-8454-8c41862e9832/crypt/zone/oxz_crucible_7341456c-4c6c-4bb7-8be4-2acac834886f bbe5126e-153a-4dfb-877e-99bb5e06c38b in service none none off + oxp_532fbd69-b472-4445-86af-4c4c85afb313/crypt/zone/oxz_crucible_793a6315-a07b-4fcf-a0b4-633d5c53b8cf 4dd3109a-0075-4e0a-a7fb-60e17e81b14c in service none none off + oxp_fe1d5b9f-8db7-4e2d-bf17-c4b80e1f897c/crypt/zone/oxz_crucible_7ce8eb07-58a7-4f1d-ba61-16db33b6fedd 2e392293-b820-4ca8-92d6-00b0ceb590ff in service none none off + oxp_8562317c-4736-4cfc-9292-7dcab96a6fee/crypt/zone/oxz_crucible_9915de3b-8104-40ca-a6b5-46132d26bb15 fcf438a5-0536-4552-a497-65f2690f8716 in service none none off + oxp_ce1c13f3-bef2-4306-b0f2-4e39bd4a18b6/crypt/zone/oxz_crucible_a975d276-7434-4def-8f5b-f250657d1040 0c27cdbb-2a36-4dda-a33f-92b2d8f2490c in service none none off + oxp_5265edc6-debf-4687-a758-a9746893ebd3/crypt/zone/oxz_crucible_b41461de-6b60-4d35-ad90-336eb1fa9874 a6939bff-0598-4307-ab4e-974c93e6d9d1 in service none none off + oxp_bf9d6692-64bc-459a-87dd-e7a83080a210/crypt/zone/oxz_crucible_d1374f2f-e9ba-4046-ba0b-83da927ba0d3 262de58b-a9af-4e84-9959-74f976b1ae84 in service none none off + oxp_44fa7024-c2bc-4d2c-b478-c4997e4aece8/crypt/zone/oxz_crucible_dc3c9584-44d8-4be6-b215-2df289f5763d 45dc1ef8-71be-48c7-b0a6-4aff2fdb278d in service none none off + oxp_f931ec80-a3e3-4adb-a8ba-fa5adbd2294c/crypt/zone/oxz_crucible_e70d6f37-d0a6-4309-93b5-4f2f72b779a7 8c2c7164-32bd-464c-9cfb-ce67fb629a17 in service none none off + oxp_44fa7024-c2bc-4d2c-b478-c4997e4aece8/crypt/zone/oxz_crucible_pantry_efa9fb1c-9431-4072-877d-ff33d9d926ba b774320b-b074-4087-8f1a-96bb8af4e6d8 in service none none off + oxp_44fa7024-c2bc-4d2c-b478-c4997e4aece8/crypt/zone/oxz_external_dns_761999e7-cf90-412c-91d8-f3247507edbc 2a869c5d-96f4-447b-aeeb-894a8a25ba57 in service none none off + oxp_44fa7024-c2bc-4d2c-b478-c4997e4aece8/crypt/zone/oxz_internal_dns_a2708dbc-a751-4c26-a1ed-6eaadf3402cf 79f79ab3-455d-4a63-ac40-994c3a87949c in service none none off + oxp_44fa7024-c2bc-4d2c-b478-c4997e4aece8/crypt/zone/oxz_nexus_ba910747-f596-4088-a2d4-4372ee883dfd a5e11e7e-f4ad-4267-9d25-faa178d4e71a in service none none off + oxp_44fa7024-c2bc-4d2c-b478-c4997e4aece8/crypt/zone/oxz_ntp_4bb07cd6-dc94-4601-ac22-c7ad972735b3 b0fd5aa5-cc94-4657-baf4-72dc2923b8c7 in service none none off + oxp_44fa7024-c2bc-4d2c-b478-c4997e4aece8/crypt/debug a9c81633-6193-4901-8a82-5a4ba5ffe21a in service 100 GiB none gzip-9 + oxp_5265edc6-debf-4687-a758-a9746893ebd3/crypt/debug b00b2487-9ef0-4f62-b0fe-c9e9e59829d0 in service 100 GiB none gzip-9 + oxp_532fbd69-b472-4445-86af-4c4c85afb313/crypt/debug c752d2d9-533e-4f8f-b3de-c710e6f3403e in service 100 GiB none gzip-9 + oxp_54fd6fa6-ce3c-4abe-8c9d-7e107e159e84/crypt/debug 5f955569-de9f-4fdd-be72-450b945cf182 in service 100 GiB none gzip-9 + oxp_8562317c-4736-4cfc-9292-7dcab96a6fee/crypt/debug dccfc806-60fd-4b77-b99f-caad7e75d412 in service 100 GiB none gzip-9 + oxp_9a1327e4-d11b-4d98-8454-8c41862e9832/crypt/debug 6d20dd39-78b9-46fc-a337-f97030c1eeae in service 100 GiB none gzip-9 + oxp_bf9d6692-64bc-459a-87dd-e7a83080a210/crypt/debug 527d52ad-cafa-4b62-bebc-f2d75b708573 in service 100 GiB none gzip-9 + oxp_ce1c13f3-bef2-4306-b0f2-4e39bd4a18b6/crypt/debug 50a3e065-a98d-431d-8147-818e50c03445 in service 100 GiB none gzip-9 + oxp_f931ec80-a3e3-4adb-a8ba-fa5adbd2294c/crypt/debug 826b0fa6-4f9a-4efe-843a-009b239c102a in service 100 GiB none gzip-9 + oxp_fe1d5b9f-8db7-4e2d-bf17-c4b80e1f897c/crypt/debug 0510a6c1-558b-4038-96e4-7cd9209e5da4 in service 100 GiB none gzip-9 + + omicron zones at generation 2: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -261,6 +422,20 @@ parent: 02697f74-b14a-4418-90f0-c28b2a3a6aa9 fake-vendor fake-model serial-f931ec80-a3e3-4adb-a8ba-fa5adbd2294c + datasets at generation 2: + ----------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ----------------------------------------------------------------------------------------------------------------------------------------------- + oxp_44fa7024-c2bc-4d2c-b478-c4997e4aece8/crypt/zone 819bb07a-b7be-4741-899a-62a2d7899032 in service none none off + oxp_8562317c-4736-4cfc-9292-7dcab96a6fee/crypt/zone a63be222-b12b-40ec-9dd4-3a0068c6a578 in service none none off + oxp_ce1c13f3-bef2-4306-b0f2-4e39bd4a18b6/crypt/zone 750d6910-096b-4f39-a8b5-d8f09c80d3db in service none none off + oxp_f931ec80-a3e3-4adb-a8ba-fa5adbd2294c/crypt/zone a16b5eaa-346d-4516-8af2-5154697c5d72 in service none none off + oxp_44fa7024-c2bc-4d2c-b478-c4997e4aece8/crypt/debug 137ee88a-d89a-41a7-95d0-53e59f03a8e6 in service 100 GiB none gzip-9 + oxp_8562317c-4736-4cfc-9292-7dcab96a6fee/crypt/debug 67ebc7eb-f34d-4c8c-bd5c-6c69caf142af in service 100 GiB none gzip-9 + oxp_ce1c13f3-bef2-4306-b0f2-4e39bd4a18b6/crypt/debug 673a9c1d-d762-4328-adbe-1fe1a158cc32 in service 100 GiB none gzip-9 + oxp_f931ec80-a3e3-4adb-a8ba-fa5adbd2294c/crypt/debug d2c79018-e2df-4258-893b-fb7b6cacce44 in service 100 GiB none gzip-9 + + omicron zones at generation 1: ----------------------------------------------- zone type zone id disposition underlay IP diff --git a/dev-tools/reconfigurator-cli/tests/output/cmd-expunge-newly-added-stdout b/dev-tools/reconfigurator-cli/tests/output/cmd-expunge-newly-added-stdout index 3b722317b18..b19d67d78f1 100644 --- a/dev-tools/reconfigurator-cli/tests/output/cmd-expunge-newly-added-stdout +++ b/dev-tools/reconfigurator-cli/tests/output/cmd-expunge-newly-added-stdout @@ -28,6 +28,61 @@ parent: 06c88262-f435-410e-ba98-101bed41ec27 fake-vendor fake-model serial-fb29d469-7d3f-47b9-944c-ce817fc70370 + datasets at generation 2: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crucible 7426782a-b56d-4bcd-a061-ef999680a483 in service none none off + oxp_3f8c9484-06e8-4662-9a90-aa7e92c43405/crucible ca4f4d56-e1be-4535-abc7-fa5e131f5be4 in service none none off + oxp_4a62a827-4bf3-45d5-a7f5-d080f25c61ef/crucible 60b31115-e269-4cc6-967a-1bd86632ce6e in service none none off + oxp_5f774f00-52b7-41b5-a57f-6f38037196f5/crucible 6081371a-e229-4168-9706-99ed750d0beb in service none none off + oxp_68ae41d4-99ed-4612-99e1-fecf795ca694/crucible 3304ddb3-a458-4852-9955-2fae08196d35 in service none none off + oxp_6a66241b-b595-423d-84ef-a81b5d8430e8/crucible ba9a2005-5bc2-414d-ae3a-fffd398d4b78 in service none none off + oxp_7c45c3f6-6369-40d9-a73f-2f7ed0afe96b/crucible 7fd796bb-369b-4f22-b552-f45ce12836b4 in service none none off + oxp_a216d334-4a9a-49dd-8b13-20548839306c/crucible a8d0b8ae-fec4-4c7e-b286-869d6f888616 in service none none off + oxp_c9ff8eb0-807c-40ad-a5c4-0d534947c9ad/crucible c0071842-4e56-40e9-a53a-0ea8242a66f4 in service none none off + oxp_fb29d469-7d3f-47b9-944c-ce817fc70370/crucible 1463807d-6615-4643-95e2-8cfcfdffc5a2 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/clickhouse b5197e35-15e8-423e-931f-ba32b3842eef in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/external_dns 65abb419-b456-4cac-9ca5-bcd823457692 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/internal_dns d17fa7c3-e285-4725-9f69-185708d1d55c in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone f68397e5-da5d-4d93-94a4-b68951f30522 in service none none off + oxp_3f8c9484-06e8-4662-9a90-aa7e92c43405/crypt/zone 6d833180-97ee-461b-8cbd-62007f3172e3 in service none none off + oxp_4a62a827-4bf3-45d5-a7f5-d080f25c61ef/crypt/zone 085f6578-6bb9-4cd6-9274-aa50a274fddb in service none none off + oxp_5f774f00-52b7-41b5-a57f-6f38037196f5/crypt/zone 0de067e1-b626-494a-9d41-03de4036c922 in service none none off + oxp_68ae41d4-99ed-4612-99e1-fecf795ca694/crypt/zone 0b76c44a-1d99-460d-87fd-3ae5c8b241b9 in service none none off + oxp_6a66241b-b595-423d-84ef-a81b5d8430e8/crypt/zone cb33c02a-6db4-402b-adcf-919957342c84 in service none none off + oxp_7c45c3f6-6369-40d9-a73f-2f7ed0afe96b/crypt/zone 9ea4aca6-ac88-4550-a4fd-10ddfd94e01e in service none none off + oxp_a216d334-4a9a-49dd-8b13-20548839306c/crypt/zone b5e5d272-964b-40b7-9d03-fb92c4b491c0 in service none none off + oxp_c9ff8eb0-807c-40ad-a5c4-0d534947c9ad/crypt/zone 219249df-e43f-4ee3-a4e2-eaa09b085d9a in service none none off + oxp_fb29d469-7d3f-47b9-944c-ce817fc70370/crypt/zone e49ad6e5-2d96-4a2a-8e50-202d97d7f424 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_clickhouse_e9d3a6d6-6e95-4ec8-a857-a3ab1ce6e62d 6ee081c5-9830-4d6b-83a1-56f307b893fd in service none none off + oxp_6a66241b-b595-423d-84ef-a81b5d8430e8/crypt/zone/oxz_crucible_53491964-307a-45f6-b277-79a5e90f20b7 80cb8976-735e-488d-8ff1-c49ec2bf4d4d in service none none off + oxp_fb29d469-7d3f-47b9-944c-ce817fc70370/crypt/zone/oxz_crucible_777087c0-4fb9-43ed-846b-16aa6431a272 a03c380c-735d-434a-8e5c-6a39dfd1d54e in service none none off + oxp_68ae41d4-99ed-4612-99e1-fecf795ca694/crypt/zone/oxz_crucible_78a45052-138b-47ee-877d-e73143467c8a 6f8bfed8-9387-4ef9-b307-873f072d349e in service none none off + oxp_4a62a827-4bf3-45d5-a7f5-d080f25c61ef/crypt/zone/oxz_crucible_8ec567c1-6776-4573-bfe5-f3041165fdca 8886085a-1920-479b-ad17-7858a690aab1 in service none none off + oxp_c9ff8eb0-807c-40ad-a5c4-0d534947c9ad/crypt/zone/oxz_crucible_8ef7ff46-81f7-4f16-aa8f-0c1957589a5f 5579e9a2-eda0-4343-bb3a-7cf6d6910c3e in service none none off + oxp_3f8c9484-06e8-4662-9a90-aa7e92c43405/crypt/zone/oxz_crucible_af3e8274-151f-4cb1-990c-b0a7680ff210 d773abef-bfdb-4c60-ba3d-8a980c9c50ed in service none none off + oxp_5f774f00-52b7-41b5-a57f-6f38037196f5/crypt/zone/oxz_crucible_c3114d7e-07cd-4d80-b82b-49ccbe856af2 80da4d1c-b800-4f92-95ff-0e3f6e6b6eec in service none none off + oxp_a216d334-4a9a-49dd-8b13-20548839306c/crypt/zone/oxz_crucible_d23b5191-04de-4b48-8599-cf866ffc06e8 8a7040dd-acf5-406f-9794-bb9844716585 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_crucible_efdbf061-321c-47d6-bf0f-4530ec4c287e 2b5f60f5-7830-4cf4-9051-a6a6dc470b66 in service none none off + oxp_7c45c3f6-6369-40d9-a73f-2f7ed0afe96b/crypt/zone/oxz_crucible_f31ab1c5-0f23-44dc-8504-c67c65afc11e 344481c4-02ad-4759-82c3-4986566f76bf in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_crucible_pantry_07738018-1b2a-4efc-8c5c-bd6b7a5d7b40 a4ca94e6-55de-405c-8a33-422ed5938bd3 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_external_dns_1b37911d-c427-4bf1-90d3-b2d0c2e98825 06af733b-6f79-4d4d-aef5-e18068a795df in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_internal_dns_7a1bd482-74f8-4562-b1db-c8bad16afb44 d648ac4b-0c2d-407b-84a5-05c25b24c463 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_nexus_ed2d3be3-fcee-4f6b-bb99-a1a9130c4eeb a16bbe93-af8c-45bc-86ee-caff9ae76d17 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_ntp_8c368ed6-6c91-4437-b8ff-0d789193db38 dac5975a-67f3-44d7-9b0c-46a9f616ef4e in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/debug 86c4d965-971c-48fb-891d-9f63232d1577 in service 100 GiB none gzip-9 + oxp_3f8c9484-06e8-4662-9a90-aa7e92c43405/crypt/debug b3d9c2e2-c06d-4a99-bf4a-c8613691615a in service 100 GiB none gzip-9 + oxp_4a62a827-4bf3-45d5-a7f5-d080f25c61ef/crypt/debug 5c8561d4-afac-436b-b32c-e8dc44daa98a in service 100 GiB none gzip-9 + oxp_5f774f00-52b7-41b5-a57f-6f38037196f5/crypt/debug c518735e-1306-4fbf-9ba4-010196249ee3 in service 100 GiB none gzip-9 + oxp_68ae41d4-99ed-4612-99e1-fecf795ca694/crypt/debug 8b416b54-73b0-4fda-8d10-6823b67aa044 in service 100 GiB none gzip-9 + oxp_6a66241b-b595-423d-84ef-a81b5d8430e8/crypt/debug 8194dbad-3f65-43d1-a7e0-50b23a81b674 in service 100 GiB none gzip-9 + oxp_7c45c3f6-6369-40d9-a73f-2f7ed0afe96b/crypt/debug ad878e0e-831b-4f0b-9417-1b17c5f5f744 in service 100 GiB none gzip-9 + oxp_a216d334-4a9a-49dd-8b13-20548839306c/crypt/debug 5d15a682-d4ca-40be-8cf9-3cdc934c3787 in service 100 GiB none gzip-9 + oxp_c9ff8eb0-807c-40ad-a5c4-0d534947c9ad/crypt/debug 5735d96e-efef-448d-8e40-cf0dc73a2c04 in service 100 GiB none gzip-9 + oxp_fb29d469-7d3f-47b9-944c-ce817fc70370/crypt/debug 19c25551-a54c-47b6-8495-dbd51ed8e384 in service 100 GiB none gzip-9 + + omicron zones at generation 2: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -69,6 +124,59 @@ parent: 06c88262-f435-410e-ba98-101bed41ec27 fake-vendor fake-model serial-f1a041cc-85c7-4d14-8fc0-8d0e417f7e24 + datasets at generation 2: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crucible 086f43f3-c939-4b81-8b42-a5cf1495e21a in service none none off + oxp_44882b6c-5e19-418b-b6c3-065f2af5a557/crucible 924b3557-8ab5-4edf-9c27-6617b89c7cdb in service none none off + oxp_6de47efc-8a6d-4108-bf82-0146eab3be06/crucible ce82dc53-7e11-4403-be4b-2e9079126609 in service none none off + oxp_80e2c62f-052c-4580-8252-7af238fbbe9c/crucible 39b7090c-574e-4fbc-8d06-c0b04e989e22 in service none none off + oxp_81d326ae-5f8a-4ffd-9d5e-a9e8246ac014/crucible 867c9991-9dd1-46b5-989a-dfa280ccd135 in service none none off + oxp_878af5a0-7810-43e5-bdd5-a3215242459a/crucible 4eae99b0-4319-4dcf-b2b4-22dab063b7fa in service none none off + oxp_af59fef5-8258-4852-be1d-ce55ae7dc822/crucible 0284b755-6ab8-427c-9e8c-e078c7369f04 in service none none off + oxp_b16aa11f-6e49-44c1-abcb-2e7584bffa12/crucible 99a6bc05-1c43-455d-8b50-7e9e08a12602 in service none none off + oxp_f173c79b-a3b4-4f4a-a983-bc94b6b1a616/crucible 4f8aafc8-21a7-4c64-9613-21b8d5162ed2 in service none none off + oxp_f1a041cc-85c7-4d14-8fc0-8d0e417f7e24/crucible 004d26f7-f145-41c7-b708-1bffbaa31250 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/external_dns 2ab4f9d3-6497-4d4b-bc61-daab02e40086 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/internal_dns fe27f0e0-acf4-4868-858e-b7c33bf904f3 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone c06bd208-d236-48d1-a8c0-b6d523b3fc3e in service none none off + oxp_44882b6c-5e19-418b-b6c3-065f2af5a557/crypt/zone 4ffdc4b3-694c-4c99-8e76-80df0ca3b2a4 in service none none off + oxp_6de47efc-8a6d-4108-bf82-0146eab3be06/crypt/zone 5759f27e-3767-42df-9a76-4665267435c4 in service none none off + oxp_80e2c62f-052c-4580-8252-7af238fbbe9c/crypt/zone ea67cf51-95cf-40a1-af30-5d01b4e3537d in service none none off + oxp_81d326ae-5f8a-4ffd-9d5e-a9e8246ac014/crypt/zone fa8d69c3-525e-4b9c-882d-1f31221e13b9 in service none none off + oxp_878af5a0-7810-43e5-bdd5-a3215242459a/crypt/zone f36eed10-3342-40db-a91a-724995c775f4 in service none none off + oxp_af59fef5-8258-4852-be1d-ce55ae7dc822/crypt/zone dec78c6b-0b4d-48a0-b471-8c0b357d2d5c in service none none off + oxp_b16aa11f-6e49-44c1-abcb-2e7584bffa12/crypt/zone 1b14f925-2368-4251-b303-07b193e88d0d in service none none off + oxp_f173c79b-a3b4-4f4a-a983-bc94b6b1a616/crypt/zone 511e9dc3-19d9-4e65-b670-a7123f086197 in service none none off + oxp_f1a041cc-85c7-4d14-8fc0-8d0e417f7e24/crypt/zone 70b97568-5812-4246-8bd7-eae3be369fb9 in service none none off + oxp_6de47efc-8a6d-4108-bf82-0146eab3be06/crypt/zone/oxz_crucible_426cd521-e6ad-4a67-ad8d-a1acef5eab5e 381cb9c8-ee74-4b4d-adfb-f659933bdfec in service none none off + oxp_f173c79b-a3b4-4f4a-a983-bc94b6b1a616/crypt/zone/oxz_crucible_4a392139-7423-459b-b1c9-5903421be40c e57920ec-4bbc-4e93-906c-53e04bca6dc6 in service none none off + oxp_44882b6c-5e19-418b-b6c3-065f2af5a557/crypt/zone/oxz_crucible_51e403e5-a703-4cfb-b044-c72c52885e82 e7656c10-357a-427a-9e31-9b0462f0126d in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_crucible_55a2094a-9590-442f-8203-dffe5a76ae66 f3d6bda9-83c1-40c5-bbd0-4d6ef040c6f8 in service none none off + oxp_81d326ae-5f8a-4ffd-9d5e-a9e8246ac014/crypt/zone/oxz_crucible_758d9a91-7070-43e3-8c60-ea1d0f818a12 0821ec11-cd56-4215-9199-6f3ea4fc92d5 in service none none off + oxp_878af5a0-7810-43e5-bdd5-a3215242459a/crypt/zone/oxz_crucible_8e4d80f8-80ea-48ac-ad47-95501c0c3fbe 9617a578-3d42-4e91-b4aa-48c0e718a9ae in service none none off + oxp_f1a041cc-85c7-4d14-8fc0-8d0e417f7e24/crypt/zone/oxz_crucible_cbf109e0-cdd5-48f9-8998-e9f55c9be980 a2a01591-b10e-46a0-b91f-633c433c269b in service none none off + oxp_b16aa11f-6e49-44c1-abcb-2e7584bffa12/crypt/zone/oxz_crucible_d60cc034-46c4-4233-8066-4008e947d904 0960a21d-c165-47ca-bd48-287e01168038 in service none none off + oxp_af59fef5-8258-4852-be1d-ce55ae7dc822/crypt/zone/oxz_crucible_f24b63e6-2382-4862-90bf-c39e42aad988 31f2b888-9f13-4584-878f-431c3d65c3b5 in service none none off + oxp_80e2c62f-052c-4580-8252-7af238fbbe9c/crypt/zone/oxz_crucible_fddd2bd6-a535-4e2c-9a36-cb90d048c0b7 69c63a34-be5f-4e62-bf44-e0902b1996dd in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_crucible_pantry_eb4f0a57-7386-4216-bcb2-874d39aae836 636c3b45-4c7b-46a1-9852-ccbf5380ca23 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_external_dns_47387358-e16d-4c34-b8f7-1f3f12c662eb 2cb6c311-5478-497c-afb0-672998b013b8 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_internal_dns_edb6573c-3621-4d95-ad3b-93a088caeea5 f93c3b9e-88e2-4e2d-8df1-3e3fe9e1705f in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_nexus_2cea0275-1fbc-410c-819e-2ec54ffeeffe 94b7f78b-bb21-493d-85de-6ae9bfd9a2f2 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_ntp_6e1cdf48-6846-4bb3-8a72-8bc1e8d5b21d e292f06d-aed2-4363-926c-1ca27866fb83 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/debug ae33e813-ae6f-4744-a335-9eb96d66c717 in service 100 GiB none gzip-9 + oxp_44882b6c-5e19-418b-b6c3-065f2af5a557/crypt/debug 1b4b24fb-db9e-4edc-a934-8d4ef8527879 in service 100 GiB none gzip-9 + oxp_6de47efc-8a6d-4108-bf82-0146eab3be06/crypt/debug 690c814f-6000-444b-b488-a90937eb07ca in service 100 GiB none gzip-9 + oxp_80e2c62f-052c-4580-8252-7af238fbbe9c/crypt/debug c31e1ff2-6d54-4c3d-96bd-9bf697e37757 in service 100 GiB none gzip-9 + oxp_81d326ae-5f8a-4ffd-9d5e-a9e8246ac014/crypt/debug 7cc4ea30-7f2f-48fe-a58b-30e62f52e27f in service 100 GiB none gzip-9 + oxp_878af5a0-7810-43e5-bdd5-a3215242459a/crypt/debug 4e14806d-82e2-44b9-aff1-cf558c1910fb in service 100 GiB none gzip-9 + oxp_af59fef5-8258-4852-be1d-ce55ae7dc822/crypt/debug 597c0560-2cb6-486a-9e87-a0ad425c36da in service 100 GiB none gzip-9 + oxp_b16aa11f-6e49-44c1-abcb-2e7584bffa12/crypt/debug 23fbb19c-a9e9-4631-ab2b-d0b97de444c1 in service 100 GiB none gzip-9 + oxp_f173c79b-a3b4-4f4a-a983-bc94b6b1a616/crypt/debug e75ed71c-f3a3-429e-9bb4-22a24572a9d2 in service 100 GiB none gzip-9 + oxp_f1a041cc-85c7-4d14-8fc0-8d0e417f7e24/crypt/debug 83b408b5-02b6-4f06-bd08-f6a807d3c5e8 in service 100 GiB none gzip-9 + + omicron zones at generation 2: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -109,6 +217,59 @@ parent: 06c88262-f435-410e-ba98-101bed41ec27 fake-vendor fake-model serial-fa9ce87c-fa7c-4854-95bd-69b8f01c46f9 + datasets at generation 2: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crucible dd2ac836-55e7-4f13-a39f-24fbf9122dee in service none none off + oxp_6f8fa855-4f34-42db-a6e4-9d0090d6c828/crucible b1d078dc-62ee-433a-b8cf-854fefb22039 in service none none off + oxp_71450d62-791e-4068-9882-8a206a465fd9/crucible 91ea5860-a12b-458a-9b47-a3960e2d78b8 in service none none off + oxp_7b4ad242-8330-4c08-9588-c66782742678/crucible 9316a944-5d51-475a-ad89-8df8b4dd0863 in service none none off + oxp_9bf23b52-565e-4439-9728-edb603fa6c4e/crucible 8dabf037-8d33-47e3-95fc-ada8d20f1d44 in service none none off + oxp_c9476e3d-7745-4fa9-b336-b54ac5b08f56/crucible 1e28e523-e77a-4270-99d1-fd3810e1aad9 in service none none off + oxp_d2cd1e65-b63d-4748-895f-aafecc81e440/crucible 28ba9385-4ebf-49ce-9fa2-5c549ad1fded in service none none off + oxp_d4ad3cc1-956a-4444-81a6-da6a025f6df2/crucible fdc03ce9-b4f2-47aa-bff8-b0b2a05fe3b0 in service none none off + oxp_e1298a43-fa1a-4e6f-bcfa-b26996f69c50/crucible 7d9f72bd-23bc-40e6-97c5-a53ca255588d in service none none off + oxp_fa9ce87c-fa7c-4854-95bd-69b8f01c46f9/crucible bf673cd5-b04e-4088-b017-c7a714ce2b63 in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/external_dns 195da8dd-34fd-4e96-a949-b7329710133e in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/internal_dns 92ff6262-7b3c-4300-bb53-936bd3edce26 in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone 9d6ab53a-6474-4ed6-8beb-9be1758229f5 in service none none off + oxp_6f8fa855-4f34-42db-a6e4-9d0090d6c828/crypt/zone df385279-2886-4422-957f-88f1f382a90b in service none none off + oxp_71450d62-791e-4068-9882-8a206a465fd9/crypt/zone 97a12796-0555-47c5-a0d3-c136e0e919f6 in service none none off + oxp_7b4ad242-8330-4c08-9588-c66782742678/crypt/zone 39343108-efec-4643-80c8-1c741d045dad in service none none off + oxp_9bf23b52-565e-4439-9728-edb603fa6c4e/crypt/zone b58b762a-7124-4441-a334-16d552f576f3 in service none none off + oxp_c9476e3d-7745-4fa9-b336-b54ac5b08f56/crypt/zone 92c63f1f-4ba8-4a41-93c0-e227b3320eaa in service none none off + oxp_d2cd1e65-b63d-4748-895f-aafecc81e440/crypt/zone 434bf6e8-b885-441d-b944-9508b0c64311 in service none none off + oxp_d4ad3cc1-956a-4444-81a6-da6a025f6df2/crypt/zone 58e91146-8da0-449a-adab-6e93504c9bf0 in service none none off + oxp_e1298a43-fa1a-4e6f-bcfa-b26996f69c50/crypt/zone e56258ab-55c4-42ca-95e5-ea8bbeff84e1 in service none none off + oxp_fa9ce87c-fa7c-4854-95bd-69b8f01c46f9/crypt/zone e070deb1-5298-46fb-983f-b6e153e98cd7 in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_crucible_0903299a-6296-44f0-8ab9-7c70b5766a05 277b0d6a-bb61-4eb2-bd11-d750586b5fbc in service none none off + oxp_71450d62-791e-4068-9882-8a206a465fd9/crypt/zone/oxz_crucible_2b6b3cfd-4524-465b-ac6e-10be9ab6d4d4 5073cf86-7d36-4c98-9e34-559172a0bc84 in service none none off + oxp_e1298a43-fa1a-4e6f-bcfa-b26996f69c50/crypt/zone/oxz_crucible_3e0ff677-2ca8-4124-9fef-7c23ac2da6fa 028fc58f-16ea-4536-9f50-b4eeb1aa57c9 in service none none off + oxp_c9476e3d-7745-4fa9-b336-b54ac5b08f56/crypt/zone/oxz_crucible_512758d0-335f-4c94-9afe-c82f6f127421 f20e7661-c0c7-47cd-b08a-e7f5b76026d6 in service none none off + oxp_6f8fa855-4f34-42db-a6e4-9d0090d6c828/crypt/zone/oxz_crucible_8ae67b12-ca74-40d3-a55e-90456cd623ea 3f7802ee-87bb-48d6-a42d-657bd0f85c74 in service none none off + oxp_fa9ce87c-fa7c-4854-95bd-69b8f01c46f9/crypt/zone/oxz_crucible_918c8cbc-1c62-4de5-9cf2-c4153a3d1a7e 41d832ad-7b85-4214-b485-9ca2ed4f85d0 in service none none off + oxp_7b4ad242-8330-4c08-9588-c66782742678/crypt/zone/oxz_crucible_be422e7a-16d0-426e-8567-da0aed7200d4 e0fb453d-b22c-4d87-be9b-94f6113cb25a in service none none off + oxp_d2cd1e65-b63d-4748-895f-aafecc81e440/crypt/zone/oxz_crucible_ea50f438-1b5e-4d61-bd65-46d360f590ee 26a25185-a37f-4ead-8c81-77be56a21b0a in service none none off + oxp_9bf23b52-565e-4439-9728-edb603fa6c4e/crypt/zone/oxz_crucible_f055a042-9d1b-4931-8268-d94cac801d7e 998b0fb1-b562-4858-a9ae-c02296c7c6ed in service none none off + oxp_d4ad3cc1-956a-4444-81a6-da6a025f6df2/crypt/zone/oxz_crucible_f33e09d1-e3d7-4341-baf2-5f079f3679e5 aa4f1267-a83a-4081-b572-28e1860ff2f2 in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_crucible_pantry_100e20aa-1816-4195-8d76-08beace10332 032bf309-8046-4c96-9453-29b9346b19fc in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_external_dns_9995de32-dd52-4eb1-b0eb-141eb84bc739 f258d941-f8b3-4d0e-bbe6-773996a002d5 in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_internal_dns_171cabf0-8635-42e7-8ea1-2a1d2a2daf55 3531c6de-8d31-4917-bb72-884b6e168eca in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_nexus_5b01b0e0-5cdf-4b34-b0a6-c947cbbdb8be 5e3a1b9d-9475-4bd9-8112-5595a7c0da7d in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_ntp_7b4bccad-9869-48da-8320-2dc82752deea 45771e96-054c-4b05-8021-c32b23fcad8d in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/debug 29be83b4-4d0b-4787-819d-96e8e69301da in service 100 GiB none gzip-9 + oxp_6f8fa855-4f34-42db-a6e4-9d0090d6c828/crypt/debug ce433c69-7540-4a7a-9e11-dd30b0d2dc19 in service 100 GiB none gzip-9 + oxp_71450d62-791e-4068-9882-8a206a465fd9/crypt/debug 48cc9313-13c2-4ebe-8120-5b648ec26a28 in service 100 GiB none gzip-9 + oxp_7b4ad242-8330-4c08-9588-c66782742678/crypt/debug cdcfe435-881a-44dc-9dba-2a0fafdbf66d in service 100 GiB none gzip-9 + oxp_9bf23b52-565e-4439-9728-edb603fa6c4e/crypt/debug 835edc8b-9d33-45db-9bdc-ea8a956f3217 in service 100 GiB none gzip-9 + oxp_c9476e3d-7745-4fa9-b336-b54ac5b08f56/crypt/debug 1754b8f0-07b8-4305-8bb2-b347ba3e0b68 in service 100 GiB none gzip-9 + oxp_d2cd1e65-b63d-4748-895f-aafecc81e440/crypt/debug 7028b888-b4c0-43e5-a9d4-2e29d24f34a7 in service 100 GiB none gzip-9 + oxp_d4ad3cc1-956a-4444-81a6-da6a025f6df2/crypt/debug 36ad4fe9-3897-4777-bc0e-88f142594d07 in service 100 GiB none gzip-9 + oxp_e1298a43-fa1a-4e6f-bcfa-b26996f69c50/crypt/debug d37e0b8c-6c43-4e83-b3ec-238429d1cbfb in service 100 GiB none gzip-9 + oxp_fa9ce87c-fa7c-4854-95bd-69b8f01c46f9/crypt/debug b7569aa4-f0d6-4de0-9b9a-cd8d0a6cc01d in service 100 GiB none gzip-9 + + omicron zones at generation 2: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -170,6 +331,61 @@ parent: 3f00b694-1b16-4aaa-8f78-e6b3a527b434 fake-vendor fake-model serial-fb29d469-7d3f-47b9-944c-ce817fc70370 + datasets at generation 2: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crucible 7426782a-b56d-4bcd-a061-ef999680a483 in service none none off + oxp_3f8c9484-06e8-4662-9a90-aa7e92c43405/crucible ca4f4d56-e1be-4535-abc7-fa5e131f5be4 in service none none off + oxp_4a62a827-4bf3-45d5-a7f5-d080f25c61ef/crucible 60b31115-e269-4cc6-967a-1bd86632ce6e in service none none off + oxp_5f774f00-52b7-41b5-a57f-6f38037196f5/crucible 6081371a-e229-4168-9706-99ed750d0beb in service none none off + oxp_68ae41d4-99ed-4612-99e1-fecf795ca694/crucible 3304ddb3-a458-4852-9955-2fae08196d35 in service none none off + oxp_6a66241b-b595-423d-84ef-a81b5d8430e8/crucible ba9a2005-5bc2-414d-ae3a-fffd398d4b78 in service none none off + oxp_7c45c3f6-6369-40d9-a73f-2f7ed0afe96b/crucible 7fd796bb-369b-4f22-b552-f45ce12836b4 in service none none off + oxp_a216d334-4a9a-49dd-8b13-20548839306c/crucible a8d0b8ae-fec4-4c7e-b286-869d6f888616 in service none none off + oxp_c9ff8eb0-807c-40ad-a5c4-0d534947c9ad/crucible c0071842-4e56-40e9-a53a-0ea8242a66f4 in service none none off + oxp_fb29d469-7d3f-47b9-944c-ce817fc70370/crucible 1463807d-6615-4643-95e2-8cfcfdffc5a2 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/clickhouse b5197e35-15e8-423e-931f-ba32b3842eef in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/external_dns 65abb419-b456-4cac-9ca5-bcd823457692 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/internal_dns d17fa7c3-e285-4725-9f69-185708d1d55c in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone f68397e5-da5d-4d93-94a4-b68951f30522 in service none none off + oxp_3f8c9484-06e8-4662-9a90-aa7e92c43405/crypt/zone 6d833180-97ee-461b-8cbd-62007f3172e3 in service none none off + oxp_4a62a827-4bf3-45d5-a7f5-d080f25c61ef/crypt/zone 085f6578-6bb9-4cd6-9274-aa50a274fddb in service none none off + oxp_5f774f00-52b7-41b5-a57f-6f38037196f5/crypt/zone 0de067e1-b626-494a-9d41-03de4036c922 in service none none off + oxp_68ae41d4-99ed-4612-99e1-fecf795ca694/crypt/zone 0b76c44a-1d99-460d-87fd-3ae5c8b241b9 in service none none off + oxp_6a66241b-b595-423d-84ef-a81b5d8430e8/crypt/zone cb33c02a-6db4-402b-adcf-919957342c84 in service none none off + oxp_7c45c3f6-6369-40d9-a73f-2f7ed0afe96b/crypt/zone 9ea4aca6-ac88-4550-a4fd-10ddfd94e01e in service none none off + oxp_a216d334-4a9a-49dd-8b13-20548839306c/crypt/zone b5e5d272-964b-40b7-9d03-fb92c4b491c0 in service none none off + oxp_c9ff8eb0-807c-40ad-a5c4-0d534947c9ad/crypt/zone 219249df-e43f-4ee3-a4e2-eaa09b085d9a in service none none off + oxp_fb29d469-7d3f-47b9-944c-ce817fc70370/crypt/zone e49ad6e5-2d96-4a2a-8e50-202d97d7f424 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_clickhouse_e9d3a6d6-6e95-4ec8-a857-a3ab1ce6e62d 6ee081c5-9830-4d6b-83a1-56f307b893fd in service none none off + oxp_6a66241b-b595-423d-84ef-a81b5d8430e8/crypt/zone/oxz_crucible_53491964-307a-45f6-b277-79a5e90f20b7 80cb8976-735e-488d-8ff1-c49ec2bf4d4d in service none none off + oxp_fb29d469-7d3f-47b9-944c-ce817fc70370/crypt/zone/oxz_crucible_777087c0-4fb9-43ed-846b-16aa6431a272 a03c380c-735d-434a-8e5c-6a39dfd1d54e in service none none off + oxp_68ae41d4-99ed-4612-99e1-fecf795ca694/crypt/zone/oxz_crucible_78a45052-138b-47ee-877d-e73143467c8a 6f8bfed8-9387-4ef9-b307-873f072d349e in service none none off + oxp_4a62a827-4bf3-45d5-a7f5-d080f25c61ef/crypt/zone/oxz_crucible_8ec567c1-6776-4573-bfe5-f3041165fdca 8886085a-1920-479b-ad17-7858a690aab1 in service none none off + oxp_c9ff8eb0-807c-40ad-a5c4-0d534947c9ad/crypt/zone/oxz_crucible_8ef7ff46-81f7-4f16-aa8f-0c1957589a5f 5579e9a2-eda0-4343-bb3a-7cf6d6910c3e in service none none off + oxp_3f8c9484-06e8-4662-9a90-aa7e92c43405/crypt/zone/oxz_crucible_af3e8274-151f-4cb1-990c-b0a7680ff210 d773abef-bfdb-4c60-ba3d-8a980c9c50ed in service none none off + oxp_5f774f00-52b7-41b5-a57f-6f38037196f5/crypt/zone/oxz_crucible_c3114d7e-07cd-4d80-b82b-49ccbe856af2 80da4d1c-b800-4f92-95ff-0e3f6e6b6eec in service none none off + oxp_a216d334-4a9a-49dd-8b13-20548839306c/crypt/zone/oxz_crucible_d23b5191-04de-4b48-8599-cf866ffc06e8 8a7040dd-acf5-406f-9794-bb9844716585 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_crucible_efdbf061-321c-47d6-bf0f-4530ec4c287e 2b5f60f5-7830-4cf4-9051-a6a6dc470b66 in service none none off + oxp_7c45c3f6-6369-40d9-a73f-2f7ed0afe96b/crypt/zone/oxz_crucible_f31ab1c5-0f23-44dc-8504-c67c65afc11e 344481c4-02ad-4759-82c3-4986566f76bf in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_crucible_pantry_07738018-1b2a-4efc-8c5c-bd6b7a5d7b40 a4ca94e6-55de-405c-8a33-422ed5938bd3 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_external_dns_1b37911d-c427-4bf1-90d3-b2d0c2e98825 06af733b-6f79-4d4d-aef5-e18068a795df in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_internal_dns_7a1bd482-74f8-4562-b1db-c8bad16afb44 d648ac4b-0c2d-407b-84a5-05c25b24c463 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_nexus_ed2d3be3-fcee-4f6b-bb99-a1a9130c4eeb a16bbe93-af8c-45bc-86ee-caff9ae76d17 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_ntp_8c368ed6-6c91-4437-b8ff-0d789193db38 dac5975a-67f3-44d7-9b0c-46a9f616ef4e in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/debug 86c4d965-971c-48fb-891d-9f63232d1577 in service 100 GiB none gzip-9 + oxp_3f8c9484-06e8-4662-9a90-aa7e92c43405/crypt/debug b3d9c2e2-c06d-4a99-bf4a-c8613691615a in service 100 GiB none gzip-9 + oxp_4a62a827-4bf3-45d5-a7f5-d080f25c61ef/crypt/debug 5c8561d4-afac-436b-b32c-e8dc44daa98a in service 100 GiB none gzip-9 + oxp_5f774f00-52b7-41b5-a57f-6f38037196f5/crypt/debug c518735e-1306-4fbf-9ba4-010196249ee3 in service 100 GiB none gzip-9 + oxp_68ae41d4-99ed-4612-99e1-fecf795ca694/crypt/debug 8b416b54-73b0-4fda-8d10-6823b67aa044 in service 100 GiB none gzip-9 + oxp_6a66241b-b595-423d-84ef-a81b5d8430e8/crypt/debug 8194dbad-3f65-43d1-a7e0-50b23a81b674 in service 100 GiB none gzip-9 + oxp_7c45c3f6-6369-40d9-a73f-2f7ed0afe96b/crypt/debug ad878e0e-831b-4f0b-9417-1b17c5f5f744 in service 100 GiB none gzip-9 + oxp_a216d334-4a9a-49dd-8b13-20548839306c/crypt/debug 5d15a682-d4ca-40be-8cf9-3cdc934c3787 in service 100 GiB none gzip-9 + oxp_c9ff8eb0-807c-40ad-a5c4-0d534947c9ad/crypt/debug 5735d96e-efef-448d-8e40-cf0dc73a2c04 in service 100 GiB none gzip-9 + oxp_fb29d469-7d3f-47b9-944c-ce817fc70370/crypt/debug 19c25551-a54c-47b6-8495-dbd51ed8e384 in service 100 GiB none gzip-9 + + omicron zones at generation 2: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -211,6 +427,59 @@ parent: 3f00b694-1b16-4aaa-8f78-e6b3a527b434 fake-vendor fake-model serial-f1a041cc-85c7-4d14-8fc0-8d0e417f7e24 + datasets at generation 2: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crucible 086f43f3-c939-4b81-8b42-a5cf1495e21a in service none none off + oxp_44882b6c-5e19-418b-b6c3-065f2af5a557/crucible 924b3557-8ab5-4edf-9c27-6617b89c7cdb in service none none off + oxp_6de47efc-8a6d-4108-bf82-0146eab3be06/crucible ce82dc53-7e11-4403-be4b-2e9079126609 in service none none off + oxp_80e2c62f-052c-4580-8252-7af238fbbe9c/crucible 39b7090c-574e-4fbc-8d06-c0b04e989e22 in service none none off + oxp_81d326ae-5f8a-4ffd-9d5e-a9e8246ac014/crucible 867c9991-9dd1-46b5-989a-dfa280ccd135 in service none none off + oxp_878af5a0-7810-43e5-bdd5-a3215242459a/crucible 4eae99b0-4319-4dcf-b2b4-22dab063b7fa in service none none off + oxp_af59fef5-8258-4852-be1d-ce55ae7dc822/crucible 0284b755-6ab8-427c-9e8c-e078c7369f04 in service none none off + oxp_b16aa11f-6e49-44c1-abcb-2e7584bffa12/crucible 99a6bc05-1c43-455d-8b50-7e9e08a12602 in service none none off + oxp_f173c79b-a3b4-4f4a-a983-bc94b6b1a616/crucible 4f8aafc8-21a7-4c64-9613-21b8d5162ed2 in service none none off + oxp_f1a041cc-85c7-4d14-8fc0-8d0e417f7e24/crucible 004d26f7-f145-41c7-b708-1bffbaa31250 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/external_dns 2ab4f9d3-6497-4d4b-bc61-daab02e40086 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/internal_dns fe27f0e0-acf4-4868-858e-b7c33bf904f3 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone c06bd208-d236-48d1-a8c0-b6d523b3fc3e in service none none off + oxp_44882b6c-5e19-418b-b6c3-065f2af5a557/crypt/zone 4ffdc4b3-694c-4c99-8e76-80df0ca3b2a4 in service none none off + oxp_6de47efc-8a6d-4108-bf82-0146eab3be06/crypt/zone 5759f27e-3767-42df-9a76-4665267435c4 in service none none off + oxp_80e2c62f-052c-4580-8252-7af238fbbe9c/crypt/zone ea67cf51-95cf-40a1-af30-5d01b4e3537d in service none none off + oxp_81d326ae-5f8a-4ffd-9d5e-a9e8246ac014/crypt/zone fa8d69c3-525e-4b9c-882d-1f31221e13b9 in service none none off + oxp_878af5a0-7810-43e5-bdd5-a3215242459a/crypt/zone f36eed10-3342-40db-a91a-724995c775f4 in service none none off + oxp_af59fef5-8258-4852-be1d-ce55ae7dc822/crypt/zone dec78c6b-0b4d-48a0-b471-8c0b357d2d5c in service none none off + oxp_b16aa11f-6e49-44c1-abcb-2e7584bffa12/crypt/zone 1b14f925-2368-4251-b303-07b193e88d0d in service none none off + oxp_f173c79b-a3b4-4f4a-a983-bc94b6b1a616/crypt/zone 511e9dc3-19d9-4e65-b670-a7123f086197 in service none none off + oxp_f1a041cc-85c7-4d14-8fc0-8d0e417f7e24/crypt/zone 70b97568-5812-4246-8bd7-eae3be369fb9 in service none none off + oxp_6de47efc-8a6d-4108-bf82-0146eab3be06/crypt/zone/oxz_crucible_426cd521-e6ad-4a67-ad8d-a1acef5eab5e 381cb9c8-ee74-4b4d-adfb-f659933bdfec in service none none off + oxp_f173c79b-a3b4-4f4a-a983-bc94b6b1a616/crypt/zone/oxz_crucible_4a392139-7423-459b-b1c9-5903421be40c e57920ec-4bbc-4e93-906c-53e04bca6dc6 in service none none off + oxp_44882b6c-5e19-418b-b6c3-065f2af5a557/crypt/zone/oxz_crucible_51e403e5-a703-4cfb-b044-c72c52885e82 e7656c10-357a-427a-9e31-9b0462f0126d in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_crucible_55a2094a-9590-442f-8203-dffe5a76ae66 f3d6bda9-83c1-40c5-bbd0-4d6ef040c6f8 in service none none off + oxp_81d326ae-5f8a-4ffd-9d5e-a9e8246ac014/crypt/zone/oxz_crucible_758d9a91-7070-43e3-8c60-ea1d0f818a12 0821ec11-cd56-4215-9199-6f3ea4fc92d5 in service none none off + oxp_878af5a0-7810-43e5-bdd5-a3215242459a/crypt/zone/oxz_crucible_8e4d80f8-80ea-48ac-ad47-95501c0c3fbe 9617a578-3d42-4e91-b4aa-48c0e718a9ae in service none none off + oxp_f1a041cc-85c7-4d14-8fc0-8d0e417f7e24/crypt/zone/oxz_crucible_cbf109e0-cdd5-48f9-8998-e9f55c9be980 a2a01591-b10e-46a0-b91f-633c433c269b in service none none off + oxp_b16aa11f-6e49-44c1-abcb-2e7584bffa12/crypt/zone/oxz_crucible_d60cc034-46c4-4233-8066-4008e947d904 0960a21d-c165-47ca-bd48-287e01168038 in service none none off + oxp_af59fef5-8258-4852-be1d-ce55ae7dc822/crypt/zone/oxz_crucible_f24b63e6-2382-4862-90bf-c39e42aad988 31f2b888-9f13-4584-878f-431c3d65c3b5 in service none none off + oxp_80e2c62f-052c-4580-8252-7af238fbbe9c/crypt/zone/oxz_crucible_fddd2bd6-a535-4e2c-9a36-cb90d048c0b7 69c63a34-be5f-4e62-bf44-e0902b1996dd in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_crucible_pantry_eb4f0a57-7386-4216-bcb2-874d39aae836 636c3b45-4c7b-46a1-9852-ccbf5380ca23 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_external_dns_47387358-e16d-4c34-b8f7-1f3f12c662eb 2cb6c311-5478-497c-afb0-672998b013b8 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_internal_dns_edb6573c-3621-4d95-ad3b-93a088caeea5 f93c3b9e-88e2-4e2d-8df1-3e3fe9e1705f in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_nexus_2cea0275-1fbc-410c-819e-2ec54ffeeffe 94b7f78b-bb21-493d-85de-6ae9bfd9a2f2 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_ntp_6e1cdf48-6846-4bb3-8a72-8bc1e8d5b21d e292f06d-aed2-4363-926c-1ca27866fb83 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/debug ae33e813-ae6f-4744-a335-9eb96d66c717 in service 100 GiB none gzip-9 + oxp_44882b6c-5e19-418b-b6c3-065f2af5a557/crypt/debug 1b4b24fb-db9e-4edc-a934-8d4ef8527879 in service 100 GiB none gzip-9 + oxp_6de47efc-8a6d-4108-bf82-0146eab3be06/crypt/debug 690c814f-6000-444b-b488-a90937eb07ca in service 100 GiB none gzip-9 + oxp_80e2c62f-052c-4580-8252-7af238fbbe9c/crypt/debug c31e1ff2-6d54-4c3d-96bd-9bf697e37757 in service 100 GiB none gzip-9 + oxp_81d326ae-5f8a-4ffd-9d5e-a9e8246ac014/crypt/debug 7cc4ea30-7f2f-48fe-a58b-30e62f52e27f in service 100 GiB none gzip-9 + oxp_878af5a0-7810-43e5-bdd5-a3215242459a/crypt/debug 4e14806d-82e2-44b9-aff1-cf558c1910fb in service 100 GiB none gzip-9 + oxp_af59fef5-8258-4852-be1d-ce55ae7dc822/crypt/debug 597c0560-2cb6-486a-9e87-a0ad425c36da in service 100 GiB none gzip-9 + oxp_b16aa11f-6e49-44c1-abcb-2e7584bffa12/crypt/debug 23fbb19c-a9e9-4631-ab2b-d0b97de444c1 in service 100 GiB none gzip-9 + oxp_f173c79b-a3b4-4f4a-a983-bc94b6b1a616/crypt/debug e75ed71c-f3a3-429e-9bb4-22a24572a9d2 in service 100 GiB none gzip-9 + oxp_f1a041cc-85c7-4d14-8fc0-8d0e417f7e24/crypt/debug 83b408b5-02b6-4f06-bd08-f6a807d3c5e8 in service 100 GiB none gzip-9 + + omicron zones at generation 2: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -251,6 +520,59 @@ parent: 3f00b694-1b16-4aaa-8f78-e6b3a527b434 fake-vendor fake-model serial-fa9ce87c-fa7c-4854-95bd-69b8f01c46f9 + datasets at generation 3: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crucible dd2ac836-55e7-4f13-a39f-24fbf9122dee in service none none off + oxp_6f8fa855-4f34-42db-a6e4-9d0090d6c828/crucible b1d078dc-62ee-433a-b8cf-854fefb22039 in service none none off + oxp_71450d62-791e-4068-9882-8a206a465fd9/crucible 91ea5860-a12b-458a-9b47-a3960e2d78b8 in service none none off + oxp_7b4ad242-8330-4c08-9588-c66782742678/crucible 9316a944-5d51-475a-ad89-8df8b4dd0863 in service none none off + oxp_9bf23b52-565e-4439-9728-edb603fa6c4e/crucible 8dabf037-8d33-47e3-95fc-ada8d20f1d44 in service none none off + oxp_c9476e3d-7745-4fa9-b336-b54ac5b08f56/crucible 1e28e523-e77a-4270-99d1-fd3810e1aad9 in service none none off + oxp_d2cd1e65-b63d-4748-895f-aafecc81e440/crucible 28ba9385-4ebf-49ce-9fa2-5c549ad1fded in service none none off + oxp_d4ad3cc1-956a-4444-81a6-da6a025f6df2/crucible fdc03ce9-b4f2-47aa-bff8-b0b2a05fe3b0 in service none none off + oxp_e1298a43-fa1a-4e6f-bcfa-b26996f69c50/crucible 7d9f72bd-23bc-40e6-97c5-a53ca255588d in service none none off + oxp_fa9ce87c-fa7c-4854-95bd-69b8f01c46f9/crucible bf673cd5-b04e-4088-b017-c7a714ce2b63 in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/external_dns 195da8dd-34fd-4e96-a949-b7329710133e expunged none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/internal_dns 92ff6262-7b3c-4300-bb53-936bd3edce26 in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone 9d6ab53a-6474-4ed6-8beb-9be1758229f5 in service none none off + oxp_6f8fa855-4f34-42db-a6e4-9d0090d6c828/crypt/zone df385279-2886-4422-957f-88f1f382a90b in service none none off + oxp_71450d62-791e-4068-9882-8a206a465fd9/crypt/zone 97a12796-0555-47c5-a0d3-c136e0e919f6 in service none none off + oxp_7b4ad242-8330-4c08-9588-c66782742678/crypt/zone 39343108-efec-4643-80c8-1c741d045dad in service none none off + oxp_9bf23b52-565e-4439-9728-edb603fa6c4e/crypt/zone b58b762a-7124-4441-a334-16d552f576f3 in service none none off + oxp_c9476e3d-7745-4fa9-b336-b54ac5b08f56/crypt/zone 92c63f1f-4ba8-4a41-93c0-e227b3320eaa in service none none off + oxp_d2cd1e65-b63d-4748-895f-aafecc81e440/crypt/zone 434bf6e8-b885-441d-b944-9508b0c64311 in service none none off + oxp_d4ad3cc1-956a-4444-81a6-da6a025f6df2/crypt/zone 58e91146-8da0-449a-adab-6e93504c9bf0 in service none none off + oxp_e1298a43-fa1a-4e6f-bcfa-b26996f69c50/crypt/zone e56258ab-55c4-42ca-95e5-ea8bbeff84e1 in service none none off + oxp_fa9ce87c-fa7c-4854-95bd-69b8f01c46f9/crypt/zone e070deb1-5298-46fb-983f-b6e153e98cd7 in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_crucible_0903299a-6296-44f0-8ab9-7c70b5766a05 277b0d6a-bb61-4eb2-bd11-d750586b5fbc in service none none off + oxp_71450d62-791e-4068-9882-8a206a465fd9/crypt/zone/oxz_crucible_2b6b3cfd-4524-465b-ac6e-10be9ab6d4d4 5073cf86-7d36-4c98-9e34-559172a0bc84 in service none none off + oxp_e1298a43-fa1a-4e6f-bcfa-b26996f69c50/crypt/zone/oxz_crucible_3e0ff677-2ca8-4124-9fef-7c23ac2da6fa 028fc58f-16ea-4536-9f50-b4eeb1aa57c9 in service none none off + oxp_c9476e3d-7745-4fa9-b336-b54ac5b08f56/crypt/zone/oxz_crucible_512758d0-335f-4c94-9afe-c82f6f127421 f20e7661-c0c7-47cd-b08a-e7f5b76026d6 in service none none off + oxp_6f8fa855-4f34-42db-a6e4-9d0090d6c828/crypt/zone/oxz_crucible_8ae67b12-ca74-40d3-a55e-90456cd623ea 3f7802ee-87bb-48d6-a42d-657bd0f85c74 in service none none off + oxp_fa9ce87c-fa7c-4854-95bd-69b8f01c46f9/crypt/zone/oxz_crucible_918c8cbc-1c62-4de5-9cf2-c4153a3d1a7e 41d832ad-7b85-4214-b485-9ca2ed4f85d0 in service none none off + oxp_7b4ad242-8330-4c08-9588-c66782742678/crypt/zone/oxz_crucible_be422e7a-16d0-426e-8567-da0aed7200d4 e0fb453d-b22c-4d87-be9b-94f6113cb25a in service none none off + oxp_d2cd1e65-b63d-4748-895f-aafecc81e440/crypt/zone/oxz_crucible_ea50f438-1b5e-4d61-bd65-46d360f590ee 26a25185-a37f-4ead-8c81-77be56a21b0a in service none none off + oxp_9bf23b52-565e-4439-9728-edb603fa6c4e/crypt/zone/oxz_crucible_f055a042-9d1b-4931-8268-d94cac801d7e 998b0fb1-b562-4858-a9ae-c02296c7c6ed in service none none off + oxp_d4ad3cc1-956a-4444-81a6-da6a025f6df2/crypt/zone/oxz_crucible_f33e09d1-e3d7-4341-baf2-5f079f3679e5 aa4f1267-a83a-4081-b572-28e1860ff2f2 in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_crucible_pantry_100e20aa-1816-4195-8d76-08beace10332 032bf309-8046-4c96-9453-29b9346b19fc in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_external_dns_9995de32-dd52-4eb1-b0eb-141eb84bc739 f258d941-f8b3-4d0e-bbe6-773996a002d5 expunged none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_internal_dns_171cabf0-8635-42e7-8ea1-2a1d2a2daf55 3531c6de-8d31-4917-bb72-884b6e168eca in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_nexus_5b01b0e0-5cdf-4b34-b0a6-c947cbbdb8be 5e3a1b9d-9475-4bd9-8112-5595a7c0da7d in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_ntp_7b4bccad-9869-48da-8320-2dc82752deea 45771e96-054c-4b05-8021-c32b23fcad8d in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/debug 29be83b4-4d0b-4787-819d-96e8e69301da in service 100 GiB none gzip-9 + oxp_6f8fa855-4f34-42db-a6e4-9d0090d6c828/crypt/debug ce433c69-7540-4a7a-9e11-dd30b0d2dc19 in service 100 GiB none gzip-9 + oxp_71450d62-791e-4068-9882-8a206a465fd9/crypt/debug 48cc9313-13c2-4ebe-8120-5b648ec26a28 in service 100 GiB none gzip-9 + oxp_7b4ad242-8330-4c08-9588-c66782742678/crypt/debug cdcfe435-881a-44dc-9dba-2a0fafdbf66d in service 100 GiB none gzip-9 + oxp_9bf23b52-565e-4439-9728-edb603fa6c4e/crypt/debug 835edc8b-9d33-45db-9bdc-ea8a956f3217 in service 100 GiB none gzip-9 + oxp_c9476e3d-7745-4fa9-b336-b54ac5b08f56/crypt/debug 1754b8f0-07b8-4305-8bb2-b347ba3e0b68 in service 100 GiB none gzip-9 + oxp_d2cd1e65-b63d-4748-895f-aafecc81e440/crypt/debug 7028b888-b4c0-43e5-a9d4-2e29d24f34a7 in service 100 GiB none gzip-9 + oxp_d4ad3cc1-956a-4444-81a6-da6a025f6df2/crypt/debug 36ad4fe9-3897-4777-bc0e-88f142594d07 in service 100 GiB none gzip-9 + oxp_e1298a43-fa1a-4e6f-bcfa-b26996f69c50/crypt/debug d37e0b8c-6c43-4e83-b3ec-238429d1cbfb in service 100 GiB none gzip-9 + oxp_fa9ce87c-fa7c-4854-95bd-69b8f01c46f9/crypt/debug b7569aa4-f0d6-4de0-9b9a-cd8d0a6cc01d in service 100 GiB none gzip-9 + + omicron zones at generation 3: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -323,6 +645,61 @@ parent: 366b0b68-d80e-4bc1-abd3-dc69837847e0 fake-vendor fake-model serial-fb29d469-7d3f-47b9-944c-ce817fc70370 + datasets at generation 2: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crucible 7426782a-b56d-4bcd-a061-ef999680a483 in service none none off + oxp_3f8c9484-06e8-4662-9a90-aa7e92c43405/crucible ca4f4d56-e1be-4535-abc7-fa5e131f5be4 in service none none off + oxp_4a62a827-4bf3-45d5-a7f5-d080f25c61ef/crucible 60b31115-e269-4cc6-967a-1bd86632ce6e in service none none off + oxp_5f774f00-52b7-41b5-a57f-6f38037196f5/crucible 6081371a-e229-4168-9706-99ed750d0beb in service none none off + oxp_68ae41d4-99ed-4612-99e1-fecf795ca694/crucible 3304ddb3-a458-4852-9955-2fae08196d35 in service none none off + oxp_6a66241b-b595-423d-84ef-a81b5d8430e8/crucible ba9a2005-5bc2-414d-ae3a-fffd398d4b78 in service none none off + oxp_7c45c3f6-6369-40d9-a73f-2f7ed0afe96b/crucible 7fd796bb-369b-4f22-b552-f45ce12836b4 in service none none off + oxp_a216d334-4a9a-49dd-8b13-20548839306c/crucible a8d0b8ae-fec4-4c7e-b286-869d6f888616 in service none none off + oxp_c9ff8eb0-807c-40ad-a5c4-0d534947c9ad/crucible c0071842-4e56-40e9-a53a-0ea8242a66f4 in service none none off + oxp_fb29d469-7d3f-47b9-944c-ce817fc70370/crucible 1463807d-6615-4643-95e2-8cfcfdffc5a2 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/clickhouse b5197e35-15e8-423e-931f-ba32b3842eef in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/external_dns 65abb419-b456-4cac-9ca5-bcd823457692 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/internal_dns d17fa7c3-e285-4725-9f69-185708d1d55c in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone f68397e5-da5d-4d93-94a4-b68951f30522 in service none none off + oxp_3f8c9484-06e8-4662-9a90-aa7e92c43405/crypt/zone 6d833180-97ee-461b-8cbd-62007f3172e3 in service none none off + oxp_4a62a827-4bf3-45d5-a7f5-d080f25c61ef/crypt/zone 085f6578-6bb9-4cd6-9274-aa50a274fddb in service none none off + oxp_5f774f00-52b7-41b5-a57f-6f38037196f5/crypt/zone 0de067e1-b626-494a-9d41-03de4036c922 in service none none off + oxp_68ae41d4-99ed-4612-99e1-fecf795ca694/crypt/zone 0b76c44a-1d99-460d-87fd-3ae5c8b241b9 in service none none off + oxp_6a66241b-b595-423d-84ef-a81b5d8430e8/crypt/zone cb33c02a-6db4-402b-adcf-919957342c84 in service none none off + oxp_7c45c3f6-6369-40d9-a73f-2f7ed0afe96b/crypt/zone 9ea4aca6-ac88-4550-a4fd-10ddfd94e01e in service none none off + oxp_a216d334-4a9a-49dd-8b13-20548839306c/crypt/zone b5e5d272-964b-40b7-9d03-fb92c4b491c0 in service none none off + oxp_c9ff8eb0-807c-40ad-a5c4-0d534947c9ad/crypt/zone 219249df-e43f-4ee3-a4e2-eaa09b085d9a in service none none off + oxp_fb29d469-7d3f-47b9-944c-ce817fc70370/crypt/zone e49ad6e5-2d96-4a2a-8e50-202d97d7f424 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_clickhouse_e9d3a6d6-6e95-4ec8-a857-a3ab1ce6e62d 6ee081c5-9830-4d6b-83a1-56f307b893fd in service none none off + oxp_6a66241b-b595-423d-84ef-a81b5d8430e8/crypt/zone/oxz_crucible_53491964-307a-45f6-b277-79a5e90f20b7 80cb8976-735e-488d-8ff1-c49ec2bf4d4d in service none none off + oxp_fb29d469-7d3f-47b9-944c-ce817fc70370/crypt/zone/oxz_crucible_777087c0-4fb9-43ed-846b-16aa6431a272 a03c380c-735d-434a-8e5c-6a39dfd1d54e in service none none off + oxp_68ae41d4-99ed-4612-99e1-fecf795ca694/crypt/zone/oxz_crucible_78a45052-138b-47ee-877d-e73143467c8a 6f8bfed8-9387-4ef9-b307-873f072d349e in service none none off + oxp_4a62a827-4bf3-45d5-a7f5-d080f25c61ef/crypt/zone/oxz_crucible_8ec567c1-6776-4573-bfe5-f3041165fdca 8886085a-1920-479b-ad17-7858a690aab1 in service none none off + oxp_c9ff8eb0-807c-40ad-a5c4-0d534947c9ad/crypt/zone/oxz_crucible_8ef7ff46-81f7-4f16-aa8f-0c1957589a5f 5579e9a2-eda0-4343-bb3a-7cf6d6910c3e in service none none off + oxp_3f8c9484-06e8-4662-9a90-aa7e92c43405/crypt/zone/oxz_crucible_af3e8274-151f-4cb1-990c-b0a7680ff210 d773abef-bfdb-4c60-ba3d-8a980c9c50ed in service none none off + oxp_5f774f00-52b7-41b5-a57f-6f38037196f5/crypt/zone/oxz_crucible_c3114d7e-07cd-4d80-b82b-49ccbe856af2 80da4d1c-b800-4f92-95ff-0e3f6e6b6eec in service none none off + oxp_a216d334-4a9a-49dd-8b13-20548839306c/crypt/zone/oxz_crucible_d23b5191-04de-4b48-8599-cf866ffc06e8 8a7040dd-acf5-406f-9794-bb9844716585 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_crucible_efdbf061-321c-47d6-bf0f-4530ec4c287e 2b5f60f5-7830-4cf4-9051-a6a6dc470b66 in service none none off + oxp_7c45c3f6-6369-40d9-a73f-2f7ed0afe96b/crypt/zone/oxz_crucible_f31ab1c5-0f23-44dc-8504-c67c65afc11e 344481c4-02ad-4759-82c3-4986566f76bf in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_crucible_pantry_07738018-1b2a-4efc-8c5c-bd6b7a5d7b40 a4ca94e6-55de-405c-8a33-422ed5938bd3 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_external_dns_1b37911d-c427-4bf1-90d3-b2d0c2e98825 06af733b-6f79-4d4d-aef5-e18068a795df in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_internal_dns_7a1bd482-74f8-4562-b1db-c8bad16afb44 d648ac4b-0c2d-407b-84a5-05c25b24c463 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_nexus_ed2d3be3-fcee-4f6b-bb99-a1a9130c4eeb a16bbe93-af8c-45bc-86ee-caff9ae76d17 in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/zone/oxz_ntp_8c368ed6-6c91-4437-b8ff-0d789193db38 dac5975a-67f3-44d7-9b0c-46a9f616ef4e in service none none off + oxp_3b46c403-ad14-435c-a1a8-e8f940bf814f/crypt/debug 86c4d965-971c-48fb-891d-9f63232d1577 in service 100 GiB none gzip-9 + oxp_3f8c9484-06e8-4662-9a90-aa7e92c43405/crypt/debug b3d9c2e2-c06d-4a99-bf4a-c8613691615a in service 100 GiB none gzip-9 + oxp_4a62a827-4bf3-45d5-a7f5-d080f25c61ef/crypt/debug 5c8561d4-afac-436b-b32c-e8dc44daa98a in service 100 GiB none gzip-9 + oxp_5f774f00-52b7-41b5-a57f-6f38037196f5/crypt/debug c518735e-1306-4fbf-9ba4-010196249ee3 in service 100 GiB none gzip-9 + oxp_68ae41d4-99ed-4612-99e1-fecf795ca694/crypt/debug 8b416b54-73b0-4fda-8d10-6823b67aa044 in service 100 GiB none gzip-9 + oxp_6a66241b-b595-423d-84ef-a81b5d8430e8/crypt/debug 8194dbad-3f65-43d1-a7e0-50b23a81b674 in service 100 GiB none gzip-9 + oxp_7c45c3f6-6369-40d9-a73f-2f7ed0afe96b/crypt/debug ad878e0e-831b-4f0b-9417-1b17c5f5f744 in service 100 GiB none gzip-9 + oxp_a216d334-4a9a-49dd-8b13-20548839306c/crypt/debug 5d15a682-d4ca-40be-8cf9-3cdc934c3787 in service 100 GiB none gzip-9 + oxp_c9ff8eb0-807c-40ad-a5c4-0d534947c9ad/crypt/debug 5735d96e-efef-448d-8e40-cf0dc73a2c04 in service 100 GiB none gzip-9 + oxp_fb29d469-7d3f-47b9-944c-ce817fc70370/crypt/debug 19c25551-a54c-47b6-8495-dbd51ed8e384 in service 100 GiB none gzip-9 + + omicron zones at generation 2: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -364,6 +741,59 @@ parent: 366b0b68-d80e-4bc1-abd3-dc69837847e0 fake-vendor fake-model serial-f1a041cc-85c7-4d14-8fc0-8d0e417f7e24 + datasets at generation 2: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crucible 086f43f3-c939-4b81-8b42-a5cf1495e21a in service none none off + oxp_44882b6c-5e19-418b-b6c3-065f2af5a557/crucible 924b3557-8ab5-4edf-9c27-6617b89c7cdb in service none none off + oxp_6de47efc-8a6d-4108-bf82-0146eab3be06/crucible ce82dc53-7e11-4403-be4b-2e9079126609 in service none none off + oxp_80e2c62f-052c-4580-8252-7af238fbbe9c/crucible 39b7090c-574e-4fbc-8d06-c0b04e989e22 in service none none off + oxp_81d326ae-5f8a-4ffd-9d5e-a9e8246ac014/crucible 867c9991-9dd1-46b5-989a-dfa280ccd135 in service none none off + oxp_878af5a0-7810-43e5-bdd5-a3215242459a/crucible 4eae99b0-4319-4dcf-b2b4-22dab063b7fa in service none none off + oxp_af59fef5-8258-4852-be1d-ce55ae7dc822/crucible 0284b755-6ab8-427c-9e8c-e078c7369f04 in service none none off + oxp_b16aa11f-6e49-44c1-abcb-2e7584bffa12/crucible 99a6bc05-1c43-455d-8b50-7e9e08a12602 in service none none off + oxp_f173c79b-a3b4-4f4a-a983-bc94b6b1a616/crucible 4f8aafc8-21a7-4c64-9613-21b8d5162ed2 in service none none off + oxp_f1a041cc-85c7-4d14-8fc0-8d0e417f7e24/crucible 004d26f7-f145-41c7-b708-1bffbaa31250 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/external_dns 2ab4f9d3-6497-4d4b-bc61-daab02e40086 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/internal_dns fe27f0e0-acf4-4868-858e-b7c33bf904f3 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone c06bd208-d236-48d1-a8c0-b6d523b3fc3e in service none none off + oxp_44882b6c-5e19-418b-b6c3-065f2af5a557/crypt/zone 4ffdc4b3-694c-4c99-8e76-80df0ca3b2a4 in service none none off + oxp_6de47efc-8a6d-4108-bf82-0146eab3be06/crypt/zone 5759f27e-3767-42df-9a76-4665267435c4 in service none none off + oxp_80e2c62f-052c-4580-8252-7af238fbbe9c/crypt/zone ea67cf51-95cf-40a1-af30-5d01b4e3537d in service none none off + oxp_81d326ae-5f8a-4ffd-9d5e-a9e8246ac014/crypt/zone fa8d69c3-525e-4b9c-882d-1f31221e13b9 in service none none off + oxp_878af5a0-7810-43e5-bdd5-a3215242459a/crypt/zone f36eed10-3342-40db-a91a-724995c775f4 in service none none off + oxp_af59fef5-8258-4852-be1d-ce55ae7dc822/crypt/zone dec78c6b-0b4d-48a0-b471-8c0b357d2d5c in service none none off + oxp_b16aa11f-6e49-44c1-abcb-2e7584bffa12/crypt/zone 1b14f925-2368-4251-b303-07b193e88d0d in service none none off + oxp_f173c79b-a3b4-4f4a-a983-bc94b6b1a616/crypt/zone 511e9dc3-19d9-4e65-b670-a7123f086197 in service none none off + oxp_f1a041cc-85c7-4d14-8fc0-8d0e417f7e24/crypt/zone 70b97568-5812-4246-8bd7-eae3be369fb9 in service none none off + oxp_6de47efc-8a6d-4108-bf82-0146eab3be06/crypt/zone/oxz_crucible_426cd521-e6ad-4a67-ad8d-a1acef5eab5e 381cb9c8-ee74-4b4d-adfb-f659933bdfec in service none none off + oxp_f173c79b-a3b4-4f4a-a983-bc94b6b1a616/crypt/zone/oxz_crucible_4a392139-7423-459b-b1c9-5903421be40c e57920ec-4bbc-4e93-906c-53e04bca6dc6 in service none none off + oxp_44882b6c-5e19-418b-b6c3-065f2af5a557/crypt/zone/oxz_crucible_51e403e5-a703-4cfb-b044-c72c52885e82 e7656c10-357a-427a-9e31-9b0462f0126d in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_crucible_55a2094a-9590-442f-8203-dffe5a76ae66 f3d6bda9-83c1-40c5-bbd0-4d6ef040c6f8 in service none none off + oxp_81d326ae-5f8a-4ffd-9d5e-a9e8246ac014/crypt/zone/oxz_crucible_758d9a91-7070-43e3-8c60-ea1d0f818a12 0821ec11-cd56-4215-9199-6f3ea4fc92d5 in service none none off + oxp_878af5a0-7810-43e5-bdd5-a3215242459a/crypt/zone/oxz_crucible_8e4d80f8-80ea-48ac-ad47-95501c0c3fbe 9617a578-3d42-4e91-b4aa-48c0e718a9ae in service none none off + oxp_f1a041cc-85c7-4d14-8fc0-8d0e417f7e24/crypt/zone/oxz_crucible_cbf109e0-cdd5-48f9-8998-e9f55c9be980 a2a01591-b10e-46a0-b91f-633c433c269b in service none none off + oxp_b16aa11f-6e49-44c1-abcb-2e7584bffa12/crypt/zone/oxz_crucible_d60cc034-46c4-4233-8066-4008e947d904 0960a21d-c165-47ca-bd48-287e01168038 in service none none off + oxp_af59fef5-8258-4852-be1d-ce55ae7dc822/crypt/zone/oxz_crucible_f24b63e6-2382-4862-90bf-c39e42aad988 31f2b888-9f13-4584-878f-431c3d65c3b5 in service none none off + oxp_80e2c62f-052c-4580-8252-7af238fbbe9c/crypt/zone/oxz_crucible_fddd2bd6-a535-4e2c-9a36-cb90d048c0b7 69c63a34-be5f-4e62-bf44-e0902b1996dd in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_crucible_pantry_eb4f0a57-7386-4216-bcb2-874d39aae836 636c3b45-4c7b-46a1-9852-ccbf5380ca23 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_external_dns_47387358-e16d-4c34-b8f7-1f3f12c662eb 2cb6c311-5478-497c-afb0-672998b013b8 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_internal_dns_edb6573c-3621-4d95-ad3b-93a088caeea5 f93c3b9e-88e2-4e2d-8df1-3e3fe9e1705f in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_nexus_2cea0275-1fbc-410c-819e-2ec54ffeeffe 94b7f78b-bb21-493d-85de-6ae9bfd9a2f2 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/zone/oxz_ntp_6e1cdf48-6846-4bb3-8a72-8bc1e8d5b21d e292f06d-aed2-4363-926c-1ca27866fb83 in service none none off + oxp_1f9589d8-0a68-47e8-b977-d0fb17bd3fdb/crypt/debug ae33e813-ae6f-4744-a335-9eb96d66c717 in service 100 GiB none gzip-9 + oxp_44882b6c-5e19-418b-b6c3-065f2af5a557/crypt/debug 1b4b24fb-db9e-4edc-a934-8d4ef8527879 in service 100 GiB none gzip-9 + oxp_6de47efc-8a6d-4108-bf82-0146eab3be06/crypt/debug 690c814f-6000-444b-b488-a90937eb07ca in service 100 GiB none gzip-9 + oxp_80e2c62f-052c-4580-8252-7af238fbbe9c/crypt/debug c31e1ff2-6d54-4c3d-96bd-9bf697e37757 in service 100 GiB none gzip-9 + oxp_81d326ae-5f8a-4ffd-9d5e-a9e8246ac014/crypt/debug 7cc4ea30-7f2f-48fe-a58b-30e62f52e27f in service 100 GiB none gzip-9 + oxp_878af5a0-7810-43e5-bdd5-a3215242459a/crypt/debug 4e14806d-82e2-44b9-aff1-cf558c1910fb in service 100 GiB none gzip-9 + oxp_af59fef5-8258-4852-be1d-ce55ae7dc822/crypt/debug 597c0560-2cb6-486a-9e87-a0ad425c36da in service 100 GiB none gzip-9 + oxp_b16aa11f-6e49-44c1-abcb-2e7584bffa12/crypt/debug 23fbb19c-a9e9-4631-ab2b-d0b97de444c1 in service 100 GiB none gzip-9 + oxp_f173c79b-a3b4-4f4a-a983-bc94b6b1a616/crypt/debug e75ed71c-f3a3-429e-9bb4-22a24572a9d2 in service 100 GiB none gzip-9 + oxp_f1a041cc-85c7-4d14-8fc0-8d0e417f7e24/crypt/debug 83b408b5-02b6-4f06-bd08-f6a807d3c5e8 in service 100 GiB none gzip-9 + + omicron zones at generation 2: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -404,6 +834,61 @@ parent: 366b0b68-d80e-4bc1-abd3-dc69837847e0 fake-vendor fake-model serial-fa9ce87c-fa7c-4854-95bd-69b8f01c46f9 + datasets at generation 4: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crucible dd2ac836-55e7-4f13-a39f-24fbf9122dee in service none none off + oxp_6f8fa855-4f34-42db-a6e4-9d0090d6c828/crucible b1d078dc-62ee-433a-b8cf-854fefb22039 in service none none off + oxp_71450d62-791e-4068-9882-8a206a465fd9/crucible 91ea5860-a12b-458a-9b47-a3960e2d78b8 in service none none off + oxp_7b4ad242-8330-4c08-9588-c66782742678/crucible 9316a944-5d51-475a-ad89-8df8b4dd0863 in service none none off + oxp_9bf23b52-565e-4439-9728-edb603fa6c4e/crucible 8dabf037-8d33-47e3-95fc-ada8d20f1d44 in service none none off + oxp_c9476e3d-7745-4fa9-b336-b54ac5b08f56/crucible 1e28e523-e77a-4270-99d1-fd3810e1aad9 in service none none off + oxp_d2cd1e65-b63d-4748-895f-aafecc81e440/crucible 28ba9385-4ebf-49ce-9fa2-5c549ad1fded in service none none off + oxp_d4ad3cc1-956a-4444-81a6-da6a025f6df2/crucible fdc03ce9-b4f2-47aa-bff8-b0b2a05fe3b0 in service none none off + oxp_e1298a43-fa1a-4e6f-bcfa-b26996f69c50/crucible 7d9f72bd-23bc-40e6-97c5-a53ca255588d in service none none off + oxp_fa9ce87c-fa7c-4854-95bd-69b8f01c46f9/crucible bf673cd5-b04e-4088-b017-c7a714ce2b63 in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/external_dns 07153a04-4e4a-485a-8399-15bc9063cb5d in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/external_dns 195da8dd-34fd-4e96-a949-b7329710133e expunged none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/internal_dns 92ff6262-7b3c-4300-bb53-936bd3edce26 in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone 9d6ab53a-6474-4ed6-8beb-9be1758229f5 in service none none off + oxp_6f8fa855-4f34-42db-a6e4-9d0090d6c828/crypt/zone df385279-2886-4422-957f-88f1f382a90b in service none none off + oxp_71450d62-791e-4068-9882-8a206a465fd9/crypt/zone 97a12796-0555-47c5-a0d3-c136e0e919f6 in service none none off + oxp_7b4ad242-8330-4c08-9588-c66782742678/crypt/zone 39343108-efec-4643-80c8-1c741d045dad in service none none off + oxp_9bf23b52-565e-4439-9728-edb603fa6c4e/crypt/zone b58b762a-7124-4441-a334-16d552f576f3 in service none none off + oxp_c9476e3d-7745-4fa9-b336-b54ac5b08f56/crypt/zone 92c63f1f-4ba8-4a41-93c0-e227b3320eaa in service none none off + oxp_d2cd1e65-b63d-4748-895f-aafecc81e440/crypt/zone 434bf6e8-b885-441d-b944-9508b0c64311 in service none none off + oxp_d4ad3cc1-956a-4444-81a6-da6a025f6df2/crypt/zone 58e91146-8da0-449a-adab-6e93504c9bf0 in service none none off + oxp_e1298a43-fa1a-4e6f-bcfa-b26996f69c50/crypt/zone e56258ab-55c4-42ca-95e5-ea8bbeff84e1 in service none none off + oxp_fa9ce87c-fa7c-4854-95bd-69b8f01c46f9/crypt/zone e070deb1-5298-46fb-983f-b6e153e98cd7 in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_crucible_0903299a-6296-44f0-8ab9-7c70b5766a05 277b0d6a-bb61-4eb2-bd11-d750586b5fbc in service none none off + oxp_71450d62-791e-4068-9882-8a206a465fd9/crypt/zone/oxz_crucible_2b6b3cfd-4524-465b-ac6e-10be9ab6d4d4 5073cf86-7d36-4c98-9e34-559172a0bc84 in service none none off + oxp_e1298a43-fa1a-4e6f-bcfa-b26996f69c50/crypt/zone/oxz_crucible_3e0ff677-2ca8-4124-9fef-7c23ac2da6fa 028fc58f-16ea-4536-9f50-b4eeb1aa57c9 in service none none off + oxp_c9476e3d-7745-4fa9-b336-b54ac5b08f56/crypt/zone/oxz_crucible_512758d0-335f-4c94-9afe-c82f6f127421 f20e7661-c0c7-47cd-b08a-e7f5b76026d6 in service none none off + oxp_6f8fa855-4f34-42db-a6e4-9d0090d6c828/crypt/zone/oxz_crucible_8ae67b12-ca74-40d3-a55e-90456cd623ea 3f7802ee-87bb-48d6-a42d-657bd0f85c74 in service none none off + oxp_fa9ce87c-fa7c-4854-95bd-69b8f01c46f9/crypt/zone/oxz_crucible_918c8cbc-1c62-4de5-9cf2-c4153a3d1a7e 41d832ad-7b85-4214-b485-9ca2ed4f85d0 in service none none off + oxp_7b4ad242-8330-4c08-9588-c66782742678/crypt/zone/oxz_crucible_be422e7a-16d0-426e-8567-da0aed7200d4 e0fb453d-b22c-4d87-be9b-94f6113cb25a in service none none off + oxp_d2cd1e65-b63d-4748-895f-aafecc81e440/crypt/zone/oxz_crucible_ea50f438-1b5e-4d61-bd65-46d360f590ee 26a25185-a37f-4ead-8c81-77be56a21b0a in service none none off + oxp_9bf23b52-565e-4439-9728-edb603fa6c4e/crypt/zone/oxz_crucible_f055a042-9d1b-4931-8268-d94cac801d7e 998b0fb1-b562-4858-a9ae-c02296c7c6ed in service none none off + oxp_d4ad3cc1-956a-4444-81a6-da6a025f6df2/crypt/zone/oxz_crucible_f33e09d1-e3d7-4341-baf2-5f079f3679e5 aa4f1267-a83a-4081-b572-28e1860ff2f2 in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_crucible_pantry_100e20aa-1816-4195-8d76-08beace10332 032bf309-8046-4c96-9453-29b9346b19fc in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_external_dns_9995de32-dd52-4eb1-b0eb-141eb84bc739 f258d941-f8b3-4d0e-bbe6-773996a002d5 expunged none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_external_dns_d786ef4a-5acb-4f5d-a732-a00addf986b5 39f57b97-0501-4902-8f3a-902ed4d7c869 in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_internal_dns_171cabf0-8635-42e7-8ea1-2a1d2a2daf55 3531c6de-8d31-4917-bb72-884b6e168eca in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_nexus_5b01b0e0-5cdf-4b34-b0a6-c947cbbdb8be 5e3a1b9d-9475-4bd9-8112-5595a7c0da7d in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/zone/oxz_ntp_7b4bccad-9869-48da-8320-2dc82752deea 45771e96-054c-4b05-8021-c32b23fcad8d in service none none off + oxp_2f26e76b-6c91-4ee9-87b3-f424b942091b/crypt/debug 29be83b4-4d0b-4787-819d-96e8e69301da in service 100 GiB none gzip-9 + oxp_6f8fa855-4f34-42db-a6e4-9d0090d6c828/crypt/debug ce433c69-7540-4a7a-9e11-dd30b0d2dc19 in service 100 GiB none gzip-9 + oxp_71450d62-791e-4068-9882-8a206a465fd9/crypt/debug 48cc9313-13c2-4ebe-8120-5b648ec26a28 in service 100 GiB none gzip-9 + oxp_7b4ad242-8330-4c08-9588-c66782742678/crypt/debug cdcfe435-881a-44dc-9dba-2a0fafdbf66d in service 100 GiB none gzip-9 + oxp_9bf23b52-565e-4439-9728-edb603fa6c4e/crypt/debug 835edc8b-9d33-45db-9bdc-ea8a956f3217 in service 100 GiB none gzip-9 + oxp_c9476e3d-7745-4fa9-b336-b54ac5b08f56/crypt/debug 1754b8f0-07b8-4305-8bb2-b347ba3e0b68 in service 100 GiB none gzip-9 + oxp_d2cd1e65-b63d-4748-895f-aafecc81e440/crypt/debug 7028b888-b4c0-43e5-a9d4-2e29d24f34a7 in service 100 GiB none gzip-9 + oxp_d4ad3cc1-956a-4444-81a6-da6a025f6df2/crypt/debug 36ad4fe9-3897-4777-bc0e-88f142594d07 in service 100 GiB none gzip-9 + oxp_e1298a43-fa1a-4e6f-bcfa-b26996f69c50/crypt/debug d37e0b8c-6c43-4e83-b3ec-238429d1cbfb in service 100 GiB none gzip-9 + oxp_fa9ce87c-fa7c-4854-95bd-69b8f01c46f9/crypt/debug b7569aa4-f0d6-4de0-9b9a-cd8d0a6cc01d in service 100 GiB none gzip-9 + + omicron zones at generation 4: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP diff --git a/nexus/reconfigurator/planning/tests/output/example_builder_zone_counts_blueprint.txt b/nexus/reconfigurator/planning/tests/output/example_builder_zone_counts_blueprint.txt index 263fb56e6c0..b607a92241f 100644 --- a/nexus/reconfigurator/planning/tests/output/example_builder_zone_counts_blueprint.txt +++ b/nexus/reconfigurator/planning/tests/output/example_builder_zone_counts_blueprint.txt @@ -19,6 +19,64 @@ parent: e35b2fdd-354d-48d9-acb5-703b2c269a54 fake-vendor fake-model serial-cd783b74-e400-41e0-9bb7-1d1d2f8958ce + datasets at generation 2: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_2b9c7004-fa39-4cf0-ae41-c299d3191f26/crucible e3189dd4-ed84-4ba4-b59b-cd848c56c573 in service none none off + oxp_3ad934d9-90ee-4805-881c-20108827773f/crucible 8cce58e1-6ae8-462a-a065-bb8da5328001 in service none none off + oxp_69db5dd6-795e-4e04-bfb3-f51962c49853/crucible 1ad70dd8-73ac-4379-99f6-8557f0e27bb7 in service none none off + oxp_8557a3fb-cc12-497f-86d2-9f1a463b3685/crucible 1b3fe177-9999-440a-9952-79db99dcc3ef in service none none off + oxp_9bd3cc34-4891-4c28-a4de-c4fcf01b6215/crucible dcec5ce0-9ff1-4791-b5d9-0897660fe355 in service none none off + oxp_9dafffa2-31b7-43c0-b673-0c946be799f0/crucible be4a7122-b0ca-4a92-822e-6fc09814bea6 in service none none off + oxp_9e626a52-b5f1-4776-9cb8-271848b9c651/crucible 88c76874-e55c-4dd1-b3ba-aac2430864f7 in service none none off + oxp_a645a1ac-4c49-4c7e-ba53-3dc60b737f06/crucible 84f3e490-5c74-4da3-8cbf-21c1cc053e32 in service none none off + oxp_b5ae209c-9226-44a0-8a6b-03b44f93d456/crucible 56952241-5d68-4f4c-929f-8d3c44f9aece in service none none off + oxp_cd783b74-e400-41e0-9bb7-1d1d2f8958ce/crucible cb9f558a-9b61-43d7-9a99-94003f9fd1fc in service none none off + oxp_2b9c7004-fa39-4cf0-ae41-c299d3191f26/crypt/clickhouse 8f91d515-269a-4fda-8ee6-f1fd3d55e327 in service none none off + oxp_2b9c7004-fa39-4cf0-ae41-c299d3191f26/crypt/external_dns 39c33925-dc15-4729-9e5f-4cab234fb339 in service none none off + oxp_3ad934d9-90ee-4805-881c-20108827773f/crypt/external_dns 4ef5e0c8-76d6-475e-bae4-b52bb90ac70e in service none none off + oxp_2b9c7004-fa39-4cf0-ae41-c299d3191f26/crypt/internal_dns 167df3a6-2fff-4a0a-aca9-6688431c5d5a in service none none off + oxp_2b9c7004-fa39-4cf0-ae41-c299d3191f26/crypt/zone 43fb3066-5620-451f-a5c5-4d3b95b05950 in service none none off + oxp_3ad934d9-90ee-4805-881c-20108827773f/crypt/zone e78639f6-9a2e-49fb-9f6f-a043eaacc047 in service none none off + oxp_69db5dd6-795e-4e04-bfb3-f51962c49853/crypt/zone c2f103af-da69-44c9-bce6-84db33c8effb in service none none off + oxp_8557a3fb-cc12-497f-86d2-9f1a463b3685/crypt/zone 650100ce-5cc5-41ec-8809-84f6ab5cb77a in service none none off + oxp_9bd3cc34-4891-4c28-a4de-c4fcf01b6215/crypt/zone 493feef8-2121-4b8b-a97d-57697731e2ab in service none none off + oxp_9dafffa2-31b7-43c0-b673-0c946be799f0/crypt/zone 7b762302-7f5a-4f73-baca-37e6d678a9ce in service none none off + oxp_9e626a52-b5f1-4776-9cb8-271848b9c651/crypt/zone cc1f3412-2695-4027-ae73-a1f80d404b97 in service none none off + oxp_a645a1ac-4c49-4c7e-ba53-3dc60b737f06/crypt/zone 6d0c9b97-e7fd-4f99-9073-5f7fec416282 in service none none off + oxp_b5ae209c-9226-44a0-8a6b-03b44f93d456/crypt/zone 1a710e19-7464-4fc0-9aba-ce95b7db9a2e in service none none off + oxp_cd783b74-e400-41e0-9bb7-1d1d2f8958ce/crypt/zone 4d2d4195-227d-415a-b4e3-8073d8ac53ae in service none none off + oxp_2b9c7004-fa39-4cf0-ae41-c299d3191f26/crypt/zone/oxz_clickhouse_4365e906-7a33-4c8c-bf17-3b44445e333e ed927d22-febb-47b8-96ac-fa2c41c37f34 in service none none off + oxp_b5ae209c-9226-44a0-8a6b-03b44f93d456/crypt/zone/oxz_crucible_1d8bbe29-01b8-4bc0-bcd0-ca9864d881df 16714ba4-4e78-4835-9e67-ad21a003c5a5 in service none none off + oxp_9bd3cc34-4891-4c28-a4de-c4fcf01b6215/crypt/zone/oxz_crucible_1f679ae9-d2c2-4d18-9258-a4ca59f34c2f e1b540b8-1764-4618-a106-e5b52a0702ab in service none none off + oxp_a645a1ac-4c49-4c7e-ba53-3dc60b737f06/crypt/zone/oxz_crucible_2098c2d8-fb3b-4514-a856-a89aca1d2086 e10c7762-e431-441d-8099-dbb300b74d86 in service none none off + oxp_69db5dd6-795e-4e04-bfb3-f51962c49853/crypt/zone/oxz_crucible_5aff48ae-3661-473b-9098-e2d185871289 6b75916e-fcda-4f7d-842a-990424593db9 in service none none off + oxp_2b9c7004-fa39-4cf0-ae41-c299d3191f26/crypt/zone/oxz_crucible_7ef24e88-d759-4d4d-b854-4a72e2e64999 02f6f537-8bba-438c-a0c0-94b10a9c9463 in service none none off + oxp_8557a3fb-cc12-497f-86d2-9f1a463b3685/crypt/zone/oxz_crucible_8f5f749a-12a0-4f65-a73f-7c05007ef8da 7dac2273-e9d4-464e-9771-9c9f61e9c012 in service none none off + oxp_cd783b74-e400-41e0-9bb7-1d1d2f8958ce/crypt/zone/oxz_crucible_a8fdd554-28cd-44e5-93c3-5f07bb3e0cbc 127a73f2-bd32-44a2-90bc-d2266815f3b6 in service none none off + oxp_9e626a52-b5f1-4776-9cb8-271848b9c651/crypt/zone/oxz_crucible_af336d4e-844d-44a9-87c2-295a51d4f26b d331e0ae-30bd-4c1e-9a8a-d277b8ec96bc in service none none off + oxp_9dafffa2-31b7-43c0-b673-0c946be799f0/crypt/zone/oxz_crucible_d10c1ac8-a352-4f02-a2f9-a9294ba358dd 3f71bfc8-003a-4ef2-90df-3d06f96712bf in service none none off + oxp_3ad934d9-90ee-4805-881c-20108827773f/crypt/zone/oxz_crucible_ec1cac47-a611-4614-8615-9541d3f71709 3f2c7732-b50b-4c7d-a6df-f1c9cf3e7339 in service none none off + oxp_2b9c7004-fa39-4cf0-ae41-c299d3191f26/crypt/zone/oxz_crucible_pantry_07b0ef64-1d33-496f-a964-57e6d786f8ce ef3826e8-95a3-4441-ab5b-78ffc1546a4a in service none none off + oxp_3ad934d9-90ee-4805-881c-20108827773f/crypt/zone/oxz_external_dns_5c7f05d1-e37f-4756-b678-643783385603 7f736d5d-d9fe-4dc8-8af3-c3f9e0e9f709 in service none none off + oxp_2b9c7004-fa39-4cf0-ae41-c299d3191f26/crypt/zone/oxz_external_dns_ab072f6a-5cd8-4ade-99a7-b3f24c2b40d5 1cb6747e-2156-42b2-abe3-1a19e7ee274e in service none none off + oxp_2b9c7004-fa39-4cf0-ae41-c299d3191f26/crypt/zone/oxz_internal_dns_246fa3f9-f3bc-4fb8-bc58-8a3d3c483ecb 9b0dcb87-cf3e-43e2-9535-bee1ec371401 in service none none off + oxp_2b9c7004-fa39-4cf0-ae41-c299d3191f26/crypt/zone/oxz_nexus_0bbeda6e-de94-41db-ba09-8b55c541d53b 92ad3b29-68de-492a-ae3c-c46df8736c7c in service none none off + oxp_3ad934d9-90ee-4805-881c-20108827773f/crypt/zone/oxz_nexus_23d4c822-51bd-4966-8dc2-0be4b9e760c1 4af3831d-2095-4b44-8bbb-5f5c9207618d in service none none off + oxp_2b9c7004-fa39-4cf0-ae41-c299d3191f26/crypt/zone/oxz_ntp_37a536a6-9043-4f44-bbc1-187b3b7859b1 da0468b1-a89b-4016-af05-b35867e3750c in service none none off + oxp_2b9c7004-fa39-4cf0-ae41-c299d3191f26/crypt/debug e3ba833b-4c29-461e-a3d4-9466999f0dae in service 100 GiB none gzip-9 + oxp_3ad934d9-90ee-4805-881c-20108827773f/crypt/debug 774e2f52-6a61-47e1-8ded-1dcc42d49b9d in service 100 GiB none gzip-9 + oxp_69db5dd6-795e-4e04-bfb3-f51962c49853/crypt/debug e862d2d3-c3f1-4e9b-9af7-d344b98e7db4 in service 100 GiB none gzip-9 + oxp_8557a3fb-cc12-497f-86d2-9f1a463b3685/crypt/debug 7f828f9c-240d-4179-811f-47b8e0510783 in service 100 GiB none gzip-9 + oxp_9bd3cc34-4891-4c28-a4de-c4fcf01b6215/crypt/debug 5332a2cf-909d-466a-952e-db872cb702e1 in service 100 GiB none gzip-9 + oxp_9dafffa2-31b7-43c0-b673-0c946be799f0/crypt/debug 7f09d660-d1a7-40af-b3ea-06acfc9af7f1 in service 100 GiB none gzip-9 + oxp_9e626a52-b5f1-4776-9cb8-271848b9c651/crypt/debug 4472ec31-9863-4fac-9944-97b0bc306b00 in service 100 GiB none gzip-9 + oxp_a645a1ac-4c49-4c7e-ba53-3dc60b737f06/crypt/debug 1b77fcc9-f324-4927-8796-aa7d44fd98d4 in service 100 GiB none gzip-9 + oxp_b5ae209c-9226-44a0-8a6b-03b44f93d456/crypt/debug c0d15d22-3152-42a3-b71f-ae6d7c28ef27 in service 100 GiB none gzip-9 + oxp_cd783b74-e400-41e0-9bb7-1d1d2f8958ce/crypt/debug 741acc7c-702f-4553-8117-0608b547029b in service 100 GiB none gzip-9 + + omicron zones at generation 2: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -62,6 +120,61 @@ parent: e35b2fdd-354d-48d9-acb5-703b2c269a54 fake-vendor fake-model serial-dfaae221-11a9-4db0-b861-41fe5648f185 + datasets at generation 2: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_3cba16f1-1a3d-44e5-ba1d-e68cd2188615/crucible 3f125cef-09e8-4172-8b1c-9e8627be2dec in service none none off + oxp_3fc3ec87-1c39-4df8-99bf-30ca97ec5fac/crucible 1e93c1bb-cfa3-4ffb-a539-4720efb57025 in service none none off + oxp_4c18c1af-dc1c-4de5-92a1-1b2923ea6a87/crucible 3e4a4576-f5e6-4c52-aa33-e75d442de2b2 in service none none off + oxp_6f3a85db-de97-40d9-bf66-e6643ac1c114/crucible b2f683ff-aa52-43f2-a02e-9113bbc6355b in service none none off + oxp_96f39cf4-b2ac-413d-8f94-ba66b127cddd/crucible 0cd84eab-500d-4baf-85ad-27c06c289052 in service none none off + oxp_99c392f3-77b8-4f60-9efa-4efae0c92721/crucible f50c15fc-b7f1-4253-aff4-e2639786e4f5 in service none none off + oxp_bc3195df-61ca-4111-863b-08b5cc243eab/crucible c5522b33-7f8b-4205-9373-7d98e3a893e8 in service none none off + oxp_c787b52c-2cb8-4da2-a17a-128feb5eea0c/crucible 00b23214-ac68-4249-a98a-22b78306d074 in service none none off + oxp_d59d419e-c4d3-41ef-ab6d-0df3620dc84b/crucible 106f511d-a9a2-4f0e-97c3-1e0b4fdd42ab in service none none off + oxp_dfaae221-11a9-4db0-b861-41fe5648f185/crucible 72230b77-1c10-4af9-a015-3ff7e1c537c3 in service none none off + oxp_3cba16f1-1a3d-44e5-ba1d-e68cd2188615/crypt/external_dns 00be99af-046d-4b20-829f-32f90194faf1 in service none none off + oxp_3fc3ec87-1c39-4df8-99bf-30ca97ec5fac/crypt/external_dns 2aafcde6-94c9-4a50-9e7a-573311dbe574 in service none none off + oxp_3cba16f1-1a3d-44e5-ba1d-e68cd2188615/crypt/internal_dns b338b2b1-5a5c-42ff-84b9-07e5133358e4 in service none none off + oxp_3cba16f1-1a3d-44e5-ba1d-e68cd2188615/crypt/zone 0adf2ec0-a465-412c-bdd2-dc832976bcd0 in service none none off + oxp_3fc3ec87-1c39-4df8-99bf-30ca97ec5fac/crypt/zone 0627eda0-3a78-410e-a88f-66b641b00e3d in service none none off + oxp_4c18c1af-dc1c-4de5-92a1-1b2923ea6a87/crypt/zone f63f0450-6dc3-499c-8784-11851c37fa66 in service none none off + oxp_6f3a85db-de97-40d9-bf66-e6643ac1c114/crypt/zone 71551555-2f1c-4b7f-a5e4-42356a7c8b9e in service none none off + oxp_96f39cf4-b2ac-413d-8f94-ba66b127cddd/crypt/zone 3cebbd19-92b7-43c6-83f8-05aa64fbd337 in service none none off + oxp_99c392f3-77b8-4f60-9efa-4efae0c92721/crypt/zone a198988e-d77b-4d43-a49f-a5e52f0a50db in service none none off + oxp_bc3195df-61ca-4111-863b-08b5cc243eab/crypt/zone 1f2b9290-1904-47fe-959a-29af345badc7 in service none none off + oxp_c787b52c-2cb8-4da2-a17a-128feb5eea0c/crypt/zone b520b2c1-485a-448d-9392-e7682578d5fa in service none none off + oxp_d59d419e-c4d3-41ef-ab6d-0df3620dc84b/crypt/zone 3714a256-8c9b-4256-af26-ed86cbfec2d1 in service none none off + oxp_dfaae221-11a9-4db0-b861-41fe5648f185/crypt/zone 02e31df7-2b6a-4f20-9376-9c3422b6bd45 in service none none off + oxp_bc3195df-61ca-4111-863b-08b5cc243eab/crypt/zone/oxz_crucible_06f09ec9-17bf-412c-a39f-9d7dfaf357a4 dbcf0e7e-ead8-4679-8c85-905acd83d76b in service none none off + oxp_96f39cf4-b2ac-413d-8f94-ba66b127cddd/crypt/zone/oxz_crucible_0d903191-f7d9-4e03-9e8e-8c16a913279a 79504c59-5b62-4f58-87c1-edc82802ad2b in service none none off + oxp_dfaae221-11a9-4db0-b861-41fe5648f185/crypt/zone/oxz_crucible_1d88c19b-5f8e-44dd-a9bd-c7d54710daba 9852f9d6-f546-42ef-bc23-5ad332285849 in service none none off + oxp_99c392f3-77b8-4f60-9efa-4efae0c92721/crypt/zone/oxz_crucible_2874301d-348d-4ec8-a907-3e9522e523f1 9eac2719-9b47-4719-94ab-89a45aa45536 in service none none off + oxp_3fc3ec87-1c39-4df8-99bf-30ca97ec5fac/crypt/zone/oxz_crucible_682a3145-d95b-4543-8683-25edea05cbc9 2f14c18a-d2d4-4140-b214-dbf9af07f308 in service none none off + oxp_3cba16f1-1a3d-44e5-ba1d-e68cd2188615/crypt/zone/oxz_crucible_73da1029-abcc-465a-b65d-8b15a43ef4f0 6e66fa48-8214-4232-bc73-8eebe46ffeb6 in service none none off + oxp_4c18c1af-dc1c-4de5-92a1-1b2923ea6a87/crypt/zone/oxz_crucible_d7886bb9-cf2f-46af-a9a7-3eda2a548c98 cd304504-b140-46bd-a0ec-24cc6e395f63 in service none none off + oxp_c787b52c-2cb8-4da2-a17a-128feb5eea0c/crypt/zone/oxz_crucible_d893603e-bbe6-4006-aebd-0cd96a160203 def74314-d972-4a72-bc19-43c4e3919009 in service none none off + oxp_d59d419e-c4d3-41ef-ab6d-0df3620dc84b/crypt/zone/oxz_crucible_f4945957-e5ea-4b38-8344-e7bd610aa442 a1454933-424d-4a66-946d-3cf4f1cb1605 in service none none off + oxp_6f3a85db-de97-40d9-bf66-e6643ac1c114/crypt/zone/oxz_crucible_f7540a15-7960-4681-a202-443d5ccd80b0 0bdd8497-22ed-470c-bb51-41d9769f5901 in service none none off + oxp_3cba16f1-1a3d-44e5-ba1d-e68cd2188615/crypt/zone/oxz_crucible_pantry_2d53e5bb-4265-4fe0-8ea4-f1a0a3bb9189 d0ab3f9d-3650-4f40-981a-85d3489ef115 in service none none off + oxp_3cba16f1-1a3d-44e5-ba1d-e68cd2188615/crypt/zone/oxz_external_dns_0eeabc44-5fc4-44e9-8884-68151571b217 bcdc6d49-e99a-46d0-ba0d-18c289139dbd in service none none off + oxp_3fc3ec87-1c39-4df8-99bf-30ca97ec5fac/crypt/zone/oxz_external_dns_aad293d7-74dc-48dc-bb50-1e1f972fda23 df5f1e27-3308-47c9-bd6d-7a0dff28cf89 in service none none off + oxp_3cba16f1-1a3d-44e5-ba1d-e68cd2188615/crypt/zone/oxz_internal_dns_a399df19-8b57-4727-ac5d-94fdf76d0888 5919b87e-1e64-435a-8269-e47652fb4f20 in service none none off + oxp_3cba16f1-1a3d-44e5-ba1d-e68cd2188615/crypt/zone/oxz_nexus_0a3ccdda-78e3-4a90-b79e-dd1c8954098f 45f0eec3-6396-4e97-b72a-dbf0fe7f8802 in service none none off + oxp_3cba16f1-1a3d-44e5-ba1d-e68cd2188615/crypt/zone/oxz_ntp_3e305e50-9192-4c0d-8fb6-bc539a37fc3e 85629a7e-f129-4b45-b40e-d483d05cb29b in service none none off + oxp_3cba16f1-1a3d-44e5-ba1d-e68cd2188615/crypt/debug bb19fb0d-b848-414e-a435-818eb17aca23 in service 100 GiB none gzip-9 + oxp_3fc3ec87-1c39-4df8-99bf-30ca97ec5fac/crypt/debug 8fc63ec0-f51f-4d64-a329-9d9bf56023d5 in service 100 GiB none gzip-9 + oxp_4c18c1af-dc1c-4de5-92a1-1b2923ea6a87/crypt/debug 1539143f-f25e-4b7e-af10-481ed9139082 in service 100 GiB none gzip-9 + oxp_6f3a85db-de97-40d9-bf66-e6643ac1c114/crypt/debug 36d4d3e7-b866-42da-8569-e5442f0ae498 in service 100 GiB none gzip-9 + oxp_96f39cf4-b2ac-413d-8f94-ba66b127cddd/crypt/debug d967a933-cb35-4183-8a67-b6db665f227d in service 100 GiB none gzip-9 + oxp_99c392f3-77b8-4f60-9efa-4efae0c92721/crypt/debug cd5c00e1-30e4-4523-8182-9f71e326f547 in service 100 GiB none gzip-9 + oxp_bc3195df-61ca-4111-863b-08b5cc243eab/crypt/debug 3d95ebd4-eca8-4f56-9fc3-10c6de54204b in service 100 GiB none gzip-9 + oxp_c787b52c-2cb8-4da2-a17a-128feb5eea0c/crypt/debug 0bd5f018-b363-4e83-8e4d-6eb1155aac14 in service 100 GiB none gzip-9 + oxp_d59d419e-c4d3-41ef-ab6d-0df3620dc84b/crypt/debug 7aa19675-8e61-4667-86ce-6ac3c668fc2a in service 100 GiB none gzip-9 + oxp_dfaae221-11a9-4db0-b861-41fe5648f185/crypt/debug 65550301-5f29-4d98-9797-96895547765d in service 100 GiB none gzip-9 + + omicron zones at generation 2: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -103,6 +216,59 @@ parent: e35b2fdd-354d-48d9-acb5-703b2c269a54 fake-vendor fake-model serial-ff911b9b-57a8-4318-a253-e2363b70083d + datasets at generation 2: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_00fb9aa9-0bbf-49ab-a712-6e8feaf719e2/crucible c84905fc-abc9-490c-8d3c-e76e4e496fec in service none none off + oxp_37f466d7-510b-40e4-b9a4-c5c092a6a5f6/crucible 38118342-7d06-42e8-9da7-a0e1a6dd533f in service none none off + oxp_734b7b3a-86af-48a7-bd00-8d79fa2690c3/crucible 4bb5f832-371a-4f2f-9700-9f3b6fe25f86 in service none none off + oxp_747d2504-36a4-4acc-ad73-22291b5bbedb/crucible 91ef7225-1257-4437-b609-6ef94edc1df1 in service none none off + oxp_7dd422ab-4839-4a7a-8109-ba1941357c70/crucible 576f2ef5-4380-4110-8057-ff6c774aa284 in service none none off + oxp_8b020037-bc77-48b2-9280-a622f571908b/crucible 26a21bf2-4fa4-425c-8cce-15ecc92a470f in service none none off + oxp_96753d7f-de6b-4ce6-a9dc-004f6a0ba0cf/crucible ee9bf400-b26c-4588-9407-b679a4b78246 in service none none off + oxp_a0bd8e79-1113-4c40-8705-ed00e66f0c35/crucible f9dc0f24-7d91-4af6-826c-a07801087940 in service none none off + oxp_b30e150e-c83e-4c1e-b3bf-91a330d42135/crucible f73d3730-9b09-47e4-b8c7-4b538fa43885 in service none none off + oxp_ff911b9b-57a8-4318-a253-e2363b70083d/crucible d4c1bdd4-ca24-49fd-88aa-b68b70658d12 in service none none off + oxp_00fb9aa9-0bbf-49ab-a712-6e8feaf719e2/crypt/external_dns 8b821069-94a5-4c09-b38f-8a491ba768a8 in service none none off + oxp_37f466d7-510b-40e4-b9a4-c5c092a6a5f6/crypt/external_dns c986afce-be1c-4f5e-a1df-2db34d9ef658 in service none none off + oxp_00fb9aa9-0bbf-49ab-a712-6e8feaf719e2/crypt/zone e8e6163a-8d37-4e56-8eff-4a9d6070a42a in service none none off + oxp_37f466d7-510b-40e4-b9a4-c5c092a6a5f6/crypt/zone d4101deb-9d70-4ce8-b83c-af64d88e71ec in service none none off + oxp_734b7b3a-86af-48a7-bd00-8d79fa2690c3/crypt/zone 9aa253cc-560c-4786-b248-40de807174ee in service none none off + oxp_747d2504-36a4-4acc-ad73-22291b5bbedb/crypt/zone 679370c4-5719-4bde-b82c-0d49999d93ed in service none none off + oxp_7dd422ab-4839-4a7a-8109-ba1941357c70/crypt/zone 7fc3a86a-0e83-4fbc-a290-c322a1770608 in service none none off + oxp_8b020037-bc77-48b2-9280-a622f571908b/crypt/zone 229fdf2f-d2cb-43f1-9d71-c4fbc92aa74d in service none none off + oxp_96753d7f-de6b-4ce6-a9dc-004f6a0ba0cf/crypt/zone c0463104-1e65-45f2-8e80-53bd4cf695f6 in service none none off + oxp_a0bd8e79-1113-4c40-8705-ed00e66f0c35/crypt/zone c8ed6a97-eee1-4361-9314-70ec31d7a62e in service none none off + oxp_b30e150e-c83e-4c1e-b3bf-91a330d42135/crypt/zone 61b80718-24ee-4fb0-bc29-e8d11b2bcc64 in service none none off + oxp_ff911b9b-57a8-4318-a253-e2363b70083d/crypt/zone d4e92f89-4086-4423-9b66-40011280daf9 in service none none off + oxp_747d2504-36a4-4acc-ad73-22291b5bbedb/crypt/zone/oxz_crucible_0b5c74ed-0681-4112-ab22-e6aa282999ea a5341b04-1d80-48c7-8d4b-7efa249a8327 in service none none off + oxp_37f466d7-510b-40e4-b9a4-c5c092a6a5f6/crypt/zone/oxz_crucible_2a71a664-3afc-4c9b-844a-838423a7ce6d 0eac6995-f863-47d5-9515-8b8580788810 in service none none off + oxp_7dd422ab-4839-4a7a-8109-ba1941357c70/crypt/zone/oxz_crucible_377b5e5a-d8e5-407e-ad33-d11592a234ca 01aa77a9-57d5-4004-a0c0-192e9a1ff683 in service none none off + oxp_8b020037-bc77-48b2-9280-a622f571908b/crypt/zone/oxz_crucible_470086b8-d5d5-4349-a63c-8c70021c89ad cff76512-ed43-448f-98d4-e7792695b2ac in service none none off + oxp_734b7b3a-86af-48a7-bd00-8d79fa2690c3/crypt/zone/oxz_crucible_4f559858-1c4f-4014-86f1-c497936510bf 5dd413ea-e392-493b-92e9-5878c16988d4 in service none none off + oxp_96753d7f-de6b-4ce6-a9dc-004f6a0ba0cf/crypt/zone/oxz_crucible_7f73bce2-c685-4501-a4fe-34327f6a30a5 70307373-e121-4fc8-b2ba-b09e25eb95d0 in service none none off + oxp_b30e150e-c83e-4c1e-b3bf-91a330d42135/crypt/zone/oxz_crucible_8971a3f0-32ed-4444-8b7c-c492f55f6464 12011fb6-a863-42a8-a358-6f48f1c64d4b in service none none off + oxp_a0bd8e79-1113-4c40-8705-ed00e66f0c35/crypt/zone/oxz_crucible_95c4aca6-aab6-4bde-ab8c-94bbe3beef3f b190b376-c483-4ae7-b5d4-2ce5ee6045c0 in service none none off + oxp_ff911b9b-57a8-4318-a253-e2363b70083d/crypt/zone/oxz_crucible_d2b2710c-99a0-4d76-8c45-918fe7745d6a 800c16c1-8394-4a4b-af48-c2f2fb7763f5 in service none none off + oxp_00fb9aa9-0bbf-49ab-a712-6e8feaf719e2/crypt/zone/oxz_crucible_dcdb2cf0-b347-49f4-a38d-0a2ce82d53ce 7e240cd3-fc74-407c-9a1a-073a68c5462c in service none none off + oxp_00fb9aa9-0bbf-49ab-a712-6e8feaf719e2/crypt/zone/oxz_crucible_pantry_6c856814-7dda-466a-8c40-18dc59f23167 3c1ce61d-4c37-4466-8fb7-c235b710e259 in service none none off + oxp_00fb9aa9-0bbf-49ab-a712-6e8feaf719e2/crypt/zone/oxz_external_dns_a39f897f-d9a0-4193-aee4-f879d1cb8e2c 902c4b96-2da4-4182-953b-76b7a04da4ab in service none none off + oxp_37f466d7-510b-40e4-b9a4-c5c092a6a5f6/crypt/zone/oxz_external_dns_bff5eb61-89b4-49f1-8dd7-3bbf9f3ff4c1 4de554ac-cd93-4f2c-8013-a52933a6a0f3 in service none none off + oxp_00fb9aa9-0bbf-49ab-a712-6e8feaf719e2/crypt/zone/oxz_nexus_eb1c79f7-1d99-42f6-b2cf-7d64419b2fed 96508cdf-0bde-4012-9d79-dafc34abc11c in service none none off + oxp_00fb9aa9-0bbf-49ab-a712-6e8feaf719e2/crypt/zone/oxz_ntp_ab44f8b2-4346-4cb2-bd4a-44063fa5df56 f4eb2e00-7357-4dab-9889-d9480d7d3821 in service none none off + oxp_00fb9aa9-0bbf-49ab-a712-6e8feaf719e2/crypt/debug 5d069a3f-6ef4-4391-8d76-47756dcea0c6 in service 100 GiB none gzip-9 + oxp_37f466d7-510b-40e4-b9a4-c5c092a6a5f6/crypt/debug e1a9202a-dd0a-4a36-ba85-918c95cdf638 in service 100 GiB none gzip-9 + oxp_734b7b3a-86af-48a7-bd00-8d79fa2690c3/crypt/debug cfb734e6-3df0-43a5-a571-de0aa44e04a3 in service 100 GiB none gzip-9 + oxp_747d2504-36a4-4acc-ad73-22291b5bbedb/crypt/debug 94e90cc8-1d42-4ce1-88a8-0a221a0042bd in service 100 GiB none gzip-9 + oxp_7dd422ab-4839-4a7a-8109-ba1941357c70/crypt/debug 5dd5a82b-5265-45c8-9ae7-586adfcc24a3 in service 100 GiB none gzip-9 + oxp_8b020037-bc77-48b2-9280-a622f571908b/crypt/debug d926e7f5-5b5d-48e3-9d09-850ef0091de2 in service 100 GiB none gzip-9 + oxp_96753d7f-de6b-4ce6-a9dc-004f6a0ba0cf/crypt/debug f02ce72a-d518-4209-98dd-691fddb64d47 in service 100 GiB none gzip-9 + oxp_a0bd8e79-1113-4c40-8705-ed00e66f0c35/crypt/debug e635bfe0-b566-4d28-a76a-ed2852be4452 in service 100 GiB none gzip-9 + oxp_b30e150e-c83e-4c1e-b3bf-91a330d42135/crypt/debug 8d322ef4-1d46-4042-a67e-f343be6547c4 in service 100 GiB none gzip-9 + oxp_ff911b9b-57a8-4318-a253-e2363b70083d/crypt/debug aaf36a06-b6fa-408a-99eb-18e9008beb6f in service 100 GiB none gzip-9 + + omicron zones at generation 2: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -143,6 +309,59 @@ parent: e35b2fdd-354d-48d9-acb5-703b2c269a54 fake-vendor fake-model serial-f9415bcf-5757-442a-a400-5a9ccfb5d80a + datasets at generation 2: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_07444848-952b-4333-aa72-401c7bf5d724/crucible 0f4f1bed-c9b0-42fc-a4e4-32d45cc20cb3 in service none none off + oxp_242f8f98-fdc2-4ea9-ab69-e57b993df0df/crucible ba1e1c4a-ef12-493e-ad89-0178d03d8092 in service none none off + oxp_26cc7ce1-dc59-4398-8083-a4e1db957a46/crucible 5f65675a-3d62-4e7b-9842-f7665142a9b5 in service none none off + oxp_3b757772-8c62-4543-a276-7c0051280687/crucible 6b8a3459-a813-4f51-a849-2813d8294271 in service none none off + oxp_981430ec-a43e-4418-bd2c-28db344c8b06/crucible 4c960b21-5b5b-46f8-9e3d-13a87a536ce9 in service none none off + oxp_9dbfe441-887c-45d0-a3ed-7d8e1a63327f/crucible 9806783f-7ed5-40a1-98fb-0cf40451fef9 in service none none off + oxp_b37f5663-bedb-42a3-9b1a-5e417ee6c3d2/crucible 1058a48d-f511-4a0b-aac1-0a812e5605dd in service none none off + oxp_b48a178d-f7fd-4b50-811d-f7d195752710/crucible 2622f9af-68d7-4cb4-b90a-72ec573b5cb3 in service none none off + oxp_be1784b0-017a-436f-8a6a-1884cddc5fa1/crucible 7b6f5f64-27a6-402c-bade-9097b92678ac in service none none off + oxp_f9415bcf-5757-442a-a400-5a9ccfb5d80a/crucible da310575-e60a-4c5c-8f64-ca7323f0f9a1 in service none none off + oxp_07444848-952b-4333-aa72-401c7bf5d724/crypt/external_dns b5cce810-822c-4d4b-a7f1-1fdf4cfbc355 in service none none off + oxp_242f8f98-fdc2-4ea9-ab69-e57b993df0df/crypt/external_dns a50c5b3f-671d-4eac-b926-31e2bded72a5 in service none none off + oxp_07444848-952b-4333-aa72-401c7bf5d724/crypt/zone a79bdbea-3beb-4ae3-8c1f-52b352dcef81 in service none none off + oxp_242f8f98-fdc2-4ea9-ab69-e57b993df0df/crypt/zone 2f3a9ee6-2f6e-4c0b-b531-cb687bc402eb in service none none off + oxp_26cc7ce1-dc59-4398-8083-a4e1db957a46/crypt/zone 570087d6-eb92-423d-abd9-b5bdeea1756c in service none none off + oxp_3b757772-8c62-4543-a276-7c0051280687/crypt/zone b8551aed-f4e4-4e78-a965-fcd1ed870915 in service none none off + oxp_981430ec-a43e-4418-bd2c-28db344c8b06/crypt/zone 6b8a7654-aa52-478d-8f53-54e53c09d94f in service none none off + oxp_9dbfe441-887c-45d0-a3ed-7d8e1a63327f/crypt/zone e53998fc-98fa-4fed-8651-e5db00061dbc in service none none off + oxp_b37f5663-bedb-42a3-9b1a-5e417ee6c3d2/crypt/zone 12a34b7d-186c-4c88-8a71-35dea613d3fc in service none none off + oxp_b48a178d-f7fd-4b50-811d-f7d195752710/crypt/zone ed695361-9352-4ca6-bdd9-04225f77a043 in service none none off + oxp_be1784b0-017a-436f-8a6a-1884cddc5fa1/crypt/zone 1b091f0a-4da2-4c29-b71b-2d128bb1a266 in service none none off + oxp_f9415bcf-5757-442a-a400-5a9ccfb5d80a/crypt/zone 46180231-795e-4b62-b04a-45ae14b92f34 in service none none off + oxp_b48a178d-f7fd-4b50-811d-f7d195752710/crypt/zone/oxz_crucible_154d09df-6ba2-4b2d-9593-aed966fa8edd 97b34be3-c644-46fd-9ee2-bcd6d8a68969 in service none none off + oxp_f9415bcf-5757-442a-a400-5a9ccfb5d80a/crypt/zone/oxz_crucible_3c0d398b-e239-417e-94af-c0113f3b3df0 efc62657-7c5a-45fe-ad7b-bfcb38560bb1 in service none none off + oxp_3b757772-8c62-4543-a276-7c0051280687/crypt/zone/oxz_crucible_490b85bd-cb2a-4730-9586-7340c2b33290 fa8b2c77-75d2-4d61-96c4-84d00269666c in service none none off + oxp_07444848-952b-4333-aa72-401c7bf5d724/crypt/zone/oxz_crucible_6dd7f36b-eb4c-4666-a5b3-8e4f7765f284 ea2cb3d2-8867-4856-a435-10147ba62391 in service none none off + oxp_981430ec-a43e-4418-bd2c-28db344c8b06/crypt/zone/oxz_crucible_72307d66-7b37-4bb5-a45b-1424bbd2db89 2189e57d-5aef-47d8-9ad1-e252df78eb5c in service none none off + oxp_b37f5663-bedb-42a3-9b1a-5e417ee6c3d2/crypt/zone/oxz_crucible_80df9448-d723-450b-a5a9-55f67279e45c 74de6050-df66-494e-a39d-634486a42ba1 in service none none off + oxp_26cc7ce1-dc59-4398-8083-a4e1db957a46/crypt/zone/oxz_crucible_85078136-3cbf-4884-a44e-340c40cbd180 9e0b82f0-a54d-4fdf-94b2-c541122b9cc3 in service none none off + oxp_242f8f98-fdc2-4ea9-ab69-e57b993df0df/crypt/zone/oxz_crucible_dc841af2-b873-4a4b-a158-09a68db6445e 33a3b14e-9909-4479-97bd-0be277900b09 in service none none off + oxp_9dbfe441-887c-45d0-a3ed-7d8e1a63327f/crypt/zone/oxz_crucible_e1f8a0ca-4bce-4925-abe7-bdc508fff8e3 89217507-01e9-4dd8-996a-9e817ad0beb2 in service none none off + oxp_be1784b0-017a-436f-8a6a-1884cddc5fa1/crypt/zone/oxz_crucible_f3ac0681-8f1e-4e57-a81c-a958f79fe9db 7470d5e5-7364-46a2-b300-f2718152595e in service none none off + oxp_07444848-952b-4333-aa72-401c7bf5d724/crypt/zone/oxz_crucible_pantry_60d6c6b4-0754-413e-8a59-bcc3509d411a 8be3f090-9117-48e6-a70c-d69316a6717b in service none none off + oxp_07444848-952b-4333-aa72-401c7bf5d724/crypt/zone/oxz_external_dns_70bb46c9-820a-4e5b-b1fc-392aea9057e8 8c5070f6-e944-4145-8228-ab9113af93c5 in service none none off + oxp_242f8f98-fdc2-4ea9-ab69-e57b993df0df/crypt/zone/oxz_external_dns_e9aefa25-1524-4514-9a8d-075dc084c0a0 4021b946-52e8-4912-a593-ba7ceed36fea in service none none off + oxp_07444848-952b-4333-aa72-401c7bf5d724/crypt/zone/oxz_nexus_0b93b21c-9914-4802-bb58-225c314bea37 8408dce0-29f8-4a60-8fad-2e03f021d644 in service none none off + oxp_07444848-952b-4333-aa72-401c7bf5d724/crypt/zone/oxz_ntp_705fe10e-b41f-4de1-b712-3b9cd2a6cd3b 86bfdc91-a081-4b03-a5bc-dd18d599d4d6 in service none none off + oxp_07444848-952b-4333-aa72-401c7bf5d724/crypt/debug d7dec1d7-5224-44ea-9204-010ee599c30b in service 100 GiB none gzip-9 + oxp_242f8f98-fdc2-4ea9-ab69-e57b993df0df/crypt/debug f3018a49-906d-4d9d-86a3-8fabf977a065 in service 100 GiB none gzip-9 + oxp_26cc7ce1-dc59-4398-8083-a4e1db957a46/crypt/debug d60fb606-39d3-4009-9171-891e46162db3 in service 100 GiB none gzip-9 + oxp_3b757772-8c62-4543-a276-7c0051280687/crypt/debug ce7606db-0252-4e79-8206-67be3920832c in service 100 GiB none gzip-9 + oxp_981430ec-a43e-4418-bd2c-28db344c8b06/crypt/debug dab6f0cc-f6ec-4db1-b7d6-2f5c70ae9707 in service 100 GiB none gzip-9 + oxp_9dbfe441-887c-45d0-a3ed-7d8e1a63327f/crypt/debug f0a4cd88-9dd6-4a91-82cf-4d2b38a880fa in service 100 GiB none gzip-9 + oxp_b37f5663-bedb-42a3-9b1a-5e417ee6c3d2/crypt/debug 4b9dafab-3e0e-45c3-9c5d-457b8f132848 in service 100 GiB none gzip-9 + oxp_b48a178d-f7fd-4b50-811d-f7d195752710/crypt/debug 2df14d1f-6f07-4b68-936d-cb90250de553 in service 100 GiB none gzip-9 + oxp_be1784b0-017a-436f-8a6a-1884cddc5fa1/crypt/debug ff031e0e-da55-403e-89ff-80dd7f198d62 in service 100 GiB none gzip-9 + oxp_f9415bcf-5757-442a-a400-5a9ccfb5d80a/crypt/debug 31ffef1c-9028-41d9-8f9c-0778af15ed80 in service 100 GiB none gzip-9 + + omicron zones at generation 2: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -183,6 +402,59 @@ parent: e35b2fdd-354d-48d9-acb5-703b2c269a54 fake-vendor fake-model serial-e6433ded-7c90-46a9-8bda-648bcc9fbf07 + datasets at generation 2: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_148436fe-d3e9-4371-8d2e-ec950cc8a84c/crucible dee54247-21f2-4c28-bebb-f2fbb7c83bfe in service none none off + oxp_7dd076f1-9d62-49a8-bc0c-5ff5d045c917/crucible 529a930a-6320-411f-ae61-3f59e07c47f4 in service none none off + oxp_a50f4bb9-d19a-4be8-ad49-b9a552a21062/crucible fbdd0ac2-9f01-4b9a-ad23-8a4ec7cabde9 in service none none off + oxp_b4ee33bb-03f1-4085-9830-9da92002a969/crucible 0c62551c-a3fb-413f-8ae3-e3b0ada9b450 in service none none off + oxp_b50bec8b-a8d3-4ba6-ba3d-12c2a0da911c/crucible 2718de94-7ae1-4fef-9d41-310d00541642 in service none none off + oxp_b64f79f6-188f-4e98-9eac-d8111673a130/crucible 2cb15ec7-4779-49eb-8d47-9a061f7eaff3 in service none none off + oxp_c144a26e-f859-42a0-adca-00d9091d98e4/crucible 8a89a8f2-b50d-40b2-bacc-832199f82f87 in service none none off + oxp_c45c08e4-aade-4333-9dad-935ccf4e8352/crucible b3123cea-aecb-4e3e-8465-a78c7d1195c4 in service none none off + oxp_df62d5da-7da0-468b-b328-0fefbf57568b/crucible 079b2268-a93c-4f39-acba-8c1d4439d136 in service none none off + oxp_e6433ded-7c90-46a9-8bda-648bcc9fbf07/crucible 1b10d660-1940-46eb-b141-0cf26208b0a9 in service none none off + oxp_148436fe-d3e9-4371-8d2e-ec950cc8a84c/crypt/external_dns 4622b344-5a96-4cc3-aad8-4507068f5017 in service none none off + oxp_7dd076f1-9d62-49a8-bc0c-5ff5d045c917/crypt/external_dns f667b2d7-74ab-43bf-a64c-57a878ee3034 in service none none off + oxp_148436fe-d3e9-4371-8d2e-ec950cc8a84c/crypt/zone 85e98d0b-f6f0-4afe-ac4d-14d0f6669b2a in service none none off + oxp_7dd076f1-9d62-49a8-bc0c-5ff5d045c917/crypt/zone d60ec30b-942e-44e5-882b-c8b8f888460e in service none none off + oxp_a50f4bb9-d19a-4be8-ad49-b9a552a21062/crypt/zone 3f7d18e0-9ec6-4a87-911d-0183739c2ffd in service none none off + oxp_b4ee33bb-03f1-4085-9830-9da92002a969/crypt/zone 08b6a055-98db-4376-b396-1e3dcd6fbecf in service none none off + oxp_b50bec8b-a8d3-4ba6-ba3d-12c2a0da911c/crypt/zone a298c038-70ac-4116-895a-6fc4d1c51dec in service none none off + oxp_b64f79f6-188f-4e98-9eac-d8111673a130/crypt/zone df6e91a0-82d7-405d-b481-6aae75c15047 in service none none off + oxp_c144a26e-f859-42a0-adca-00d9091d98e4/crypt/zone 8b43e963-8588-43c8-96d2-7e6e7ef2e4e2 in service none none off + oxp_c45c08e4-aade-4333-9dad-935ccf4e8352/crypt/zone 4a93eff0-1bfb-4320-af7a-1790a97799f3 in service none none off + oxp_df62d5da-7da0-468b-b328-0fefbf57568b/crypt/zone 805cbc7f-343c-48d0-82d1-c37bd0d66791 in service none none off + oxp_e6433ded-7c90-46a9-8bda-648bcc9fbf07/crypt/zone 3ec713f1-9d3f-4eec-8eaf-9fbd3463ab01 in service none none off + oxp_e6433ded-7c90-46a9-8bda-648bcc9fbf07/crypt/zone/oxz_crucible_39360f6b-69bc-4c7b-b24f-0a9d640e8e56 fbeef67c-87f4-4f72-8f37-26e91ac2b201 in service none none off + oxp_7dd076f1-9d62-49a8-bc0c-5ff5d045c917/crypt/zone/oxz_crucible_52074602-a8a5-47f0-90b6-5932b06034a2 eda95d99-943d-47f9-95c1-ed76644730a7 in service none none off + oxp_df62d5da-7da0-468b-b328-0fefbf57568b/crypt/zone/oxz_crucible_59da8225-2f80-41ae-afef-dce85dcb526d a61a76cc-a67c-4058-9a86-331e7bd515e5 in service none none off + oxp_a50f4bb9-d19a-4be8-ad49-b9a552a21062/crypt/zone/oxz_crucible_5d3ec58b-746e-4f10-9998-5fd81dc34ef1 199b9d29-bd4c-49aa-9f01-ade8b3b8a675 in service none none off + oxp_c45c08e4-aade-4333-9dad-935ccf4e8352/crypt/zone/oxz_crucible_65fc4eb5-51c3-4361-81a4-a216b4ed67a0 94591489-a008-4a3a-a267-74eb92cbc1be in service none none off + oxp_b64f79f6-188f-4e98-9eac-d8111673a130/crypt/zone/oxz_crucible_765252ef-de7d-4023-b271-7acd6299ba5f b3e9840a-544d-42d5-8515-2ad770db981f in service none none off + oxp_b4ee33bb-03f1-4085-9830-9da92002a969/crypt/zone/oxz_crucible_7bc16ca6-36d7-4a7c-93e7-6d1f0aad41bb 7955c220-1c2c-4e32-9b62-cabafb94b71b in service none none off + oxp_b50bec8b-a8d3-4ba6-ba3d-12c2a0da911c/crypt/zone/oxz_crucible_a6a695dc-0d62-4d4e-936a-8e7ee1e527e8 6bcdc042-f427-45a7-8f80-7a104101a9a1 in service none none off + oxp_148436fe-d3e9-4371-8d2e-ec950cc8a84c/crypt/zone/oxz_crucible_abf18c62-0342-450c-b646-7df9f2951b76 8aa4766c-040a-4839-9d9b-9972db5f80ee in service none none off + oxp_c144a26e-f859-42a0-adca-00d9091d98e4/crypt/zone/oxz_crucible_c0f1485b-d707-4aec-8c87-3c5057018ef2 28119b20-9f55-4f2e-9585-5e9cafbfb8e9 in service none none off + oxp_148436fe-d3e9-4371-8d2e-ec950cc8a84c/crypt/zone/oxz_crucible_pantry_038ba0cf-de93-45b1-a0ae-b894b36bf92d 71778fe9-8f9d-4909-a13e-32ab8d3e527f in service none none off + oxp_7dd076f1-9d62-49a8-bc0c-5ff5d045c917/crypt/zone/oxz_external_dns_402719bf-c387-4979-8ae4-3a6f8eada5ab abb0d1c2-72c3-4edf-85f0-0a6c58ae8b82 in service none none off + oxp_148436fe-d3e9-4371-8d2e-ec950cc8a84c/crypt/zone/oxz_external_dns_9ee48a0d-66ac-4fc9-aaa8-8f939ebef705 6cc1b1bf-4012-409d-ad57-110a5431ee86 in service none none off + oxp_148436fe-d3e9-4371-8d2e-ec950cc8a84c/crypt/zone/oxz_nexus_ec10317f-5c36-4092-827c-f2826c5572d5 c4714f55-8e4d-4a24-88c1-e3c16551ff26 in service none none off + oxp_148436fe-d3e9-4371-8d2e-ec950cc8a84c/crypt/zone/oxz_ntp_4420e03b-4086-48c6-b27d-824bb5bb4758 ea186f3b-214f-43b3-8b3e-1d3cb81f3ee9 in service none none off + oxp_148436fe-d3e9-4371-8d2e-ec950cc8a84c/crypt/debug dcb06a9e-a678-4e7f-9fc4-4907939152cb in service 100 GiB none gzip-9 + oxp_7dd076f1-9d62-49a8-bc0c-5ff5d045c917/crypt/debug 92678623-059c-486a-b250-4570f46b7110 in service 100 GiB none gzip-9 + oxp_a50f4bb9-d19a-4be8-ad49-b9a552a21062/crypt/debug c88f9b12-cb36-4d2a-a2e4-f31171fa43fb in service 100 GiB none gzip-9 + oxp_b4ee33bb-03f1-4085-9830-9da92002a969/crypt/debug 5eec2c42-41a5-47c1-854c-51c3fa647b29 in service 100 GiB none gzip-9 + oxp_b50bec8b-a8d3-4ba6-ba3d-12c2a0da911c/crypt/debug 8b59e6bf-82bd-484d-91e8-4f0b1e268d4b in service 100 GiB none gzip-9 + oxp_b64f79f6-188f-4e98-9eac-d8111673a130/crypt/debug a8488ccc-abf9-4037-a931-96d51e02949a in service 100 GiB none gzip-9 + oxp_c144a26e-f859-42a0-adca-00d9091d98e4/crypt/debug ab25a292-63d1-4100-9aeb-d9a605e0f481 in service 100 GiB none gzip-9 + oxp_c45c08e4-aade-4333-9dad-935ccf4e8352/crypt/debug b2b9d826-085b-4ddc-94dd-2f0ef17502cf in service 100 GiB none gzip-9 + oxp_df62d5da-7da0-468b-b328-0fefbf57568b/crypt/debug 436054c4-b4ed-457a-b986-ae644b579e64 in service 100 GiB none gzip-9 + oxp_e6433ded-7c90-46a9-8bda-648bcc9fbf07/crypt/debug 2d4fe11c-a87b-4e3a-a66a-9b5258986a50 in service 100 GiB none gzip-9 + + omicron zones at generation 2: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP diff --git a/nexus/reconfigurator/planning/tests/output/planner_decommissions_sleds_bp2.txt b/nexus/reconfigurator/planning/tests/output/planner_decommissions_sleds_bp2.txt index 64fa1b68c1d..99e4778a288 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_decommissions_sleds_bp2.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_decommissions_sleds_bp2.txt @@ -19,6 +19,59 @@ parent: 516e80a3-b362-4fac-bd3c-4559717120dd fake-vendor fake-model serial-ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59 + datasets at generation 3: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crucible 6faaf132-5e10-43a9-926c-abc32ad8b2fe in service none none off + oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crucible cbb904a8-0871-4038-933c-7393bbc0738c in service none none off + oxp_4e91d4a3-bb6c-44bb-bd4e-bf8913c1ba2b/crucible 75b0260f-d857-434f-b0a6-d1b0b23702e2 in service none none off + oxp_67de3a80-29cb-4066-b743-e285a2ca1f4e/crucible 80f92c60-b0f3-4841-ae1d-350f9263c51f in service none none off + oxp_9139b70f-c1d3-475d-8f02-7c9acba52b2b/crucible ec3fcfea-8287-4e80-8f53-7967a939db01 in service none none off + oxp_95fbb110-5272-4646-ab50-21b31b7cde23/crucible 9cc9e83b-d758-4be4-b9c5-5ab4e0d0c201 in service none none off + oxp_9bf35cd7-4938-4c34-8189-288b3195cb64/crucible 4e7dac6e-b754-4911-89c1-1c9cd6a68ace in service none none off + oxp_9d833141-18a1-4f24-8a34-6076c026aa87/crucible 4f33ef0a-829e-48c1-b5b9-a4e11f0f38c3 in service none none off + oxp_a279461f-a7b9-413f-a79f-cb4dab4c3fce/crucible 259a9726-27bc-495e-b7d2-29c884561005 in service none none off + oxp_ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59/crucible df77d6ef-0910-433c-a7a5-baef6c34fc86 in service none none off + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/internal_dns e43ceee2-3657-4145-8e8f-fac08f34573b in service none none off + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone dc72e5ba-059c-4075-9d2c-7c69116e17ec in service none none off + oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crypt/zone 64a09f6f-3aa2-416d-a133-bfa44af9e83c in service none none off + oxp_4e91d4a3-bb6c-44bb-bd4e-bf8913c1ba2b/crypt/zone 48679db3-ca47-4bde-8ee7-6a6b2ab2afdb in service none none off + oxp_67de3a80-29cb-4066-b743-e285a2ca1f4e/crypt/zone 4177690d-bf09-45a1-add0-6c25f4d4806e in service none none off + oxp_9139b70f-c1d3-475d-8f02-7c9acba52b2b/crypt/zone 94e76685-337a-45ba-946f-e3ec5408c58a in service none none off + oxp_95fbb110-5272-4646-ab50-21b31b7cde23/crypt/zone bc07535b-996c-402d-b488-d6b959c7c267 in service none none off + oxp_9bf35cd7-4938-4c34-8189-288b3195cb64/crypt/zone 5e6eb3f4-a68a-418a-917b-3beafd068acd in service none none off + oxp_9d833141-18a1-4f24-8a34-6076c026aa87/crypt/zone 34f23c48-7d0a-4d83-98f8-4746e14a3315 in service none none off + oxp_a279461f-a7b9-413f-a79f-cb4dab4c3fce/crypt/zone 70723c5d-41ba-47db-bb36-47ccc07325de in service none none off + oxp_ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59/crypt/zone f33074db-c35d-4cd8-a701-c28334be71d8 in service none none off + oxp_ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59/crypt/zone/oxz_crucible_052553cb-8a1a-42a4-a6cb-97a913e78877 7f96c7eb-3117-4d62-92ff-04ca0b4d4a93 in service none none off + oxp_67de3a80-29cb-4066-b743-e285a2ca1f4e/crypt/zone/oxz_crucible_1bd2301a-acd3-4a9c-82d7-b0c19a3c5597 973ab9e7-2437-4d00-b6d4-61f19e352a2e in service none none off + oxp_9d833141-18a1-4f24-8a34-6076c026aa87/crypt/zone/oxz_crucible_7975aa01-6fa9-4622-a8ba-8bfcf000f8eb 3c378515-facd-4c9f-b2b3-0920fe04456d in service none none off + oxp_9139b70f-c1d3-475d-8f02-7c9acba52b2b/crypt/zone/oxz_crucible_85286e23-2498-4034-9999-c5263fc0295f 5eaa35c8-c0b4-40ad-ba1d-2ba9286b1acd in service none none off + oxp_a279461f-a7b9-413f-a79f-cb4dab4c3fce/crypt/zone/oxz_crucible_a320b746-b5f6-4027-9c3c-d41e099f2def 0e65e617-9258-4b02-a0a5-76ce1b5c65d9 in service none none off + oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crypt/zone/oxz_crucible_dcd393d4-d16c-41a8-8c16-48e0ab80d2e2 c2de0977-abf7-4c6c-b8ce-425c10d8da09 in service none none off + oxp_4e91d4a3-bb6c-44bb-bd4e-bf8913c1ba2b/crypt/zone/oxz_crucible_de34e868-675e-4291-a2f7-c0b24e2e18a1 6afaa452-d2ff-4ea9-ad6e-b0b59183ef2b in service none none off + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone/oxz_crucible_e11dd8a6-951a-4019-8775-bed3a2092aaa b3cd735d-4d94-412a-9a25-06b9fab912e0 in service none none off + oxp_9bf35cd7-4938-4c34-8189-288b3195cb64/crypt/zone/oxz_crucible_f8cdd98e-4ab4-46bb-b621-7590808582cc 4befe2e1-3d46-4b61-a92a-66f27db0df0e in service none none off + oxp_95fbb110-5272-4646-ab50-21b31b7cde23/crypt/zone/oxz_crucible_fcccf363-d190-441c-ba40-58e24f8a9cb3 82c66769-fc0d-49df-bb32-bc7f61892134 in service none none off + oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crypt/zone/oxz_crucible_pantry_6b6843d6-062c-4400-8fd9-d11b5d138fe6 204afeeb-fde3-400f-b809-e1acfc11bf7e in service none none off + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone/oxz_crucible_pantry_a22472df-5df2-4c1f-ad1f-439a4164984f 2b22a609-539c-478a-939e-ba25068d31ee in service none none off + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone/oxz_internal_dns_936b1cbb-84e5-48ab-bc59-3bbd7830a421 1f4d6d18-0bdf-4e39-b838-b82fb1eac0e0 in service none none off + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone/oxz_nexus_33ef9872-ee9a-4478-89b9-b22b78e00d3a 7924cb4a-4be3-4346-820a-04bfdb3c03a8 in service none none off + oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crypt/zone/oxz_nexus_75fb916b-4793-4cd0-873b-573768b1efe5 9a3ecdfc-970b-4376-8f89-7fe8751ae9f5 in service none none off + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/zone/oxz_ntp_52031fcc-eb18-45f5-ae6c-65c7858b5e93 44dce497-2648-40ab-9a0f-d896c9b61db1 in service none none off + oxp_1e2ec79e-9c11-4133-ac77-e0b994a507d5/crypt/debug a5a387a4-2e8d-4038-b386-bf1dffc96d41 in service 100 GiB none gzip-9 + oxp_440ae69d-5e2e-4539-91d0-e2930bdd7203/crypt/debug c61256ce-c152-4658-8e49-b31f65b615e8 in service 100 GiB none gzip-9 + oxp_4e91d4a3-bb6c-44bb-bd4e-bf8913c1ba2b/crypt/debug 52828e06-cdaf-4291-9d1c-b5b1f42515af in service 100 GiB none gzip-9 + oxp_67de3a80-29cb-4066-b743-e285a2ca1f4e/crypt/debug 4173e69d-fb09-4068-a3f9-23638e968082 in service 100 GiB none gzip-9 + oxp_9139b70f-c1d3-475d-8f02-7c9acba52b2b/crypt/debug bf42b426-4b74-433b-bc3e-7d4e7f1afba4 in service 100 GiB none gzip-9 + oxp_95fbb110-5272-4646-ab50-21b31b7cde23/crypt/debug 250aa09f-3953-4ce6-8160-67ecabc98add in service 100 GiB none gzip-9 + oxp_9bf35cd7-4938-4c34-8189-288b3195cb64/crypt/debug 34a79944-be59-4246-afda-b676e91afddb in service 100 GiB none gzip-9 + oxp_9d833141-18a1-4f24-8a34-6076c026aa87/crypt/debug 9d168de0-6b87-405d-b4fc-926b381b0c45 in service 100 GiB none gzip-9 + oxp_a279461f-a7b9-413f-a79f-cb4dab4c3fce/crypt/debug 9ace6e03-ed94-4444-b524-c3978461964c in service 100 GiB none gzip-9 + oxp_ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59/crypt/debug f43393b3-98ce-48b7-9c97-cb25b5a93130 in service 100 GiB none gzip-9 + + omicron zones at generation 3: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -60,6 +113,61 @@ parent: 516e80a3-b362-4fac-bd3c-4559717120dd fake-vendor fake-model serial-99e926d6-bd42-4cde-9f63-5ecc7ea14322 + datasets at generation 3: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_07068f19-1ff2-48da-8e72-874780df2339/crucible 43cd1a3a-7dcf-47a2-bf7f-1042c9ed4461 in service none none off + oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crucible b934756b-aff6-4435-bf59-42fcdb5433ef in service none none off + oxp_0fdb4a39-3cd5-47a0-9064-e7f3c285af61/crucible 476e6363-ef7a-4538-9906-61380605378a in service none none off + oxp_13572832-83ad-40d6-896a-751f7e53f4f6/crucible 3b15616c-0339-4816-a057-1c9ca76bc5d9 in service none none off + oxp_3602bdd9-f7bb-4490-87a6-8f061f7712f5/crucible 3fa34ab2-ae9e-4633-bf8f-e0b985591f55 in service none none off + oxp_65707837-95a4-45d7-84e6-8b9a4da215f1/crucible 86cbb449-770b-4ef0-bbdd-e66c96abecb9 in service none none off + oxp_7a43b2b0-3846-401c-8317-d555715a00f7/crucible 912ebbe4-bef6-4cf7-92a5-e21eb72fbf87 in service none none off + oxp_855e3ef1-6929-4e21-8451-0e62bd93c7c9/crucible 4ff0cc73-4531-4717-a130-cb28345ddea2 in service none none off + oxp_8adcf329-4cee-4075-b798-28b5add1edf5/crucible 3d95ffb6-833e-4e1a-a660-6f1544221ed5 in service none none off + oxp_99e926d6-bd42-4cde-9f63-5ecc7ea14322/crucible bc0f19c5-73af-4c32-97e4-51bee5a874de in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/clickhouse dd8bc8e6-1103-4425-82da-0f7df6951581 in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/internal_dns 5fe43d44-e28d-4343-b09b-06115e410cfc in service none none off + oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crypt/internal_dns a1b355d4-5b1d-406d-960f-e61e30c2aa2a in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone 19c47885-6b4a-45c6-8dd6-8f3530737df1 in service none none off + oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crypt/zone 1ffa3016-9c49-47f1-a443-429cc5ee72ff in service none none off + oxp_0fdb4a39-3cd5-47a0-9064-e7f3c285af61/crypt/zone f21e6928-e9c2-4eff-a710-1e6034948aad in service none none off + oxp_13572832-83ad-40d6-896a-751f7e53f4f6/crypt/zone ec753ba9-fa33-4e83-9cd2-7a0eb75f3825 in service none none off + oxp_3602bdd9-f7bb-4490-87a6-8f061f7712f5/crypt/zone 08a7b1b4-2fe9-4412-b847-de67413835d8 in service none none off + oxp_65707837-95a4-45d7-84e6-8b9a4da215f1/crypt/zone d1404c52-a67c-4d5a-82ee-381fc43e7906 in service none none off + oxp_7a43b2b0-3846-401c-8317-d555715a00f7/crypt/zone ddef09d3-762e-40b1-b484-03bfa2da3bd9 in service none none off + oxp_855e3ef1-6929-4e21-8451-0e62bd93c7c9/crypt/zone 51d6f7a3-386d-4d17-9898-ccc9e8da2b2b in service none none off + oxp_8adcf329-4cee-4075-b798-28b5add1edf5/crypt/zone 21095495-e67e-4f2f-ad5a-3382350b51b9 in service none none off + oxp_99e926d6-bd42-4cde-9f63-5ecc7ea14322/crypt/zone 36b5605c-d6c0-4963-a4eb-5090988da393 in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_clickhouse_a5813480-2b89-4e18-a09b-c9e5b6b317cc c113e4ea-c33e-4df0-957b-5f7a856d5214 in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_crucible_40f9f06b-eed5-47b9-9925-8afd5540d9f5 73f22559-8377-43cf-b028-4164d68826c9 in service none none off + oxp_13572832-83ad-40d6-896a-751f7e53f4f6/crypt/zone/oxz_crucible_4561a213-e297-41d2-b40d-995b35715ede c49aa53a-775f-4d2f-bb60-931e82c9d837 in service none none off + oxp_99e926d6-bd42-4cde-9f63-5ecc7ea14322/crypt/zone/oxz_crucible_5e41815b-3aa2-4507-b3ea-3694c0e05b34 da3da14c-05b9-4922-b7a4-be05f23d1da8 in service none none off + oxp_7a43b2b0-3846-401c-8317-d555715a00f7/crypt/zone/oxz_crucible_619451af-30b4-4252-9688-379be6555534 da3ab91c-ffa8-46e4-8a4a-de8a56e02315 in service none none off + oxp_0fdb4a39-3cd5-47a0-9064-e7f3c285af61/crypt/zone/oxz_crucible_64f9bfcb-c1d5-4f15-a877-778ba83c4ada 07c46767-93f4-43df-8dcd-25abf3aaf296 in service none none off + oxp_8adcf329-4cee-4075-b798-28b5add1edf5/crypt/zone/oxz_crucible_a6ac7172-669b-4ac1-9532-2848bcb80545 dc27c769-7880-439e-84c7-29c92880a219 in service none none off + oxp_65707837-95a4-45d7-84e6-8b9a4da215f1/crypt/zone/oxz_crucible_e65276c2-baeb-4ab1-9a37-e48786f14dad dceafe94-f4df-4556-9a46-560c59069e46 in service none none off + oxp_3602bdd9-f7bb-4490-87a6-8f061f7712f5/crypt/zone/oxz_crucible_e6788bd0-ac6e-4125-93d0-aacbc6380f04 d730d05e-7a17-442e-9959-2e0ea58860c5 in service none none off + oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crypt/zone/oxz_crucible_ea37e4ab-65c6-463a-a2d4-9cf8f0ccbd00 4035218d-b1ed-422a-a202-4f4fd19767b6 in service none none off + oxp_855e3ef1-6929-4e21-8451-0e62bd93c7c9/crypt/zone/oxz_crucible_f52b4e76-5989-42cf-9208-60548c34b487 a8d1ad8b-946f-46e9-8bc3-4aaae1ca31f6 in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_crucible_pantry_4c1e95a8-7fae-4a3a-8651-9272ef7c9a88 53123c3d-64d2-432d-b72c-9e0c41ffa805 in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_internal_dns_7b2bb1aa-639b-4aaa-bd80-9c680e4be5fc f24ddc4e-2569-4447-ad1a-e1e0da2e7b41 in service none none off + oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crypt/zone/oxz_internal_dns_d74f14f1-0a19-4d92-b76f-1b3a6e630b2c 672e989c-aec3-4fd9-b7f9-f2af75b3bc01 in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_nexus_294379f6-502c-465b-b32d-771c415a38af 61bd7f63-49c5-481e-8f1e-075642b59fa9 in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/zone/oxz_ntp_064ec0c2-a320-4efb-b006-9e0e1d942d8e 701a8f75-31f5-404f-ad44-1659106f80dd in service none none off + oxp_07068f19-1ff2-48da-8e72-874780df2339/crypt/debug ba8224f4-9d26-4fa8-89ac-830e5734c58e in service 100 GiB none gzip-9 + oxp_0f12e6ee-41d2-4eb0-813f-ba5240900ded/crypt/debug 73d82f70-9ae4-4212-bc41-42aa7cd6d5c2 in service 100 GiB none gzip-9 + oxp_0fdb4a39-3cd5-47a0-9064-e7f3c285af61/crypt/debug 71bbed5f-6b13-41f8-87e1-1dff19e2680f in service 100 GiB none gzip-9 + oxp_13572832-83ad-40d6-896a-751f7e53f4f6/crypt/debug bd2e7c19-590f-476e-9eb1-b1cabe99600a in service 100 GiB none gzip-9 + oxp_3602bdd9-f7bb-4490-87a6-8f061f7712f5/crypt/debug 12b10546-bc67-43c4-993b-adcc04aa2b3f in service 100 GiB none gzip-9 + oxp_65707837-95a4-45d7-84e6-8b9a4da215f1/crypt/debug 08d9c58d-fe91-4b9c-9db8-0b32e3b7f4e0 in service 100 GiB none gzip-9 + oxp_7a43b2b0-3846-401c-8317-d555715a00f7/crypt/debug e7e5170c-5547-4733-885b-3fc385e97941 in service 100 GiB none gzip-9 + oxp_855e3ef1-6929-4e21-8451-0e62bd93c7c9/crypt/debug 1097db6f-ea2d-46cb-9a1f-be933677f4ea in service 100 GiB none gzip-9 + oxp_8adcf329-4cee-4075-b798-28b5add1edf5/crypt/debug 10e453e2-115f-42dd-a575-10a593b56762 in service 100 GiB none gzip-9 + oxp_99e926d6-bd42-4cde-9f63-5ecc7ea14322/crypt/debug a5162371-5108-497f-a3de-2b95a0dfafbe in service 100 GiB none gzip-9 + + omicron zones at generation 3: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -82,7 +190,6 @@ parent: 516e80a3-b362-4fac-bd3c-4559717120dd nexus 294379f6-502c-465b-b32d-771c415a38af in service fd00:1122:3344:102::22 - !a1b477db-b629-48eb-911d-1ccdafca75b9 WARNING: Zones exist without physical disks! omicron zones at generation 3: diff --git a/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_bp2.txt b/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_bp2.txt index 7959301ca15..63f2d89ef52 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_bp2.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_bp2.txt @@ -19,6 +19,59 @@ parent: 4d4e6c38-cd95-4c4e-8f45-6af4d686964b fake-vendor fake-model serial-d1ebfd7b-3842-4ad7-be31-2b9c031209a9 + datasets at generation 2: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crucible 01b78855-bc58-45bd-937e-49221a71b875 in service none none off + oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crucible 99ddb9cf-a52c-4b59-884e-dea52e6b4f5d in service none none off + oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crucible 354e3bc2-e6c8-49c0-bf1d-c136e499037c in service none none off + oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crucible 7f36c891-2cf8-4e94-b12a-24199b83462b in service none none off + oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crucible 8dd12603-6cfc-42dd-8912-2a16cb7a748d in service none none off + oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crucible 8ff2aecd-a1e8-47bd-8001-97c3e5efb99b in service none none off + oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crucible dab52576-17e4-4bf8-b87e-c49983a388c2 in service none none off + oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crucible d2c5b427-f956-4cd1-b174-6caca3685e6f in service none none off + oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crucible e2e73bed-32f9-4111-803b-561cbd7faa1a in service none none off + oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crucible 5ba5e79d-0a13-41e5-b4d2-6c7cb468cb26 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/clickhouse 37aac368-1b57-4934-b771-5802ae6d6606 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/internal_dns 2f276f3f-ad8c-458e-bb62-03f5ec7643f3 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone a8381430-0bf6-49fd-8e5a-4e7c7eb4edf4 in service none none off + oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crypt/zone 34fb7c7c-17c2-4cbb-af27-12b693965a4b in service none none off + oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crypt/zone a6f2fa57-1161-4b49-b591-2a9cd5a992f3 in service none none off + oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crypt/zone df22d065-beb6-45e4-984e-874dfdd3b285 in service none none off + oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crypt/zone 59656ee4-d86f-49ff-b4b8-39e1021642f4 in service none none off + oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crypt/zone ea5ee557-cc4e-4a9b-87a7-7bb9b30589da in service none none off + oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crypt/zone 5b0f2d79-6120-4b28-8fd6-919a121f5875 in service none none off + oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crypt/zone dd56b58b-871e-4f55-bcf5-0bd4e8184761 in service none none off + oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crypt/zone bafeb8db-cb8e-45fc-8030-3a85a26e2feb in service none none off + oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crypt/zone b567319c-bb7a-4ac0-a95b-20bd88c26579 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_clickhouse_5fbb489a-141d-4de2-86c4-4fd7b9d9f315 648fecf4-8ce6-4bce-9020-789057c92f95 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_crucible_0ce2b998-f5ad-4dc5-b2ec-5250a308506d 4fe9bcd8-399f-444e-aa01-f8cb285de102 in service none none off + oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crypt/zone/oxz_crucible_0e8e9f2d-291d-47fc-ba0f-84cb50e713fd ff5a6a51-2797-4016-903f-69ec69e59ef9 in service none none off + oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crypt/zone/oxz_crucible_11fc3b08-2470-4f1b-9187-acff1fc4c5ea 32b45c55-cc53-4635-ae2b-559821b409fe in service none none off + oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crypt/zone/oxz_crucible_673ecd68-d12a-46d9-9126-0a6be6245f84 0377cfc0-2bf6-4906-87f7-031121797594 in service none none off + oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crypt/zone/oxz_crucible_966c4f15-0aa8-4bef-95e4-49d686cffdfc 9ef1c45c-753a-4ecf-9145-72889ece2ad2 in service none none off + oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crypt/zone/oxz_crucible_979a7b5b-81a5-49bc-82e5-d88b6eaf7d96 b075b63e-f072-4f35-86d1-a81e50065994 in service none none off + oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crypt/zone/oxz_crucible_b6beadb1-351b-461d-a887-e7641d976a9e 9d2477db-7dea-4e19-b563-60a18a659cca in service none none off + oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crypt/zone/oxz_crucible_cf7add30-1c49-4d49-a2d2-1c46a60cd884 3b71883e-8704-468e-96fa-7b4fd85d37e8 in service none none off + oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crypt/zone/oxz_crucible_d0d4a23e-45fa-4f80-9bdf-a348de3f7b8f 5888130a-54bf-4358-bb1b-099347648757 in service none none off + oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crypt/zone/oxz_crucible_e46d1442-2a63-44e3-a6aa-e88150b85d92 c4739101-dd65-4649-8e99-e221dc9ce93e in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_crucible_pantry_45b6f382-3590-4281-b65d-083ba7aff2d3 f07a8f89-a4e1-4c71-b223-a4c09af0e443 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_internal_dns_4fd906d8-94cd-44b3-ad5e-34b4d193bd3c 3681f68d-2840-47be-8bb7-8c7354daf8a7 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_nexus_88602518-f176-49a1-af12-02fac36214c3 99c53b55-b716-414d-b8ff-a9d56bd9cd6c in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/zone/oxz_ntp_b0a48e5a-e2bd-46b2-9bc6-8babbbdc0adc ed9b8ac9-88f4-46fa-8ecf-5a7534d4f020 in service none none off + oxp_13e6503b-5300-4ccd-abc4-c1512b435929/crypt/debug 97bc5b54-dd6a-4b98-b9e0-081657a3db89 in service 100 GiB none gzip-9 + oxp_44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34/crypt/debug 8d054703-b940-4395-8c46-2ff519f5133a in service 100 GiB none gzip-9 + oxp_4de5fc8e-0e41-4ab9-ba12-2dc63882c96a/crypt/debug bb388082-2d09-4a4b-bb22-ee3f4b7b5025 in service 100 GiB none gzip-9 + oxp_51564e7a-d69f-4942-bcfe-330224633ca6/crypt/debug fe2005ba-7f3d-4fc3-b324-09a258fc4a4b in service 100 GiB none gzip-9 + oxp_5ca23cb3-cc90-41c5-a474-01898cdd0796/crypt/debug e20df72b-3d75-48ad-8349-3e39cc886886 in service 100 GiB none gzip-9 + oxp_6a23a532-0712-4a8d-be9b-e8c17e97aa4b/crypt/debug cf2b245f-c667-49a9-bbc2-ada9a51e63f0 in service 100 GiB none gzip-9 + oxp_6f1a330e-e8d4-4c09-97fc-8918b69b2a3c/crypt/debug 1c606d5c-ce8c-42e8-9359-d2e0fe31d525 in service 100 GiB none gzip-9 + oxp_7113d104-fb55-4299-bf53-b3c59d258e44/crypt/debug 1f3f9209-c380-40ab-a2f0-16ecddb6d4a8 in service 100 GiB none gzip-9 + oxp_8c10be49-3a66-40d4-a082-64d09d916f14/crypt/debug 89b81a7c-3bc3-455d-97e3-75067de991d5 in service 100 GiB none gzip-9 + oxp_d1ebfd7b-3842-4ad7-be31-2b9c031209a9/crypt/debug 1e581e94-bb9d-4514-8dbb-3a882e342d1b in service 100 GiB none gzip-9 + + omicron zones at generation 2: --------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP @@ -59,6 +112,57 @@ parent: 4d4e6c38-cd95-4c4e-8f45-6af4d686964b fake-vendor fake-model serial-f4d7f914-ec73-4b65-8696-5068591d9065 + datasets at generation 3: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crucible 081aff15-bc64-4b57-bbcc-287d7267caa4 in service none none off + oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crucible 0beeebcf-b558-47e9-9274-bc3dd4a475b8 in service none none off + oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crucible 757dd9e5-74db-4860-a87e-0aafd6795b91 in service none none off + oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crucible bd64099e-57f0-447f-9c21-e493e2809372 in service none none off + oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crucible 3bd0565c-1170-4727-824b-f180454e4ff1 in service none none off + oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crucible 010c6c12-6ea3-4bbd-9a69-90209dab73ab in service none none off + oxp_a5f75431-3795-426c-8f80-176f658281a5/crucible 2dbc8272-64ae-4d2d-ac1f-92f120204ddd in service none none off + oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crucible b4e4e724-ddfb-4d0a-bf6b-edd6dd91172d in service none none off + oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crucible 8fdfaea0-1da2-429f-b64e-ef0107f2884d in service none none off + oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crucible 74dc30b1-2c84-4e9d-910c-938d33f9a537 in service none none off + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone f282431f-2ed2-4386-bc0f-0f3130b175bf in service none none off + oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/zone ee3f0e38-23ac-45c6-8157-e611887572a6 in service none none off + oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/zone acf672d0-effd-491a-bde8-a4253e078f14 in service none none off + oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/zone d5be658f-367a-4703-a377-7d8067aade3a in service none none off + oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crypt/zone adbebdd0-4d0d-4794-9bb5-6681b5119624 in service none none off + oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crypt/zone 1e063fbb-083c-4e2e-a4f5-c40ce854f1d0 in service none none off + oxp_a5f75431-3795-426c-8f80-176f658281a5/crypt/zone 6b476700-d002-4173-8a83-fb24d49be32f in service none none off + oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crypt/zone abaa13f5-c3ec-45b2-86da-2be74a259878 in service none none off + oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crypt/zone d8c2da98-ef6d-4746-ae4b-ed537c78fc89 in service none none off + oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crypt/zone b1c8156e-7490-46d2-a4af-7fc5dd39991d in service none none off + oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/zone/oxz_crucible_05ba6d6e-90a7-402a-aaba-fd92190a9f48 6a6e744c-c4a9-4e58-b0ed-ef44eef0c6e0 in service none none off + oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crypt/zone/oxz_crucible_2097bad3-ee65-4a1c-8fe2-75ed52e69ac8 54941545-0cee-4c36-8516-c63b3cbd02fb in service none none off + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone/oxz_crucible_430c8fe1-7296-4a73-b260-fc185260ec5e d0ee4ede-c9a6-4d6a-9dbe-63b4c07a9cdd in service none none off + oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crypt/zone/oxz_crucible_a720288d-3e5b-44b7-9dab-a69a10768e0b 3fa16efe-c488-4d45-92ee-18eeb8b9453f in service none none off + oxp_a5f75431-3795-426c-8f80-176f658281a5/crypt/zone/oxz_crucible_b2170eef-aa6f-4ec5-aaa9-2b4289eae65c e20a6e28-7a52-480a-9d36-33f8d4474bf5 in service none none off + oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crypt/zone/oxz_crucible_b505d6e1-07b9-48bf-bc8a-d4081c25b12a 6b965329-4398-4738-84e6-b893f21a724c in service none none off + oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/zone/oxz_crucible_cbe34d65-017e-4c26-966d-b1ce27bc1d94 8ad4a9ed-7be5-4f49-8a38-1686144ceaf6 in service none none off + oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crypt/zone/oxz_crucible_e01462d1-5173-4d95-8477-78ca2157efbb 03fbd010-e16e-48a9-a9a9-5be665c0bdff in service none none off + oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/zone/oxz_crucible_e49b0403-3d7c-480f-9113-4bc0fca74a8a 62053fe9-281c-4949-9357-bf818004aef2 in service none none off + oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crypt/zone/oxz_crucible_e6ec9399-b81b-4bdd-8e6e-b0f043aad942 f761d5be-fef1-47d7-850c-1f28a1f8a8b3 in service none none off + oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/zone/oxz_nexus_2ed23118-6137-45ca-824c-04df3bc3d085 047b92e1-2286-44bb-988e-403f20973ee4 in service none none off + oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/zone/oxz_nexus_33365de5-8a83-46c0-9d34-eddd68e54c6f 4f6d72db-de32-4a55-ae9d-30d776580c33 in service none none off + oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/zone/oxz_nexus_80e4964b-a8c8-41ef-ae23-f86cfe5f3a7b 6944260c-23fd-47db-8a2c-02196b399f57 in service none none off + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone/oxz_nexus_81f79040-bcf7-4eff-9a87-8e7bcb5a6db9 2694f256-cd46-4841-a009-6460f4ca0616 in service none none off + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/zone/oxz_ntp_8f94a160-67ab-4ed5-bc3f-01e19fdd7e9b 225c385b-de3e-4262-a5c4-0250abc910f9 in service none none off + oxp_4069c804-c51a-4adc-8822-3cbbab56ed3f/crypt/debug 041c4e17-e958-41aa-b621-03dd3b3e7da8 in service 100 GiB none gzip-9 + oxp_5248a306-4a03-449e-a8a3-6f86d26da755/crypt/debug 7e551f2b-ac22-4637-bd2a-188f106b57c0 in service 100 GiB none gzip-9 + oxp_55196665-ed61-4b23-9a74-0711bf2eaf90/crypt/debug 1e4208d8-041e-49eb-ab6d-dcedceee170c in service 100 GiB none gzip-9 + oxp_6b2a719a-35eb-469f-aa54-114a1f21f37d/crypt/debug 0872720b-c454-45f6-8816-2835d595894e in service 100 GiB none gzip-9 + oxp_7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e/crypt/debug fc7195f4-4472-4283-9094-2f6f7db01e71 in service 100 GiB none gzip-9 + oxp_984e2389-e7fd-4af9-ab02-e3caf77f95b5/crypt/debug baa19cce-f379-427c-9b5e-c413b050c2d5 in service 100 GiB none gzip-9 + oxp_a5f75431-3795-426c-8f80-176f658281a5/crypt/debug 5828eb26-b03b-4481-b88d-027a90a24c50 in service 100 GiB none gzip-9 + oxp_cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901/crypt/debug 5e7deb25-14c2-4633-8728-6eff7833e14f in service 100 GiB none gzip-9 + oxp_e405da11-cb6b-4ebc-bac1-9bc997352e10/crypt/debug e02c1929-a38a-49c2-8909-555c3e046d18 in service 100 GiB none gzip-9 + oxp_f4d7f914-ec73-4b65-8696-5068591d9065/crypt/debug 0aeb1237-4ad7-41ae-abd2-45789a3ab2f2 in service 100 GiB none gzip-9 + + omicron zones at generation 3: ------------------------------------------------------------------------------------------ zone type zone id disposition underlay IP @@ -99,6 +203,57 @@ parent: 4d4e6c38-cd95-4c4e-8f45-6af4d686964b fake-vendor fake-model serial-fe4fdfba-3b6d-47d3-8612-1fb2390b650a + datasets at generation 3: + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + dataset name dataset id disposition quota reservation compression + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crucible e7187a07-3759-4185-8893-36b01e1a7295 in service none none off + oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crucible f9901e16-a9e4-4c49-a3b9-464405830043 in service none none off + oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crucible 024a9e5e-f8a8-4b8f-b75e-5b05509fa69a in service none none off + oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crucible 22547c0a-a710-4d4c-8984-32445fbf993b in service none none off + oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crucible dec5883c-1abd-4425-8cc4-b2f57c85cdd4 in service none none off + oxp_789d607d-d196-428e-a988-f7886a327859/crucible fda176fb-2cea-4646-8601-8d719bcdbda0 in service none none off + oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crucible 4ded36d4-7e98-47fe-a0f4-c580e7d1eb21 in service none none off + oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crucible 623c87b5-8848-4e42-aa5e-6e706e11cf63 in service none none off + oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crucible e98d07df-27a8-4868-a3f9-066ac235516c in service none none off + oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crucible 639c96d6-265a-45dc-b03f-c145d2ea8c43 in service none none off + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone 64c4eb2e-82bf-450c-9379-594af3a4794b in service none none off + oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/zone f6c13b9c-4e22-448d-b7b8-04652f06423c in service none none off + oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/zone a15671b5-d3f3-43d9-b143-81bcd5170edf in service none none off + oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/zone dd78cd99-4aa3-4946-b4c3-b9fad49c6da6 in service none none off + oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crypt/zone 1c30ecb3-32ba-49e7-a3dd-771a75d38c3a in service none none off + oxp_789d607d-d196-428e-a988-f7886a327859/crypt/zone 7ac707a2-5bcf-49d1-88eb-1c09841082cf in service none none off + oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crypt/zone b0d96454-0a1d-47ac-9a13-5c4866131c37 in service none none off + oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crypt/zone 082509f2-115a-4a71-b8f8-86be21efc081 in service none none off + oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crypt/zone 01b79cba-881c-4bda-a48d-baaef2fcb122 in service none none off + oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crypt/zone 32d3d763-0665-4945-a3d0-e3d862f7a718 in service none none off + oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crypt/zone/oxz_crucible_1b38728b-8552-435b-b621-359ba20d465b c02c8635-e2f5-4974-a8b9-f4fdfe231365 in service none none off + oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/zone/oxz_crucible_31c42e26-3cdf-41a8-8826-ce71a513ed04 4876b95c-457b-4e81-9a04-ca1319429627 in service none none off + oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crypt/zone/oxz_crucible_4f38e475-396a-4650-a49c-c3cc4acc3ab9 2aff7d20-2a2b-4ded-9e03-eb0d72d29e35 in service none none off + oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crypt/zone/oxz_crucible_5cd47e9f-1faf-4afd-970a-18b9076b3407 686fcd72-5da5-4f8c-a740-88866e30b8da in service none none off + oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crypt/zone/oxz_crucible_768ab86c-d5d2-4734-a381-02df1032d5e9 d1bbe8aa-aeda-496b-93cd-f330f85da352 in service none none off + oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/zone/oxz_crucible_abbf71e1-6568-42cf-9526-7e31549ba934 782adc3d-3a2f-400d-a6ce-531edc8cf546 in service none none off + oxp_789d607d-d196-428e-a988-f7886a327859/crypt/zone/oxz_crucible_e37d04f9-ed3f-4665-800e-b51ba7d5d306 6c55265b-7515-4259-adf1-ac07f847c2fb in service none none off + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone/oxz_crucible_e6c28c27-39d2-4aec-bf34-5d9f6b3cbd7f 803ed7a0-bb24-489f-8737-b01ff28e3278 in service none none off + oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crypt/zone/oxz_crucible_f19f884a-3e97-458d-b8fb-533882750cd6 b1044d62-0afd-473e-8719-ca3ecb57d801 in service none none off + oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/zone/oxz_crucible_f54c359e-a980-4996-9462-25a548d96265 518e80f5-3074-44ec-8da3-ea64f3c0ad3e in service none none off + oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/zone/oxz_nexus_b539cea9-c37c-49ef-874f-170d898187b2 113c40a7-e9fd-492f-814e-528db4fd0e83 in service none none off + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone/oxz_nexus_b854f752-383d-4e0b-8557-8c62d22ba994 537edbee-609e-40df-9a10-4c6f57c5f15f in service none none off + oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/zone/oxz_nexus_c5a0c592-319e-44df-9d00-1ddb1d5ad6aa 61e536fd-043c-4741-aed7-640d18d32b26 in service none none off + oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/zone/oxz_nexus_cab211e1-3ab1-475f-81fa-984748044d8c 92f259d0-cda4-44e4-bb22-8b82d025d502 in service none none off + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/zone/oxz_ntp_706286e2-8b09-42ff-9841-eaef65635eee 617a44e3-250b-4db1-a8e7-e42da46a0a0f in service none none off + oxp_33d48d85-751e-4982-b738-eae4d9a05f01/crypt/debug 856e98db-f5c6-4cbd-a8ad-c02f59f207d7 in service 100 GiB none gzip-9 + oxp_39ca2e23-4c38-4743-afe0-26b0380b27db/crypt/debug f14ef549-31db-4fae-a540-3a50f0fba233 in service 100 GiB none gzip-9 + oxp_4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c/crypt/debug e44949f2-403b-4944-b966-de77d4b9365c in service 100 GiB none gzip-9 + oxp_60131a33-1f12-4dbb-9435-bdd368db1f51/crypt/debug 425255d5-c1e8-44eb-855f-fe1770e83362 in service 100 GiB none gzip-9 + oxp_77e45b5b-869f-4e78-8ce3-28bbe8cf37e9/crypt/debug dc613555-a790-45af-9af4-0127d376f3c6 in service 100 GiB none gzip-9 + oxp_789d607d-d196-428e-a988-f7886a327859/crypt/debug 4f359243-9639-431f-a0d1-5b2f2d6b5b0d in service 100 GiB none gzip-9 + oxp_b104b94c-2197-4e76-bfbd-6f966bd5af66/crypt/debug 1315d3d7-e347-4e68-8381-8c010be44ef0 in service 100 GiB none gzip-9 + oxp_cd62306a-aedf-47e8-93d5-92a358d64c7b/crypt/debug 0e8321af-4634-4d31-aa79-145f8e171674 in service 100 GiB none gzip-9 + oxp_f1693454-aac1-4265-b8a0-4e9f3f41c7b3/crypt/debug 5a0f4402-7d87-4b6b-b4d2-72f48000627c in service 100 GiB none gzip-9 + oxp_fe4fdfba-3b6d-47d3-8612-1fb2390b650a/crypt/debug a2120fee-01bd-4f49-8c58-720384b1cbde in service 100 GiB none gzip-9 + + omicron zones at generation 3: ------------------------------------------------------------------------------------------ zone type zone id disposition underlay IP @@ -120,7 +275,6 @@ parent: 4d4e6c38-cd95-4c4e-8f45-6af4d686964b nexus cab211e1-3ab1-475f-81fa-984748044d8c in service fd00:1122:3344:101::2d - !48d95fef-bc9f-4f50-9a53-1e075836291d WARNING: Zones exist without physical disks! omicron zones at generation 3: @@ -144,7 +298,6 @@ WARNING: Zones exist without physical disks! - !68d24ac5-f341-49ea-a92a-0381b52ab387 WARNING: Zones exist without physical disks! omicron zones at generation 2: diff --git a/nexus/types/src/deployment.rs b/nexus/types/src/deployment.rs index 7328cd3d835..d25bf7bdaac 100644 --- a/nexus/types/src/deployment.rs +++ b/nexus/types/src/deployment.rs @@ -18,6 +18,7 @@ use crate::inventory::Collection; pub use crate::inventory::SourceNatConfig; pub use crate::inventory::ZpoolName; use blueprint_diff::ClickhouseClusterConfigDiffTablesForSingleBlueprint; +use blueprint_display::BpDatasetsTableSchema; use daft::Diffable; use nexus_sled_agent_shared::inventory::OmicronZoneConfig; use nexus_sled_agent_shared::inventory::OmicronZonesConfig; @@ -315,6 +316,21 @@ impl BpTableData for &BlueprintPhysicalDisksConfig { } } +impl BpTableData for BlueprintDatasetsConfig { + fn bp_generation(&self) -> BpGeneration { + BpGeneration::Value(self.generation) + } + + fn rows(&self, state: BpDiffState) -> impl Iterator { + // We want to sort by (kind, pool) + let mut datasets: Vec<_> = self.datasets.iter().collect(); + datasets.sort_unstable_by_key(|d| (&d.kind, &d.pool)); + datasets.into_iter().map(move |dataset| { + BpTableRow::from_strings(state, dataset.as_strings()) + }) + } +} + impl BpTableData for BlueprintZonesConfig { fn bp_generation(&self) -> BpGeneration { BpGeneration::Value(self.generation) @@ -440,12 +456,36 @@ impl BlueprintDisplay<'_> { impl fmt::Display for BlueprintDisplay<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let b = self.blueprint; - writeln!(f, "blueprint {}", b.id)?; + // Unpack the blueprint so any future field changes require updating + // this method to update the display. + let Blueprint { + id, + sled_state, + blueprint_zones, + blueprint_disks, + blueprint_datasets, + parent_blueprint_id, + // These two cockroachdb_* fields are handled by + // `make_cockroachdb_table()`, called below. + cockroachdb_fingerprint: _, + cockroachdb_setting_preserve_downgrade: _, + // Handled by `make_clickhouse_cluster_config_tables()`, called + // below. + clickhouse_cluster_config: _, + // These five fields are handled by `make_metadata_table()`, called + // below. + internal_dns_version: _, + external_dns_version: _, + time_created: _, + creator: _, + comment: _, + } = self.blueprint; + + writeln!(f, "blueprint {}", id)?; writeln!( f, "parent: {}", - b.parent_blueprint_id + parent_blueprint_id .map(|u| u.to_string()) .unwrap_or_else(|| String::from("")) )?; @@ -457,7 +497,7 @@ impl fmt::Display for BlueprintDisplay<'_> { // those physical disks. // // If there are corresponding zones, print those as well. - for (sled_id, disks) in &self.blueprint.blueprint_disks { + for (sled_id, disks) in blueprint_disks { // Construct the disks subtable let disks_table = BpTable::new( BpPhysicalDisksTableSchema {}, @@ -466,45 +506,48 @@ impl fmt::Display for BlueprintDisplay<'_> { ); // Look up the sled state - let sled_state = self - .blueprint - .sled_state + let sled_state = sled_state .get(sled_id) .map(|state| state.to_string()) .unwrap_or_else(|| { "blueprint error: unknown sled state".to_string() }); + writeln!( + f, + "\n sled: {sled_id} ({sled_state})\n\n{disks_table}\n", + )?; + + // Construct the datasets subtable + if let Some(datasets) = blueprint_datasets.get(sled_id) { + let datasets_tab = BpTable::new( + BpDatasetsTableSchema {}, + datasets.bp_generation(), + datasets.rows(BpDiffState::Unchanged).collect(), + ); + writeln!(f, "{datasets_tab}\n")?; + } // Construct the zones subtable - match self.blueprint.blueprint_zones.get(sled_id) { - Some(zones) => { - let zones_tab = BpTable::new( - BpOmicronZonesTableSchema {}, - zones.bp_generation(), - zones.rows(BpDiffState::Unchanged).collect(), - ); - writeln!( - f, - "\n sled: {sled_id} ({sled_state})\n\n{disks_table}\n\n{zones_tab}\n" - )?; - } - None => writeln!( - f, - "\n sled: {sled_id} ({sled_state})\n\n{disks_table}\n" - )?, + if let Some(zones) = blueprint_zones.get(sled_id) { + let zones_tab = BpTable::new( + BpOmicronZonesTableSchema {}, + zones.bp_generation(), + zones.rows(BpDiffState::Unchanged).collect(), + ); + writeln!(f, "{zones_tab}\n")?; } seen_sleds.insert(sled_id); } - // Now create and display a table of zones on sleds that don't - // yet have physical disks. + // Now create and display a table of zones/datasets on sleds that don't + // have physical disks. // // This should basically be impossible, so we warn if it occurs. - for (sled_id, zones) in &self.blueprint.blueprint_zones { + for (sled_id, zones) in blueprint_zones { if !seen_sleds.contains(sled_id) && !zones.zones.is_empty() { writeln!( f, - "\n!{sled_id}\n{}\n{}\n\n", + "!{sled_id}\n{}\n{}\n\n", "WARNING: Zones exist without physical disks!", BpTable::new( BpOmicronZonesTableSchema {}, @@ -512,6 +555,38 @@ impl fmt::Display for BlueprintDisplay<'_> { zones.rows(BpDiffState::Unchanged).collect() ) )?; + if let Some(datasets) = blueprint_datasets.get(sled_id) { + writeln!( + f, + "{}\n{}\n", + "WARNING: Datasets also exist without physical disks!", + BpTable::new( + BpDatasetsTableSchema {}, + datasets.bp_generation(), + datasets.rows(BpDiffState::Unchanged).collect(), + ) + )?; + } + seen_sleds.insert(sled_id); + } + } + + // Finally, create and display a table of datasets on sleds that don't + // have disks or zones. + // + // This should basically be impossible, so we warn if it occurs. + for (sled_id, datasets) in blueprint_datasets { + if !seen_sleds.contains(sled_id) && !datasets.datasets.is_empty() { + writeln!( + f, + "!{sled_id}\n{}\n{}\n\n", + "WARNING: Datasets exist without physical disks or zones!", + BpTable::new( + BpDatasetsTableSchema {}, + datasets.bp_generation(), + datasets.rows(BpDiffState::Unchanged).collect(), + ) + )?; } } From ede2d8cf9501c11c3a7323eb7a7a07aeda1f9e5c Mon Sep 17 00:00:00 2001 From: Zeeshan Lakhani Date: Mon, 10 Feb 2025 20:36:31 -0500 Subject: [PATCH 27/43] Add tfport-data-link timeseries schema and SMF config adds. (#6918) PR related to https://github.com/oxidecomputer/dendrite/pull/1033. New timeseries related to tfportd: - switch-port-control-data-link - management-network-data-link Plus, some new fields related to nomenclature updates in https://github.com/oxidecomputer/dendrite/pull/1033#issuecomment-2628471288 for switch-data-link, switch-table, and sample-collection interval. Related: - [x] Switch PR to go against `main` once the `zl/smf-sled-idents` branch is merged. - [ ] Update dendrite `package-manifest` commits to from `main` once https://github.com/oxidecomputer/dendrite/pull/1033 is merged. --- common/src/address.rs | 2 +- .../replicated/14/timeseries-to-delete.txt | 34 +++ .../single-node/14/timeseries-to-delete.txt | 34 +++ oximeter/db/src/model/mod.rs | 2 +- oximeter/oximeter/schema/dendrite.toml | 56 ++--- .../schema/management-network-data-link.toml | 120 ++++++++++ .../oximeter/schema/switch-data-link.toml | 56 +++-- .../schema/switch-port-control-data-link.toml | 140 ++++++++++++ oximeter/oximeter/schema/switch-table.toml | 42 +++- package-manifest.toml | 12 +- sled-agent/src/metrics.rs | 16 +- sled-agent/src/services.rs | 209 +++++++++++------- tools/dendrite_openapi_version | 2 +- tools/dendrite_stub_checksums | 6 +- 14 files changed, 577 insertions(+), 154 deletions(-) create mode 100644 oximeter/db/schema/replicated/14/timeseries-to-delete.txt create mode 100644 oximeter/db/schema/single-node/14/timeseries-to-delete.txt create mode 100644 oximeter/oximeter/schema/management-network-data-link.toml create mode 100644 oximeter/oximeter/schema/switch-port-control-data-link.toml diff --git a/common/src/address.rs b/common/src/address.rs index 7e6d68ebc8e..a311bd688ed 100644 --- a/common/src/address.rs +++ b/common/src/address.rs @@ -49,7 +49,7 @@ pub const MGS_PORT: u16 = 12225; pub const WICKETD_PORT: u16 = 12226; pub const BOOTSTRAP_ARTIFACT_PORT: u16 = 12227; pub const CRUCIBLE_PANTRY_PORT: u16 = 17000; - +pub const TFPORTD_PORT: u16 = 12231; pub const NEXUS_INTERNAL_PORT: u16 = 12221; /// The port on which Nexus exposes its external API on the underlay network. diff --git a/oximeter/db/schema/replicated/14/timeseries-to-delete.txt b/oximeter/db/schema/replicated/14/timeseries-to-delete.txt new file mode 100644 index 00000000000..6591f3e0db8 --- /dev/null +++ b/oximeter/db/schema/replicated/14/timeseries-to-delete.txt @@ -0,0 +1,34 @@ +switch_data_link:bytes_sent +switch_data_link:bytes_received +switch_data_link:errors_sent +switch_data_link:errors_received +switch_data_link:receive_crc_error_drops +switch_data_link:receive_buffer_full_drops +switch_data_link:packets_sent +switch_data_link:packets_received +switch_data_link:link_up +switch_data_link:link_enabled +switch_data_link:link_fsm +switch_data_link:pcs_bad_sync_headers +switch_data_link:pcs_errored_blocks +switch_data_link:pcs_block_lock_loss +switch_data_link:pcs_high_ber +switch_data_link:pcs_valid_errors +switch_data_link:pcs_invalid_errors +switch_data_link:pcs_unknown_errors +switch_data_link:pcs_sync_loss +switch_data_link:fec_high_symbol_errors +switch_data_link:fec_sync_aligned +switch_data_link:fec_corrected_blocks +switch_data_link:fec_uncorrected_blocks +switch_data_link:fec_symbol_errors +switch_table:capacity +switch_table:collisions +switch_table:delete_misses +switch_table:deletes +switch_table:exhaustion +switch_table:inserts +switch_table:occupancy +switch_table:update_misses +switch_table:updates +dendrite:sample_collection_duration diff --git a/oximeter/db/schema/single-node/14/timeseries-to-delete.txt b/oximeter/db/schema/single-node/14/timeseries-to-delete.txt new file mode 100644 index 00000000000..6591f3e0db8 --- /dev/null +++ b/oximeter/db/schema/single-node/14/timeseries-to-delete.txt @@ -0,0 +1,34 @@ +switch_data_link:bytes_sent +switch_data_link:bytes_received +switch_data_link:errors_sent +switch_data_link:errors_received +switch_data_link:receive_crc_error_drops +switch_data_link:receive_buffer_full_drops +switch_data_link:packets_sent +switch_data_link:packets_received +switch_data_link:link_up +switch_data_link:link_enabled +switch_data_link:link_fsm +switch_data_link:pcs_bad_sync_headers +switch_data_link:pcs_errored_blocks +switch_data_link:pcs_block_lock_loss +switch_data_link:pcs_high_ber +switch_data_link:pcs_valid_errors +switch_data_link:pcs_invalid_errors +switch_data_link:pcs_unknown_errors +switch_data_link:pcs_sync_loss +switch_data_link:fec_high_symbol_errors +switch_data_link:fec_sync_aligned +switch_data_link:fec_corrected_blocks +switch_data_link:fec_uncorrected_blocks +switch_data_link:fec_symbol_errors +switch_table:capacity +switch_table:collisions +switch_table:delete_misses +switch_table:deletes +switch_table:exhaustion +switch_table:inserts +switch_table:occupancy +switch_table:update_misses +switch_table:updates +dendrite:sample_collection_duration diff --git a/oximeter/db/src/model/mod.rs b/oximeter/db/src/model/mod.rs index 94fae483e47..aabab099c70 100644 --- a/oximeter/db/src/model/mod.rs +++ b/oximeter/db/src/model/mod.rs @@ -19,4 +19,4 @@ pub mod to_block; /// - [`crate::Client::initialize_db_with_version`] /// - [`crate::Client::ensure_schema`] /// - The `clickhouse-schema-updater` binary in this crate -pub const OXIMETER_VERSION: u64 = 13; +pub const OXIMETER_VERSION: u64 = 14; diff --git a/oximeter/oximeter/schema/dendrite.toml b/oximeter/oximeter/schema/dendrite.toml index ca1497b447f..def4539787e 100644 --- a/oximeter/oximeter/schema/dendrite.toml +++ b/oximeter/oximeter/schema/dendrite.toml @@ -5,7 +5,7 @@ name = "dendrite" description = "Oxide switch management daemon" authz_scope = "fleet" versions = [ - { version = 1, fields = [ "rack_id", "sled_model", "sled_revision", "sled_id", "sled_serial" ] }, + { version = 1, fields = [ "rack_id", "sled_id", "sled_model", "sled_revision", "sled_serial" ] }, ] [[metrics]] @@ -18,13 +18,17 @@ versions = [ # switch for its statistics, which is why these fields are included. # Dendrite may eventually report statistics about itself, or other aspects # not related to the switch, so they belong here, not the target. - { added_in = 1, fields = [ "switch_id", "switch_fab", "switch_lot", "switch_wafer", "switch_wafer_loc_x", "switch_wafer_loc_y", "switch_model", "switch_revision", "switch_serial", "switch_slot" ] } + { added_in = 1, fields = [ "switch_id", "switch_model", "switch_revision", "switch_serial", "switch_slot", "asic_fab", "asic_lot", "asic_wafer", "asic_wafer_loc_x", "asic_wafer_loc_y" ] } ] [fields.rack_id] type = "uuid" description = "ID of the rack containing the switch" +[fields.sled_id] +type = "uuid" +description = "ID of the sled managing the switch" + [fields.sled_model] type = "string" description = "The model of the sled managing the switch" @@ -33,50 +37,46 @@ description = "The model of the sled managing the switch" type = "u32" description = "Revision number of the sled managing the switch" -[fields.sled_id] -type = "uuid" -description = "ID of the sled managing the switch" - [fields.sled_serial] type = "string" description = "Serial number of the sled managing the switch" +[fields.switch_id] +type = "uuid" +description = "ID of the switch being managed" + [fields.switch_model] type = "string" -description = "The model of the switch being managed" +description = "The model number of the switch being managed" [fields.switch_revision] type = "u32" description = "Revision number of the switch being managed" -[fields.switch_id] -type = "uuid" -description = "ID of the switch being managed" +[fields.switch_serial] +type = "string" +description = "Serial number of the switch being managed" + +[fields.switch_slot] +type = "u16" +description = "Slot number of the switch being managed" -[fields.switch_fab] +[fields.asic_fab] type = "string" -description = "Fabrication plant identifier of the switch the link is on" +description = "Fabrication plant identifier of the switch ASIC being managed" -[fields.switch_lot] +[fields.asic_lot] type = "string" -description = "Lot number of the switch the link is on" +description = "Lot identifier of the switch ASIC being managed" -[fields.switch_wafer] +[fields.asic_wafer] type = "u8" -description = "Wafer number of the switch the link is on" +description = "Wafer identifier of the switch ASIC being managed" -[fields.switch_wafer_loc_x] +[fields.asic_wafer_loc_x] type = "i16" -description = "X-coordinate wafer location of the switch the link is on" +description = "X-coordinate wafer location of the switch ASIC being managed" -[fields.switch_wafer_loc_y] +[fields.asic_wafer_loc_y] type = "i16" -description = "Y-coordinate wafer location of the switch the link is on" - -[fields.switch_serial] -type = "string" -description = "Serial number of the switch being managed" - -[fields.switch_slot] -type = "u16" -description = "Slot number of the switch the link is on" +description = "Y-coordinate wafer location of the switch ASIC being managed" diff --git a/oximeter/oximeter/schema/management-network-data-link.toml b/oximeter/oximeter/schema/management-network-data-link.toml new file mode 100644 index 00000000000..90e7476f8f2 --- /dev/null +++ b/oximeter/oximeter/schema/management-network-data-link.toml @@ -0,0 +1,120 @@ +format_version = 1 + +[target] +name = "management_network_data_link" +description = "A data link on the management network" +authz_scope = "fleet" + +versions = [ + { version = 1, fields = [ "kind", "model", "network", "link_name", "rack_id", "sled_id", "sled_model", "sled_revision", "sled_serial", "switch_id", "switch_model", "switch_revision", "switch_serial", "switch_slot" ] }, +] + +[fields.kind] +type = "string" +description = "The kind or class of the data link, such as whether it is a physical or virtual device" + +[fields.model] +type = "string" +description = "Model type of the link, indicating what implements the link. For example, this might be the model number of a physical NIC, or the name of the software component that implements a virtual link." + +[fields.network] +type = "string" +description = "Network type of the link (examples: primary-data, management, vpc)" + +[fields.link_name] +type = "string" +description = "The name of the link as it appears to Oxide-internal software" + +[fields.rack_id] +type = "uuid" +description = "ID for the link's rack" + +[fields.sled_id] +type = "uuid" +description = "ID for the link's sled" + +[fields.sled_model] +type = "string" +description = "Model number of the link's sled" + +[fields.sled_revision] +type = "u32" +description = "Revision number of the sled" + +[fields.sled_serial] +type = "string" +description = "Serial number of the sled" + +[fields.switch_id] +type = "uuid" +description = "ID of the switch the link is on" + +[fields.switch_model] +type = "string" +description = "Model number of the switch the link is on" + +[fields.switch_revision] +type = "u32" +description = "Revision number of the switch the link is on" + +[fields.switch_serial] +type = "string" +description = "Serial number of the switch the link is on" + +[fields.switch_slot] +type = "u16" +description = "Slot number of the switch the link is on" + +[[metrics]] +name = "bytes_sent" +description = "Number of bytes sent on the link" +units = "bytes" +datum_type = "cumulative_u64" +versions = [ + { added_in = 1, fields = [] } +] + +[[metrics]] +name = "bytes_received" +description = "Number of bytes received on the link" +units = "bytes" +datum_type = "cumulative_u64" +versions = [ + { added_in = 1, fields = [] } +] + +[[metrics]] +name = "packets_sent" +description = "Number of packets sent on the link" +units = "count" +datum_type = "cumulative_u64" +versions = [ + { added_in = 1, fields = [] } +] + +[[metrics]] +name = "packets_received" +description = "Number of packets received on the link" +units = "count" +datum_type = "cumulative_u64" +versions = [ + { added_in = 1, fields = [] } +] + +[[metrics]] +name = "errors_sent" +description = "Number of errors encountered when sending on the link" +units = "count" +datum_type = "cumulative_u64" +versions = [ + { added_in = 1, fields = [] } +] + +[[metrics]] +name = "errors_received" +description = "Number of errors encountered when receiving on the link" +units = "count" +datum_type = "cumulative_u64" +versions = [ + { added_in = 1, fields = [] } +] diff --git a/oximeter/oximeter/schema/switch-data-link.toml b/oximeter/oximeter/schema/switch-data-link.toml index dce4841a096..a3713b2f54a 100644 --- a/oximeter/oximeter/schema/switch-data-link.toml +++ b/oximeter/oximeter/schema/switch-data-link.toml @@ -6,7 +6,7 @@ description = "A network data link on an Oxide switch" authz_scope = "fleet" versions = [ - { version = 1, fields = [ "rack_id", "sled_id", "sled_model", "sled_revision", "sled_serial", "switch_id", "switch_fab", "switch_lot", "switch_wafer", "switch_wafer_loc_x", "switch_wafer_loc_y", "switch_model", "switch_revision", "switch_serial", "switch_slot" ] }, + { version = 1, fields = [ "kind", "model", "network", "rack_id", "sled_id", "sled_model", "sled_revision", "sled_serial", "switch_id", "switch_model", "switch_revision", "switch_serial", "switch_slot","asic_fab", "asic_lot", "asic_wafer", "asic_wafer_loc_x", "asic_wafer_loc_y" ] }, ] [[metrics]] @@ -228,6 +228,18 @@ versions = [ { added_in = 1, fields = [ "port_id", "lane", "link_id" ] } ] +[fields.kind] +type = "string" +description = "The kind or class of the data link, such as whether it is a physical or virtual device" + +[fields.model] +type = "string" +description = "Model type of the link, indicating what implements the link. For example, this might be the model number of a physical NIC, or the name of the software component that implements a virtual link." + +[fields.network] +type = "string" +description = "Network type of the link (examples: primary-data, management, vpc)" + [fields.rack_id] type = "uuid" description = "ID of the rack the link's switch is in" @@ -252,29 +264,9 @@ description = "Serial number of the sled managing the link's switch" type = "uuid" description = "ID of the switch the link is on" -[fields.switch_fab] -type = "string" -description = "Fabrication plant identifier of the switch the link is on" - -[fields.switch_lot] -type = "string" -description = "Lot number of the switch the link is on" - -[fields.switch_wafer] -type = "u8" -description = "Wafer number of the switch the link is on" - -[fields.switch_wafer_loc_x] -type = "i16" -description = "X-coordinate wafer location of the switch the link is on" - -[fields.switch_wafer_loc_y] -type = "i16" -description = "Y-coordinate wafer location of the switch the link is on" - [fields.switch_model] type = "string" -description = "The model number switch the link is on" +description = "Model number of the switch the link is on" [fields.switch_revision] type = "u32" @@ -288,6 +280,26 @@ description = "Serial number of the switch the link is on" type = "u16" description = "Slot number of the switch the link is on" +[fields.asic_fab] +type = "string" +description = "Fabrication plant identifier of the switch ASIC the link is on" + +[fields.asic_lot] +type = "string" +description = "Lot identifier of the switch ASIC the link is on" + +[fields.asic_wafer] +type = "u8" +description = "Wafer identifier of the switch ASIC the link is on" + +[fields.asic_wafer_loc_x] +type = "i16" +description = "X-coordinate wafer location of the switch ASIC the link is on" + +[fields.asic_wafer_loc_y] +type = "i16" +description = "Y-coordinate wafer location of the switch ASIC the link is on" + [fields.port_id] type = "string" description = "Physical switch port the link is on" diff --git a/oximeter/oximeter/schema/switch-port-control-data-link.toml b/oximeter/oximeter/schema/switch-port-control-data-link.toml new file mode 100644 index 00000000000..76fc5d36dd4 --- /dev/null +++ b/oximeter/oximeter/schema/switch-port-control-data-link.toml @@ -0,0 +1,140 @@ +format_version = 1 + +[target] +name = "switch_port_control_data_link" +description = "Network data for datalinks related to a switch and management control data" +authz_scope = "fleet" + +versions = [ + { version = 1, fields = [ "kind", "model", "network", "link_name", "rack_id", "sled_id", "sled_model", "sled_revision", "sled_serial", "switch_id", "switch_model", "switch_revision", "switch_serial", "switch_slot", "asic_fab", "asic_lot", "asic_wafer", "asic_wafer_loc_x", "asic_wafer_loc_y" ] }, +] + +[fields.kind] +type = "string" +description = "The kind or class of the data link, such as whether it is a physical or virtual device" + +[fields.model] +type = "string" +description = "Model type of the link, indicating what implements the link. For example, this might be the model number of a physical NIC, or the name of the software component that implements a virtual link." + +[fields.network] +type = "string" +description = "Network type of the link (examples: primary-data, management, vpc)" + +[fields.link_name] +type = "string" +description = "The name of the link as it appears to Oxide-internal software" + +[fields.rack_id] +type = "uuid" +description = "ID for the link's rack" + +[fields.sled_id] +type = "uuid" +description = "ID for the link's sled" + +[fields.sled_model] +type = "string" +description = "Model number of the link's sled" + +[fields.sled_revision] +type = "u32" +description = "Revision number of the sled" + +[fields.sled_serial] +type = "string" +description = "Serial number of the sled" + +[fields.switch_id] +type = "uuid" +description = "ID of the switch the link is on" + +[fields.switch_model] +type = "string" +description = "Model number of the switch the link is on" + +[fields.switch_revision] +type = "u32" +description = "Revision number of the switch the link is on" + +[fields.switch_serial] +type = "string" +description = "Serial number of the switch the link is on" + +[fields.switch_slot] +type = "u16" +description = "Slot number of the switch the link is on" + +[fields.asic_fab] +type = "string" +description = "Fabrication plant identifier of the switch ASIC the link is on" + +[fields.asic_lot] +type = "string" +description = "Lot identifier of the switch ASIC the link is on" + +[fields.asic_wafer] +type = "u8" +description = "Wafer identifier of the switch ASIC the link is on" + +[fields.asic_wafer_loc_x] +type = "i16" +description = "X-coordinate wafer location of the switch ASIC the link is on" + +[fields.asic_wafer_loc_y] +type = "i16" +description = "Y-coordinate wafer location of the switch ASIC the link is on" + +[[metrics]] +name = "bytes_sent" +description = "Number of bytes sent on the link" +units = "bytes" +datum_type = "cumulative_u64" +versions = [ + { added_in = 1, fields = [] } +] + +[[metrics]] +name = "bytes_received" +description = "Number of bytes received on the link" +units = "bytes" +datum_type = "cumulative_u64" +versions = [ + { added_in = 1, fields = [] } +] + +[[metrics]] +name = "packets_sent" +description = "Number of packets sent on the link" +units = "count" +datum_type = "cumulative_u64" +versions = [ + { added_in = 1, fields = [] } +] + +[[metrics]] +name = "packets_received" +description = "Number of packets received on the link" +units = "count" +datum_type = "cumulative_u64" +versions = [ + { added_in = 1, fields = [] } +] + +[[metrics]] +name = "errors_sent" +description = "Number of errors encountered when sending on the link" +units = "count" +datum_type = "cumulative_u64" +versions = [ + { added_in = 1, fields = [] } +] + +[[metrics]] +name = "errors_received" +description = "Number of errors encountered when receiving on the link" +units = "count" +datum_type = "cumulative_u64" +versions = [ + { added_in = 1, fields = [] } +] diff --git a/oximeter/oximeter/schema/switch-table.toml b/oximeter/oximeter/schema/switch-table.toml index 1e8a9b1b93d..a3ccd94ebb4 100644 --- a/oximeter/oximeter/schema/switch-table.toml +++ b/oximeter/oximeter/schema/switch-table.toml @@ -5,7 +5,7 @@ name = "switch_table" description = "A table on a Sidecar switch ASIC" authz_scope = "fleet" versions = [ - { version = 1, fields = [ "rack_id", "sled_id", "sidecar_id", "table" ] }, + { version = 1, fields = [ "rack_id", "sled_id", "switch_id", "switch_model", "switch_revision", "switch_serial", "switch_slot", "asic_fab", "asic_lot", "asic_wafer", "asic_wafer_loc_x", "asic_wafer_loc_y", "table" ] }, ] [[metrics]] @@ -97,9 +97,45 @@ description = "ID of the rack containing the switch" type = "uuid" description = "ID of the sled responsible for managing the switch" -[fields.sidecar_id] +[fields.switch_id] type = "uuid" -description = "ID of the Sidecar switch" +description = "ID of the switch" + +[fields.switch_model] +type = "string" +description = "Model number of the switch" + +[fields.switch_revision] +type = "u32" +description = "Revision number of the switch" + +[fields.switch_serial] +type = "string" +description = "Serial number of the switch" + +[fields.switch_slot] +type = "u16" +description = "Slot number of the switch" + +[fields.asic_fab] +type = "string" +description = "Fabrication plant identifier of the switch ASIC" + +[fields.asic_lot] +type = "string" +description = "Lot identifier of the switch ASIC" + +[fields.asic_wafer] +type = "u8" +description = "Wafer identifier of the switch ASIC" + +[fields.asic_wafer_loc_x] +type = "i16" +description = "X-coordinate wafer location of the switch ASIC" + +[fields.asic_wafer_loc_y] +type = "i16" +description = "Y-coordinate wafer location of the switch ASIC" [fields.table] type = "string" diff --git a/package-manifest.toml b/package-manifest.toml index aa4e08ed610..a155d1152f1 100644 --- a/package-manifest.toml +++ b/package-manifest.toml @@ -720,8 +720,8 @@ only_for_targets.image = "standard" # the other `source.*` keys. source.type = "prebuilt" source.repo = "dendrite" -source.commit = "caf4bee7f1647b4f971199a5268885337ff1691a" -source.sha256 = "0b6f1960e3475036c39b0df14015d968f96dfd198295f7e58ffdc8e2e8618afb" +source.commit = "5bd899f849dcfef5d4de55467334c39ede4ca5f2" +source.sha256 = "1563a34d5317a6c5a54c2115444d66632fecdda51d8a9c367b403dc6b5ada948" output.type = "zone" output.intermediate_only = true @@ -747,8 +747,8 @@ only_for_targets.image = "standard" # the other `source.*` keys. source.type = "prebuilt" source.repo = "dendrite" -source.commit = "caf4bee7f1647b4f971199a5268885337ff1691a" -source.sha256 = "a966c3c609b35e136b4807530218fb8e7a0a72673e604c47adc9bb4582d5cadf" +source.commit = "5bd899f849dcfef5d4de55467334c39ede4ca5f2" +source.sha256 = "4bd5ac5779b6bc70d82581bea0d0216aa4d9c6e0d810d4ce14e565181b5d6610" output.type = "zone" output.intermediate_only = true @@ -767,8 +767,8 @@ only_for_targets.image = "standard" # the other `source.*` keys. source.type = "prebuilt" source.repo = "dendrite" -source.commit = "caf4bee7f1647b4f971199a5268885337ff1691a" -source.sha256 = "06d63410222134ece052d15732c709e3a43853563b88398176ef04e66b004b12" +source.commit = "5bd899f849dcfef5d4de55467334c39ede4ca5f2" +source.sha256 = "32a08ccb3ac94947b554ab5c492bafcc36441721697fe595d9d6e2d9296fe51f" output.type = "zone" output.intermediate_only = true diff --git a/sled-agent/src/metrics.rs b/sled-agent/src/metrics.rs index f061bd1cd67..632e870f6c3 100644 --- a/sled-agent/src/metrics.rs +++ b/sled-agent/src/metrics.rs @@ -223,15 +223,15 @@ async fn remove_datalink( Ok(_) => { debug!( log, - "Removed VNIC from tracked links"; + "removed VNIC from tracked links"; "link_name" => name, ); } Err(err) => { error!( log, - "Failed to remove VNIC from kstat sampler, \ - metrics may still be produced for it"; + "failed to remove VNIC from kstat sampler, \ + metrics may still be produced for it"; "link_name" => name, "error" => ?err, ); @@ -263,7 +263,7 @@ async fn add_datalink( Ok(id) => { debug!( log, - "Added new link to kstat sampler"; + "added new link to kstat sampler"; "link_name" => entry.key(), "link_kind" => %link.kind(), "zone_name" => %link.zone_name(), @@ -273,8 +273,8 @@ async fn add_datalink( Err(err) => { error!( log, - "Failed to add VNIC to kstat sampler, \ - no metrics will be collected for it"; + "failed to add VNIC to kstat sampler, \ + no metrics will be collected for it"; "link_name" => entry.key(), "link_kind" => %link.kind(), "zone_name" => %link.zone_name(), @@ -310,14 +310,14 @@ async fn sync_sled_datalinks( Ok(_) => { debug!( log, - "Updated link already tracked by kstat sampler"; + "updated link already tracked by kstat sampler"; "link_name" => link_name, ); } Err(err) => { error!( log, - "Failed to update link already tracked by kstat sampler"; + "failed to update link already tracked by kstat sampler"; "link_name" => link_name, "error" => ?err, ); diff --git a/sled-agent/src/services.rs b/sled-agent/src/services.rs index 312ab33b1c8..4775cc113c2 100644 --- a/sled-agent/src/services.rs +++ b/sled-agent/src/services.rs @@ -76,6 +76,7 @@ use omicron_common::address::LLDP_PORT; use omicron_common::address::MGS_PORT; use omicron_common::address::RACK_PREFIX; use omicron_common::address::SLED_PREFIX; +use omicron_common::address::TFPORTD_PORT; use omicron_common::address::WICKETD_NEXUS_PROXY_PORT; use omicron_common::address::WICKETD_PORT; use omicron_common::address::{ @@ -391,6 +392,63 @@ fn display_zone_init_errors(errors: &[(String, Box)]) -> String { output } +/// Helper function to add properties to a PropertyGroupBuilder for a sled +/// agent centered around rack and sled identifiers. +fn add_sled_ident_properties( + config: PropertyGroupBuilder, + info: &SledAgentInfo, +) -> PropertyGroupBuilder { + config + .add_property("rack_id", "astring", &info.rack_id.to_string()) + .add_property( + "sled_id", + "astring", + &info.config.sled_identifiers.sled_id.to_string(), + ) + .add_property( + "sled_model", + "astring", + &info.config.sled_identifiers.model.to_string(), + ) + .add_property( + "sled_serial", + "astring", + &info.config.sled_identifiers.serial.to_string(), + ) + .add_property( + "sled_revision", + "astring", + &info.config.sled_identifiers.revision.to_string(), + ) +} + +/// Helper function to set properties on a SmfHelper for a sled agent centered +/// around rack and sled identifiers. +fn setprop_sled_ident_properties( + smfh: &SmfHelper, + info: &SledAgentInfo, +) -> Result<(), Error> { + smfh.setprop_default_instance("config/rack_id", info.rack_id)?; + smfh.setprop_default_instance( + "config/sled_id", + info.config.sled_identifiers.sled_id, + )?; + smfh.setprop_default_instance( + "config/sled_model", + info.config.sled_identifiers.model.to_string(), + )?; + smfh.setprop_default_instance( + "config/sled_revision", + info.config.sled_identifiers.revision, + )?; + smfh.setprop_default_instance( + "config/sled_serial", + info.config.sled_identifiers.serial.to_string(), + )?; + + Ok(()) +} + /// Configuration parameters which modify the [`ServiceManager`]'s behavior. pub struct Config { /// Identifies the sled being configured @@ -2697,45 +2755,11 @@ impl ServiceManager { PropertyGroupBuilder::new("config"); if let Some(i) = info { - dendrite_config = dendrite_config - .add_property( - "rack_id", - "astring", - &i.rack_id.to_string(), - ) - .add_property( - "sled_id", - "astring", - &i.config - .sled_identifiers - .sled_id - .to_string(), - ) - .add_property( - "sled_model", - "astring", - &i.config - .sled_identifiers - .model - .to_string(), - ) - .add_property( - "sled_serial", - "astring", - &i.config - .sled_identifiers - .serial - .to_string(), - ) - .add_property( - "sled_revision", - "astring", - &i.config - .sled_identifiers - .revision - .to_string(), - ); - } + dendrite_config = add_sled_ident_properties( + dendrite_config, + i, + ) + }; for address in addresses { dendrite_config = dendrite_config.add_property( @@ -2860,18 +2884,34 @@ impl ServiceManager { } SwitchService::Tfport { pkt_source, asic } => { info!(self.inner.log, "Setting up tfport service"); + let mut tfport_config = - PropertyGroupBuilder::new("config") - .add_property( - "host", - "astring", - &format!("[{}]", Ipv6Addr::LOCALHOST), - ) - .add_property( - "port", - "astring", - &format!("{}", DENDRITE_PORT), - ); + PropertyGroupBuilder::new("config"); + + tfport_config = tfport_config + .add_property( + "dpd_host", + "astring", + &format!("[{}]", Ipv6Addr::LOCALHOST), + ) + .add_property( + "dpd_port", + "astring", + &format!("{}", DENDRITE_PORT), + ); + + if let Some(i) = info { + tfport_config = + add_sled_ident_properties(tfport_config, i); + } + + for address in addresses { + tfport_config = tfport_config.add_property( + "listen_address", + "astring", + &format!("[{}]:{}", address, TFPORTD_PORT), + ); + } let is_gimlet = is_gimlet().map_err(|e| { Error::Underlay( @@ -2912,6 +2952,7 @@ impl ServiceManager { if is_gimlet || asic == &DendriteAsic::SoftNpuPropolisDevice + || asic == &DendriteAsic::TofinoAsic { tfport_config = tfport_config.add_property( "pkt_source", @@ -4414,36 +4455,11 @@ impl ServiceManager { "configuring dendrite service" ); if let Some(info) = self.inner.sled_info.get() { - smfh.setprop_default_instance( - "config/rack_id", - info.rack_id, - )?; - smfh.setprop_default_instance( - "config/sled_id", - info.config.sled_identifiers.sled_id, - )?; - smfh.setprop_default_instance( - "config/sled_model", - info.config - .sled_identifiers - .model - .to_string(), - )?; - smfh.setprop_default_instance( - "config/sled_revision", - info.config.sled_identifiers.revision, - )?; - smfh.setprop_default_instance( - "config/sled_serial", - info.config - .sled_identifiers - .serial - .to_string(), - )?; + setprop_sled_ident_properties(&smfh, info)?; } else { info!( self.inner.log, - "no rack_id/sled_id available yet" + "no sled info available yet" ); } smfh.delpropvalue_default_instance( @@ -4517,10 +4533,41 @@ impl ServiceManager { smfh.refresh()?; info!(self.inner.log, "refreshed lldpd service with new configuration") } - SwitchService::Tfport { .. } => { - // Since tfport and dpd communicate using localhost, - // the tfport service shouldn't need to be - // restarted. + SwitchService::Tfport { pkt_source, asic } => { + info!(self.inner.log, "configuring tfport service"); + if let Some(info) = self.inner.sled_info.get() { + setprop_sled_ident_properties(&smfh, info)?; + } else { + info!( + self.inner.log, + "no sled info available yet" + ); + } + smfh.delpropvalue_default_instance( + "config/listen_address", + "*", + )?; + for address in &request.addresses { + smfh.addpropvalue_type_default_instance( + "config/listen_address", + &format!("[{}]:{}", address, TFPORTD_PORT), + "astring", + )?; + } + + match asic { + DendriteAsic::SoftNpuPropolisDevice + | DendriteAsic::TofinoAsic => { + smfh.setprop_default_instance( + "config/pkt_source", + pkt_source, + )?; + } + _ => {} + } + + smfh.refresh()?; + info!(self.inner.log, "refreshed tfport service with new configuration") } SwitchService::Pumpkind { .. } => { // Unless we want to plumb through the "only log diff --git a/tools/dendrite_openapi_version b/tools/dendrite_openapi_version index b2b6a40644e..06c92ba445b 100755 --- a/tools/dendrite_openapi_version +++ b/tools/dendrite_openapi_version @@ -1,2 +1,2 @@ -COMMIT="caf4bee7f1647b4f971199a5268885337ff1691a" +COMMIT="5bd899f849dcfef5d4de55467334c39ede4ca5f2" SHA2="b5addf1b3a00055312e995909f5a1918bbb26ef6b206b6006b6c1bea2146471d" diff --git a/tools/dendrite_stub_checksums b/tools/dendrite_stub_checksums index 39337d3b340..415feb308a7 100644 --- a/tools/dendrite_stub_checksums +++ b/tools/dendrite_stub_checksums @@ -1,3 +1,3 @@ -CIDL_SHA256_ILLUMOS="0b6f1960e3475036c39b0df14015d968f96dfd198295f7e58ffdc8e2e8618afb" -CIDL_SHA256_LINUX_DPD="15f4c6844fff6c4051fb6c8455b0f5e28006c39b329babdb0a1e239dec822f05" -CIDL_SHA256_LINUX_SWADM="971c2c36cd04f87e323310834d948d6415f92195c076db497c5f46ee1c6f26f2" +CIDL_SHA256_ILLUMOS="1563a34d5317a6c5a54c2115444d66632fecdda51d8a9c367b403dc6b5ada948" +CIDL_SHA256_LINUX_DPD="74564e74356620fb98cc00db785b080ff3691681f6d9baba5770265bc92b713d" +CIDL_SHA256_LINUX_SWADM="e11b3b3b9b381c60c068b82487b41355ba2643a19c3a41f29d9d4c260257694d" From 78772eaa1d97bd7b6c438d060bd18c9eddcb0c9d Mon Sep 17 00:00:00 2001 From: "oxide-renovate[bot]" <146848827+oxide-renovate[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 18:09:12 -0800 Subject: [PATCH 28/43] Update Rust crate hickory-proto to v0.24.3 [SECURITY] (#7510) --- Cargo.lock | 9 +++++---- workspace-hack/Cargo.toml | 6 ++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3434e15dce8..f7b5ad0b043 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3922,9 +3922,9 @@ dependencies = [ [[package]] name = "hickory-proto" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447afdcdb8afb9d0a852af6dc65d9b285ce720ed7a59e42a8bf2e931c67bc1b5" +checksum = "2ad3d6d98c648ed628df039541a5577bee1a7c83e9e16fe3dbedeea4cdfeb971" dependencies = [ "async-trait", "cfg-if", @@ -5150,7 +5150,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -7545,6 +7545,7 @@ dependencies = [ "getrandom", "group", "hashbrown 0.15.1", + "heck 0.4.1", "hex", "hickory-proto", "hmac", @@ -11236,7 +11237,7 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" dependencies = [ - "heck 0.5.0", + "heck 0.4.1", "proc-macro2", "quote", "syn 2.0.96", diff --git a/workspace-hack/Cargo.toml b/workspace-hack/Cargo.toml index c53cf44a114..226c9edbd31 100644 --- a/workspace-hack/Cargo.toml +++ b/workspace-hack/Cargo.toml @@ -63,8 +63,9 @@ generic-array = { version = "0.14.7", default-features = false, features = ["mor getrandom = { version = "0.2.15", default-features = false, features = ["js", "rdrand", "std"] } group = { version = "0.13.0", default-features = false, features = ["alloc"] } hashbrown = { version = "0.15.1" } +heck = { version = "0.4.1" } hex = { version = "0.4.3", features = ["serde"] } -hickory-proto = { version = "0.24.2", features = ["text-parsing"] } +hickory-proto = { version = "0.24.3", features = ["text-parsing"] } hmac = { version = "0.12.1", default-features = false, features = ["reset"] } hyper = { version = "1.5.2", features = ["full"] } idna = { version = "1.0.3" } @@ -183,8 +184,9 @@ generic-array = { version = "0.14.7", default-features = false, features = ["mor getrandom = { version = "0.2.15", default-features = false, features = ["js", "rdrand", "std"] } group = { version = "0.13.0", default-features = false, features = ["alloc"] } hashbrown = { version = "0.15.1" } +heck = { version = "0.4.1" } hex = { version = "0.4.3", features = ["serde"] } -hickory-proto = { version = "0.24.2", features = ["text-parsing"] } +hickory-proto = { version = "0.24.3", features = ["text-parsing"] } hmac = { version = "0.12.1", default-features = false, features = ["reset"] } hyper = { version = "1.5.2", features = ["full"] } idna = { version = "1.0.3" } From b6ada022a52d1455a2f10c632e69e63c8f446d4c Mon Sep 17 00:00:00 2001 From: Zeeshan Lakhani Date: Tue, 11 Feb 2025 03:24:24 -0500 Subject: [PATCH 29/43] [dendrite] update manifest/tools (#7514) Matching to dendrite bec304c7a9abc1a130c93be003d285cd4ebe028e (tfportd-related metrics) --- package-manifest.toml | 12 ++++++------ tools/dendrite_openapi_version | 2 +- tools/dendrite_stub_checksums | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-manifest.toml b/package-manifest.toml index a155d1152f1..2493bea59da 100644 --- a/package-manifest.toml +++ b/package-manifest.toml @@ -720,8 +720,8 @@ only_for_targets.image = "standard" # the other `source.*` keys. source.type = "prebuilt" source.repo = "dendrite" -source.commit = "5bd899f849dcfef5d4de55467334c39ede4ca5f2" -source.sha256 = "1563a34d5317a6c5a54c2115444d66632fecdda51d8a9c367b403dc6b5ada948" +source.commit = "bec304c7a9abc1a130c93be003d285cd4ebe028e" +source.sha256 = "ab3f582fb94437d9de51671ccb122d64db5baadea2f672b40b6a489a488d8aad" output.type = "zone" output.intermediate_only = true @@ -747,8 +747,8 @@ only_for_targets.image = "standard" # the other `source.*` keys. source.type = "prebuilt" source.repo = "dendrite" -source.commit = "5bd899f849dcfef5d4de55467334c39ede4ca5f2" -source.sha256 = "4bd5ac5779b6bc70d82581bea0d0216aa4d9c6e0d810d4ce14e565181b5d6610" +source.commit = "bec304c7a9abc1a130c93be003d285cd4ebe028e" +source.sha256 = "91e0242dfff31828e736ac99b7996c944343eeeb07e9f18cd6a4f006af9dd148" output.type = "zone" output.intermediate_only = true @@ -767,8 +767,8 @@ only_for_targets.image = "standard" # the other `source.*` keys. source.type = "prebuilt" source.repo = "dendrite" -source.commit = "5bd899f849dcfef5d4de55467334c39ede4ca5f2" -source.sha256 = "32a08ccb3ac94947b554ab5c492bafcc36441721697fe595d9d6e2d9296fe51f" +source.commit = "bec304c7a9abc1a130c93be003d285cd4ebe028e" +source.sha256 = "c5ed35c83357a72b2ee337a594c30ec8f949899da0d8ee99f22661942ab574c9" output.type = "zone" output.intermediate_only = true diff --git a/tools/dendrite_openapi_version b/tools/dendrite_openapi_version index 06c92ba445b..de241d15d47 100755 --- a/tools/dendrite_openapi_version +++ b/tools/dendrite_openapi_version @@ -1,2 +1,2 @@ -COMMIT="5bd899f849dcfef5d4de55467334c39ede4ca5f2" +COMMIT="bec304c7a9abc1a130c93be003d285cd4ebe028e" SHA2="b5addf1b3a00055312e995909f5a1918bbb26ef6b206b6006b6c1bea2146471d" diff --git a/tools/dendrite_stub_checksums b/tools/dendrite_stub_checksums index 415feb308a7..2d57caa989b 100644 --- a/tools/dendrite_stub_checksums +++ b/tools/dendrite_stub_checksums @@ -1,3 +1,3 @@ -CIDL_SHA256_ILLUMOS="1563a34d5317a6c5a54c2115444d66632fecdda51d8a9c367b403dc6b5ada948" -CIDL_SHA256_LINUX_DPD="74564e74356620fb98cc00db785b080ff3691681f6d9baba5770265bc92b713d" -CIDL_SHA256_LINUX_SWADM="e11b3b3b9b381c60c068b82487b41355ba2643a19c3a41f29d9d4c260257694d" +CIDL_SHA256_ILLUMOS="ab3f582fb94437d9de51671ccb122d64db5baadea2f672b40b6a489a488d8aad" +CIDL_SHA256_LINUX_DPD="94db1f6d64daa8b19ddd8129edd546e80bf42341c55f78b86e1fb0b85c166edd" +CIDL_SHA256_LINUX_SWADM="ae6efafb361eb95644a0bb93041240a08beba1e42045a15efbef7bc7fe44a092" From 67134ffbe64c27f798532be30836fc75d760ea56 Mon Sep 17 00:00:00 2001 From: James MacMahon Date: Tue, 11 Feb 2025 13:05:14 -0500 Subject: [PATCH 30/43] Update crucible and propolis (#7517) Bump crucible and propolis rev to pick up: - oxidecomputer/crucible#1622 --- Cargo.lock | 30 +++++++++++++++--------------- Cargo.toml | 16 ++++++++-------- package-manifest.toml | 16 ++++++++-------- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f7b5ad0b043..3dbd20175c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -693,7 +693,7 @@ dependencies = [ [[package]] name = "bhyve_api" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309#0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" +source = "git+https://github.com/oxidecomputer/propolis?rev=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc#95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc" dependencies = [ "bhyve_api_sys", "libc", @@ -703,7 +703,7 @@ dependencies = [ [[package]] name = "bhyve_api_sys" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309#0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" +source = "git+https://github.com/oxidecomputer/propolis?rev=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc#95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc" dependencies = [ "libc", "strum", @@ -1880,7 +1880,7 @@ dependencies = [ [[package]] name = "crucible-agent-client" version = "0.0.1" -source = "git+https://github.com/oxidecomputer/crucible?rev=03f940b8387750d8955b37e3cc31cc91a2727262#03f940b8387750d8955b37e3cc31cc91a2727262" +source = "git+https://github.com/oxidecomputer/crucible?rev=d2d8f8ad449df7e2befb7ee2723a442dd74b9b72#d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" dependencies = [ "anyhow", "chrono", @@ -1896,7 +1896,7 @@ dependencies = [ [[package]] name = "crucible-client-types" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/crucible?rev=03f940b8387750d8955b37e3cc31cc91a2727262#03f940b8387750d8955b37e3cc31cc91a2727262" +source = "git+https://github.com/oxidecomputer/crucible?rev=d2d8f8ad449df7e2befb7ee2723a442dd74b9b72#d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" dependencies = [ "base64 0.22.1", "crucible-workspace-hack", @@ -1909,7 +1909,7 @@ dependencies = [ [[package]] name = "crucible-common" version = "0.0.1" -source = "git+https://github.com/oxidecomputer/crucible?rev=03f940b8387750d8955b37e3cc31cc91a2727262#03f940b8387750d8955b37e3cc31cc91a2727262" +source = "git+https://github.com/oxidecomputer/crucible?rev=d2d8f8ad449df7e2befb7ee2723a442dd74b9b72#d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" dependencies = [ "anyhow", "atty", @@ -1939,7 +1939,7 @@ dependencies = [ [[package]] name = "crucible-pantry-client" version = "0.0.1" -source = "git+https://github.com/oxidecomputer/crucible?rev=03f940b8387750d8955b37e3cc31cc91a2727262#03f940b8387750d8955b37e3cc31cc91a2727262" +source = "git+https://github.com/oxidecomputer/crucible?rev=d2d8f8ad449df7e2befb7ee2723a442dd74b9b72#d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" dependencies = [ "anyhow", "chrono", @@ -1956,7 +1956,7 @@ dependencies = [ [[package]] name = "crucible-smf" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/crucible?rev=03f940b8387750d8955b37e3cc31cc91a2727262#03f940b8387750d8955b37e3cc31cc91a2727262" +source = "git+https://github.com/oxidecomputer/crucible?rev=d2d8f8ad449df7e2befb7ee2723a442dd74b9b72#d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" dependencies = [ "crucible-workspace-hack", "libc", @@ -7105,7 +7105,7 @@ dependencies = [ "pq-sys", "pretty_assertions", "progenitor-client 0.9.1", - "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309)", + "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc)", "qorb", "rand", "range-requests", @@ -7392,7 +7392,7 @@ dependencies = [ "oximeter-producer", "oxnet", "pretty_assertions", - "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309)", + "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc)", "propolis-mock-server", "propolis_api_types", "rand", @@ -9178,7 +9178,7 @@ dependencies = [ [[package]] name = "propolis-client" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309#0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" +source = "git+https://github.com/oxidecomputer/propolis?rev=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc#95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc" dependencies = [ "async-trait", "base64 0.21.7", @@ -9223,7 +9223,7 @@ dependencies = [ [[package]] name = "propolis-mock-server" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309#0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" +source = "git+https://github.com/oxidecomputer/propolis?rev=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc#95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc" dependencies = [ "anyhow", "atty", @@ -9265,7 +9265,7 @@ dependencies = [ [[package]] name = "propolis_api_types" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309#0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" +source = "git+https://github.com/oxidecomputer/propolis?rev=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc#95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc" dependencies = [ "crucible-client-types", "propolis_types", @@ -9279,7 +9279,7 @@ dependencies = [ [[package]] name = "propolis_types" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309#0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" +source = "git+https://github.com/oxidecomputer/propolis?rev=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc#95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc" dependencies = [ "schemars", "serde", @@ -10906,7 +10906,7 @@ dependencies = [ "omicron-workspace-hack", "oxnet", "progenitor 0.9.1", - "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309)", + "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc)", "regress 0.9.1", "reqwest", "schemars", @@ -10932,7 +10932,7 @@ dependencies = [ "omicron-uuid-kinds", "omicron-workspace-hack", "oxnet", - "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309)", + "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc)", "rcgen", "schemars", "serde", diff --git a/Cargo.toml b/Cargo.toml index 462e87b3bc8..62956c57ec8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -362,10 +362,10 @@ crossterm = { version = "0.28.1", features = ["event-stream"] } # NOTE: if you change the pinned revision of the `crucible` dependencies, you # must also update the references in package-manifest.toml to match the new # revision. -crucible-agent-client = { git = "https://github.com/oxidecomputer/crucible", rev = "03f940b8387750d8955b37e3cc31cc91a2727262" } -crucible-pantry-client = { git = "https://github.com/oxidecomputer/crucible", rev = "03f940b8387750d8955b37e3cc31cc91a2727262" } -crucible-smf = { git = "https://github.com/oxidecomputer/crucible", rev = "03f940b8387750d8955b37e3cc31cc91a2727262" } -crucible-common = { git = "https://github.com/oxidecomputer/crucible", rev = "03f940b8387750d8955b37e3cc31cc91a2727262" } +crucible-agent-client = { git = "https://github.com/oxidecomputer/crucible", rev = "d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" } +crucible-pantry-client = { git = "https://github.com/oxidecomputer/crucible", rev = "d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" } +crucible-smf = { git = "https://github.com/oxidecomputer/crucible", rev = "d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" } +crucible-common = { git = "https://github.com/oxidecomputer/crucible", rev = "d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" } # NOTE: See above! csv = "1.3.1" curve25519-dalek = "4" @@ -565,10 +565,10 @@ progenitor-client = "0.9.1" # NOTE: if you change the pinned revision of the `bhyve_api` and propolis # dependencies, you must also update the references in package-manifest.toml to # match the new revision. -bhyve_api = { git = "https://github.com/oxidecomputer/propolis", rev = "0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" } -propolis_api_types = { git = "https://github.com/oxidecomputer/propolis", rev = "0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" } -propolis-client = { git = "https://github.com/oxidecomputer/propolis", rev = "0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" } -propolis-mock-server = { git = "https://github.com/oxidecomputer/propolis", rev = "0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" } +bhyve_api = { git = "https://github.com/oxidecomputer/propolis", rev = "95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc" } +propolis_api_types = { git = "https://github.com/oxidecomputer/propolis", rev = "95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc" } +propolis-client = { git = "https://github.com/oxidecomputer/propolis", rev = "95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc" } +propolis-mock-server = { git = "https://github.com/oxidecomputer/propolis", rev = "95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc" } # NOTE: see above! proptest = "1.5.0" qorb = "0.2.1" diff --git a/package-manifest.toml b/package-manifest.toml index 2493bea59da..80408db921a 100644 --- a/package-manifest.toml +++ b/package-manifest.toml @@ -579,10 +579,10 @@ only_for_targets.image = "standard" # 3. Use source.type = "manual" instead of "prebuilt" source.type = "prebuilt" source.repo = "crucible" -source.commit = "03f940b8387750d8955b37e3cc31cc91a2727262" +source.commit = "d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/crucible/image//crucible.sha256.txt -source.sha256 = "4dbffda837d6c759faa843f8853a6e9323f49c5820daa4ab563efea5ff9cf5ae" +source.sha256 = "9ff97404090498c5ac84e2b3b55f43466cb40a285da87af8c761b165b8ca912c" output.type = "zone" output.intermediate_only = true @@ -591,10 +591,10 @@ service_name = "crucible_pantry_prebuilt" only_for_targets.image = "standard" source.type = "prebuilt" source.repo = "crucible" -source.commit = "03f940b8387750d8955b37e3cc31cc91a2727262" +source.commit = "d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/crucible/image//crucible-pantry.sha256.txt -source.sha256 = "988b72e8808bdc7c204488b73e11104915640012fb7c9a75056ebc28f11e6d0d" +source.sha256 = "23e77a98fecb24a1d46ecd5f829e8ca48d90ff17f61b38a9302800cc1df9d0ee" output.type = "zone" output.intermediate_only = true @@ -608,10 +608,10 @@ service_name = "crucible_dtrace" only_for_targets.image = "standard" source.type = "prebuilt" source.repo = "crucible" -source.commit = "03f940b8387750d8955b37e3cc31cc91a2727262" +source.commit = "d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/crucible/image//crucible-dtrace.sha256.txt -source.sha256 = "73ebcc7a3e031f90361a08a99f9c3fc0ef1713209d2ead6fc44d55b0f8b7d040" +source.sha256 = "024cf5e70fd09a1d039ea6a35a59ca1d8ec9b82d1685bd74e8f6efd402dcc629" output.type = "tarball" # Refer to @@ -622,10 +622,10 @@ service_name = "propolis-server" only_for_targets.image = "standard" source.type = "prebuilt" source.repo = "propolis" -source.commit = "0c186579ba1fafc5a75d46d2ac8ab9ffa97fe309" +source.commit = "95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/propolis/image//propolis-server.sha256.txt -source.sha256 = "369f67ad5f1c205a50228cd5e4a5fd41f3cbf76ff8f64ae8bca8ee38a2ba5b5a" +source.sha256 = "ea5288f8ae6f3f6039fd3a6b5f7823f6968f273cfc321d7f20ab41c999814217" output.type = "zone" [package.mg-ddm-gz] From ff9bc34c299c004d242cff44ba604ad0f5a21864 Mon Sep 17 00:00:00 2001 From: David Crespo Date: Tue, 11 Feb 2025 16:27:19 -0600 Subject: [PATCH 31/43] Bump web console (instance auto-restart) (#7520) https://github.com/oxidecomputer/console/compare/93c5abc9...2720e146 * [2720e146](https://github.com/oxidecomputer/console/commit/2720e146) oxidecomputer/console#2644 --- tools/console_version | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/console_version b/tools/console_version index bc90999eee2..1d3cd5e529d 100644 --- a/tools/console_version +++ b/tools/console_version @@ -1,2 +1,2 @@ -COMMIT="93c5abc92b386145d0019246c449f09a9abdc375" -SHA2="9e4e49583c9b5477ec6016774d91d8821ee7738e4ad452591a7c3f99bee4217a" +COMMIT="2720e146bccc3ee91bed30c48dc0136638887f96" +SHA2="c313e0ab4d0c63854084effe55f3573623a1289fa42ad01455ee8460251deca1" From 31767f6581ed5e109885632e2f10d4615c225d48 Mon Sep 17 00:00:00 2001 From: Zeeshan Lakhani Date: Wed, 12 Feb 2025 09:51:29 -0500 Subject: [PATCH 32/43] [dendrite] update manifest/tools (#7523) This brings in the latest changes on dendrite `main`. --- package-manifest.toml | 12 ++++++------ tools/dendrite_openapi_version | 2 +- tools/dendrite_stub_checksums | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-manifest.toml b/package-manifest.toml index 80408db921a..40ea441b130 100644 --- a/package-manifest.toml +++ b/package-manifest.toml @@ -720,8 +720,8 @@ only_for_targets.image = "standard" # the other `source.*` keys. source.type = "prebuilt" source.repo = "dendrite" -source.commit = "bec304c7a9abc1a130c93be003d285cd4ebe028e" -source.sha256 = "ab3f582fb94437d9de51671ccb122d64db5baadea2f672b40b6a489a488d8aad" +source.commit = "b684e82b493a318889a2bd8c8f6e992a9c8342b3" +source.sha256 = "5b1419e14739c2a3f9ab9a8e794bc54c482169b2bbd98e5cd329cd1513f50add" output.type = "zone" output.intermediate_only = true @@ -747,8 +747,8 @@ only_for_targets.image = "standard" # the other `source.*` keys. source.type = "prebuilt" source.repo = "dendrite" -source.commit = "bec304c7a9abc1a130c93be003d285cd4ebe028e" -source.sha256 = "91e0242dfff31828e736ac99b7996c944343eeeb07e9f18cd6a4f006af9dd148" +source.commit = "b684e82b493a318889a2bd8c8f6e992a9c8342b3" +source.sha256 = "60fc0731bec87fad4eb6fbc511aebeda305ab882220f3dafd780098b6303e3a8" output.type = "zone" output.intermediate_only = true @@ -767,8 +767,8 @@ only_for_targets.image = "standard" # the other `source.*` keys. source.type = "prebuilt" source.repo = "dendrite" -source.commit = "bec304c7a9abc1a130c93be003d285cd4ebe028e" -source.sha256 = "c5ed35c83357a72b2ee337a594c30ec8f949899da0d8ee99f22661942ab574c9" +source.commit = "b684e82b493a318889a2bd8c8f6e992a9c8342b3" +source.sha256 = "bb8559fb3da7af1027dedc13e125deee4424052493ca76a3208ecb9d7583c2c3" output.type = "zone" output.intermediate_only = true diff --git a/tools/dendrite_openapi_version b/tools/dendrite_openapi_version index de241d15d47..66a39082e8d 100755 --- a/tools/dendrite_openapi_version +++ b/tools/dendrite_openapi_version @@ -1,2 +1,2 @@ -COMMIT="bec304c7a9abc1a130c93be003d285cd4ebe028e" +COMMIT="b684e82b493a318889a2bd8c8f6e992a9c8342b3" SHA2="b5addf1b3a00055312e995909f5a1918bbb26ef6b206b6006b6c1bea2146471d" diff --git a/tools/dendrite_stub_checksums b/tools/dendrite_stub_checksums index 2d57caa989b..224bca2e8ad 100644 --- a/tools/dendrite_stub_checksums +++ b/tools/dendrite_stub_checksums @@ -1,3 +1,3 @@ -CIDL_SHA256_ILLUMOS="ab3f582fb94437d9de51671ccb122d64db5baadea2f672b40b6a489a488d8aad" -CIDL_SHA256_LINUX_DPD="94db1f6d64daa8b19ddd8129edd546e80bf42341c55f78b86e1fb0b85c166edd" -CIDL_SHA256_LINUX_SWADM="ae6efafb361eb95644a0bb93041240a08beba1e42045a15efbef7bc7fe44a092" +CIDL_SHA256_ILLUMOS="5b1419e14739c2a3f9ab9a8e794bc54c482169b2bbd98e5cd329cd1513f50add" +CIDL_SHA256_LINUX_DPD="ed140476d262a875278fef8f93d74c0b6fb3d73a5ba02a6dfe8cb34da8347df1" +CIDL_SHA256_LINUX_SWADM="2ed7e8fd4faa2ee5c7e24972979efcb87c2fba5ce678af22ddd3c34238226301" From 798b2769b2f3729f79693be485fa8b88b85611bd Mon Sep 17 00:00:00 2001 From: Benjamin Naecker Date: Wed, 12 Feb 2025 11:21:45 -0800 Subject: [PATCH 33/43] Update Dendrite and handle new transceiver API definitions (#7528) --- Cargo.lock | 25 ------------------------- Cargo.toml | 2 +- clients/dpd-client/Cargo.toml | 1 - clients/dpd-client/build.rs | 29 ----------------------------- package-manifest.toml | 12 ++++++------ tools/dendrite_openapi_version | 4 ++-- tools/dendrite_stub_checksums | 6 +++--- 7 files changed, 12 insertions(+), 67 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3dbd20175c7..5e477021460 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2636,7 +2636,6 @@ dependencies = [ "serde_json", "slog", "toml 0.8.19", - "transceiver-decode", "typify 0.3.0", "uuid", ] @@ -12384,30 +12383,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "transceiver-decode" -version = "0.1.0" -source = "git+https://github.com/oxidecomputer/transceiver-control#9ff89d72aec7848552b595e44e1fdb508f82ddfa" -dependencies = [ - "schemars", - "serde", - "static_assertions", - "thiserror 2.0.11", - "transceiver-messages", -] - -[[package]] -name = "transceiver-messages" -version = "0.1.1" -source = "git+https://github.com/oxidecomputer/transceiver-control#9ff89d72aec7848552b595e44e1fdb508f82ddfa" -dependencies = [ - "bitflags 2.6.0", - "clap", - "hubpack", - "serde", - "thiserror 2.0.11", -] - [[package]] name = "try-lock" version = "0.2.5" diff --git a/Cargo.toml b/Cargo.toml index 62956c57ec8..a36c1b0855e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -670,7 +670,7 @@ tokio-util = { version = "0.7.12", features = ["io", "io-util"] } toml = "0.8.19" toml_edit = "0.22.22" tough = { version = "0.19.0", features = [ "http" ] } -transceiver-decode = { git = "https://github.com/oxidecomputer/transceiver-control", features = [ "api-traits" ] } +transceiver-controller = { git = "https://github.com/oxidecomputer/transceiver-control", features = [ "api-traits" ] } trybuild = "1.0.101" tufaceous = { path = "tufaceous" } tufaceous-lib = { path = "tufaceous-lib" } diff --git a/clients/dpd-client/Cargo.toml b/clients/dpd-client/Cargo.toml index b496a075ffd..19e8a1f7187 100644 --- a/clients/dpd-client/Cargo.toml +++ b/clients/dpd-client/Cargo.toml @@ -19,7 +19,6 @@ reqwest = { workspace = true, features = ["json", "stream", "rustls-tls"] } schemars.workspace = true serde.workspace = true slog.workspace = true -transceiver-decode.workspace = true uuid.workspace = true [build-dependencies] diff --git a/clients/dpd-client/build.rs b/clients/dpd-client/build.rs index 49bd68502c6..3d10b919019 100644 --- a/clients/dpd-client/build.rs +++ b/clients/dpd-client/build.rs @@ -20,32 +20,10 @@ use quote::quote; use std::env; use std::fs; use std::path::Path; -use typify::TypeSpaceImpl; const DENDRITE_ASIC_PACKAGE: PackageName = PackageName::new_const("dendrite-asic"); -// List of types we replace with the existing type of the same name from the -// `transceiver_decode` crate. -const REPLACEMENTS: &[&'static str] = &[ - "ActiveCableMediaInterfaceId", - "ApplicationDescriptor", - "BaseTMediaInterfaceId", - "CmisDatapath", - "CmisDatapathState", - "CmisLaneStatus", - "ConnectorType", - "ExtendedSpecificationComplianceCode", - "HostElectricalInterfaceId", - "Identifier", - "MediaType", - "MmfMediaInterfaceId", - "PassiveCopperMediaInterfaceId", - "Sff8636Datapath", - "SffComplianceCode", - "SmfMediaInterfaceId", -]; - fn main() -> Result<()> { // Find the current dendrite repo commit from our package manifest. let manifest = fs::read_to_string("../../package-manifest.toml") @@ -115,13 +93,6 @@ fn main() -> Result<()> { } }) .with_derive("PartialEq"); - for repl in REPLACEMENTS { - settings.with_replacement( - repl, - format!("::transceiver_decode::{repl}"), - std::iter::once(TypeSpaceImpl::Display), - ); - } let code = progenitor::Generator::new(&settings) .generate_tokens(&spec) diff --git a/package-manifest.toml b/package-manifest.toml index 40ea441b130..42eb9cb5fac 100644 --- a/package-manifest.toml +++ b/package-manifest.toml @@ -720,8 +720,8 @@ only_for_targets.image = "standard" # the other `source.*` keys. source.type = "prebuilt" source.repo = "dendrite" -source.commit = "b684e82b493a318889a2bd8c8f6e992a9c8342b3" -source.sha256 = "5b1419e14739c2a3f9ab9a8e794bc54c482169b2bbd98e5cd329cd1513f50add" +source.commit = "b37a8fdc335592e24d6afe71995637b2ad36eb7d" +source.sha256 = "022cf1eddf9a8a4042db95ce03d24c3b703f6552bafde0bde3e10d2c138a1e3f" output.type = "zone" output.intermediate_only = true @@ -747,8 +747,8 @@ only_for_targets.image = "standard" # the other `source.*` keys. source.type = "prebuilt" source.repo = "dendrite" -source.commit = "b684e82b493a318889a2bd8c8f6e992a9c8342b3" -source.sha256 = "60fc0731bec87fad4eb6fbc511aebeda305ab882220f3dafd780098b6303e3a8" +source.commit = "b37a8fdc335592e24d6afe71995637b2ad36eb7d" +source.sha256 = "59bf5dcda77a01d4df0ec839ea48a18acf5e12fcd4bb400d1c23677811a5b352" output.type = "zone" output.intermediate_only = true @@ -767,8 +767,8 @@ only_for_targets.image = "standard" # the other `source.*` keys. source.type = "prebuilt" source.repo = "dendrite" -source.commit = "b684e82b493a318889a2bd8c8f6e992a9c8342b3" -source.sha256 = "bb8559fb3da7af1027dedc13e125deee4424052493ca76a3208ecb9d7583c2c3" +source.commit = "b37a8fdc335592e24d6afe71995637b2ad36eb7d" +source.sha256 = "2b502172b3877f07026a26054e3a34ac64ba053d6e5861375dcd87dac6ce6c27" output.type = "zone" output.intermediate_only = true diff --git a/tools/dendrite_openapi_version b/tools/dendrite_openapi_version index 66a39082e8d..be6aed1fc07 100755 --- a/tools/dendrite_openapi_version +++ b/tools/dendrite_openapi_version @@ -1,2 +1,2 @@ -COMMIT="b684e82b493a318889a2bd8c8f6e992a9c8342b3" -SHA2="b5addf1b3a00055312e995909f5a1918bbb26ef6b206b6006b6c1bea2146471d" +COMMIT="b37a8fdc335592e24d6afe71995637b2ad36eb7d" +SHA2="72b4489e522778ea91979bcba94d9392ab4d5318f19f49aca2388791bb709778" diff --git a/tools/dendrite_stub_checksums b/tools/dendrite_stub_checksums index 224bca2e8ad..b53e4866a3d 100644 --- a/tools/dendrite_stub_checksums +++ b/tools/dendrite_stub_checksums @@ -1,3 +1,3 @@ -CIDL_SHA256_ILLUMOS="5b1419e14739c2a3f9ab9a8e794bc54c482169b2bbd98e5cd329cd1513f50add" -CIDL_SHA256_LINUX_DPD="ed140476d262a875278fef8f93d74c0b6fb3d73a5ba02a6dfe8cb34da8347df1" -CIDL_SHA256_LINUX_SWADM="2ed7e8fd4faa2ee5c7e24972979efcb87c2fba5ce678af22ddd3c34238226301" +CIDL_SHA256_ILLUMOS="022cf1eddf9a8a4042db95ce03d24c3b703f6552bafde0bde3e10d2c138a1e3f" +CIDL_SHA256_LINUX_DPD="bbc6eebae357df8075c359e04c88842c6d38eff3079984bbbf5b102504495804" +CIDL_SHA256_LINUX_SWADM="d0a792165b6a70700071e36d3ea358f6098300aff8b7bfe2942e324d0dcc9443" From a45a089635083697e4a095ecc274fb5adfa523fc Mon Sep 17 00:00:00 2001 From: James MacMahon Date: Wed, 12 Feb 2025 17:54:41 -0500 Subject: [PATCH 34/43] Region snapshot replacement for read-only regions (#7435) Reuse the region snapshot replacement machinery to replace read-only regions. This is done by storing a replacement type in the region snapshot replacement record such that either a region snapshot _or_ a read-only region can be the subject of this type of replacement. The procedure for both types is the same so all the code can be reused. A future commit will rename region snapshot replacement (and all references) to "read-only target replacement" to reflect that the machinery now applies to both region snapshots and read-only regions. This will be a mostly mechanical set of changes that can be reviewed separately with much less scrutiny. Right now manually requesting a region replacement with omdb is done through the region replacement manual request, not the region snapshot replacement manual request. This will change in that future commit to be part of a read-only target replacement request. Fixes #6172 --- dev-tools/omdb/src/bin/omdb/db.rs | 59 +- dev-tools/omdb/src/bin/omdb/nexus.rs | 30 + dev-tools/omdb/tests/env.out | 12 + dev-tools/omdb/tests/successes.out | 20 + nexus-config/src/nexus_config.rs | 17 + .../src/region_snapshot_replacement.rs | 128 +++- nexus/db-model/src/schema.rs | 5 +- nexus/db-model/src/schema_versions.rs | 3 +- nexus/db-queries/src/db/datastore/region.rs | 36 ++ .../src/db/datastore/region_replacement.rs | 5 +- .../datastore/region_snapshot_replacement.rs | 189 +++++- nexus/db-queries/src/db/datastore/snapshot.rs | 17 + nexus/db-queries/src/db/datastore/volume.rs | 34 + nexus/examples/config-second.toml | 1 + nexus/examples/config.toml | 1 + nexus/src/app/background/init.rs | 18 + nexus/src/app/background/tasks/mod.rs | 1 + .../read_only_region_replacement_start.rs | 373 +++++++++++ .../region_snapshot_replacement_finish.rs | 67 +- ...on_snapshot_replacement_garbage_collect.rs | 23 +- .../region_snapshot_replacement_start.rs | 139 ++-- .../tasks/region_snapshot_replacement_step.rs | 266 +++++--- ...on_snapshot_replacement_garbage_collect.rs | 2 +- .../region_snapshot_replacement_start.rs | 281 ++++++--- .../sagas/region_snapshot_replacement_step.rs | 41 +- nexus/test-utils/src/background.rs | 74 ++- nexus/tests/config.test.toml | 1 + .../crucible_replacements.rs | 592 +++++++++++++++--- nexus/tests/integration_tests/schema.rs | 77 +++ .../integration_tests/volume_management.rs | 28 +- nexus/types/src/internal_api/background.rs | 8 + schema/crdb/dbinit.sql | 47 +- .../up01.sql | 2 + .../up02.sql | 4 + .../up03.sql | 2 + .../up04.sql | 2 + .../up05.sql | 2 + .../up06.sql | 2 + .../up07.sql | 9 + smf/nexus/multi-sled/config-partial.toml | 1 + smf/nexus/single-sled/config-partial.toml | 1 + 41 files changed, 2130 insertions(+), 490 deletions(-) create mode 100644 nexus/src/app/background/tasks/read_only_region_replacement_start.rs create mode 100644 schema/crdb/support-read-only-region-replacement/up01.sql create mode 100644 schema/crdb/support-read-only-region-replacement/up02.sql create mode 100644 schema/crdb/support-read-only-region-replacement/up03.sql create mode 100644 schema/crdb/support-read-only-region-replacement/up04.sql create mode 100644 schema/crdb/support-read-only-region-replacement/up05.sql create mode 100644 schema/crdb/support-read-only-region-replacement/up06.sql create mode 100644 schema/crdb/support-read-only-region-replacement/up07.sql diff --git a/dev-tools/omdb/src/bin/omdb/db.rs b/dev-tools/omdb/src/bin/omdb/db.rs index f0bbf2a67ba..96e5c39c7f0 100644 --- a/dev-tools/omdb/src/bin/omdb/db.rs +++ b/dev-tools/omdb/src/bin/omdb/db.rs @@ -76,6 +76,7 @@ use nexus_db_model::NetworkInterfaceKind; use nexus_db_model::PhysicalDisk; use nexus_db_model::Probe; use nexus_db_model::Project; +use nexus_db_model::ReadOnlyTargetReplacement; use nexus_db_model::Region; use nexus_db_model::RegionReplacement; use nexus_db_model::RegionReplacementState; @@ -3068,11 +3069,19 @@ async fn cmd_db_region_replacement_request( ) -> Result<(), anyhow::Error> { let region = datastore.get_region(args.region_id).await?; - let request_id = datastore - .create_region_replacement_request_for_region(opctx, ®ion) - .await?; + if region.read_only() { + let request_id = datastore + .create_read_only_region_replacement_request(opctx, region.id()) + .await?; + + println!("region snapshot replacement {request_id} created"); + } else { + let request_id = datastore + .create_region_replacement_request_for_region(opctx, ®ion) + .await?; - println!("region replacement {request_id} created"); + println!("region replacement {request_id} created"); + } Ok(()) } @@ -4448,12 +4457,22 @@ async fn cmd_db_region_snapshot_replacement_status( " state: {:?}", request.replacement_state ); - println!( - " region snapshot: {} {} {}", - request.old_dataset_id, - request.old_region_id, - request.old_snapshot_id, - ); + match request.replacement_type() { + ReadOnlyTargetReplacement::RegionSnapshot { + dataset_id, + region_id, + snapshot_id, + } => { + println!( + " region snapshot: {} {} {}", + dataset_id, region_id, snapshot_id, + ); + } + + ReadOnlyTargetReplacement::ReadOnlyRegion { region_id } => { + println!(" read-only region: {}", region_id); + } + } println!(" new region id: {:?}", request.new_region_id); println!(" in-progress steps left: {:?}", steps_left); println!(); @@ -4485,10 +4504,22 @@ async fn cmd_db_region_snapshot_replacement_info( println!(" started: {}", request.request_time); println!(" state: {:?}", request.replacement_state); - println!( - " region snapshot: {} {} {}", - request.old_dataset_id, request.old_region_id, request.old_snapshot_id, - ); + match request.replacement_type() { + ReadOnlyTargetReplacement::RegionSnapshot { + dataset_id, + region_id, + snapshot_id, + } => { + println!( + " region snapshot: {} {} {}", + dataset_id, region_id, snapshot_id, + ); + } + + ReadOnlyTargetReplacement::ReadOnlyRegion { region_id } => { + println!(" read-only region: {}", region_id); + } + } println!(" new region id: {:?}", request.new_region_id); println!(" in-progress steps left: {:?}", steps_left); println!(); diff --git a/dev-tools/omdb/src/bin/omdb/nexus.rs b/dev-tools/omdb/src/bin/omdb/nexus.rs index 0af00f45648..208b43d054c 100644 --- a/dev-tools/omdb/src/bin/omdb/nexus.rs +++ b/dev-tools/omdb/src/bin/omdb/nexus.rs @@ -46,6 +46,7 @@ use nexus_types::internal_api::background::BlueprintRendezvousStatus; use nexus_types::internal_api::background::InstanceReincarnationStatus; use nexus_types::internal_api::background::InstanceUpdaterStatus; use nexus_types::internal_api::background::LookupRegionPortStatus; +use nexus_types::internal_api::background::ReadOnlyRegionReplacementStartStatus; use nexus_types::internal_api::background::RegionReplacementDriverStatus; use nexus_types::internal_api::background::RegionReplacementStatus; use nexus_types::internal_api::background::RegionSnapshotReplacementFinishStatus; @@ -928,6 +929,9 @@ fn print_task_details(bgtask: &BackgroundTask, details: &serde_json::Value) { "phantom_disks" => { print_task_phantom_disks(details); } + "read_only_region_replacement_start" => { + print_task_read_only_region_replacement_start(details); + } "region_replacement" => { print_task_region_replacement(details); } @@ -1724,6 +1728,32 @@ fn print_task_phantom_disks(details: &serde_json::Value) { }; } +fn print_task_read_only_region_replacement_start(details: &serde_json::Value) { + match serde_json::from_value::( + details.clone(), + ) { + Err(error) => eprintln!( + "warning: failed to interpret task details: {:?}: {:?}", + error, details + ), + + Ok(status) => { + println!( + " total requests created ok: {}", + status.requests_created_ok.len(), + ); + for line in &status.requests_created_ok { + println!(" > {line}"); + } + + println!(" errors: {}", status.errors.len()); + for line in &status.errors { + println!(" > {line}"); + } + } + } +} + fn print_task_region_replacement(details: &serde_json::Value) { match serde_json::from_value::(details.clone()) { Err(error) => eprintln!( diff --git a/dev-tools/omdb/tests/env.out b/dev-tools/omdb/tests/env.out index b650544f78b..cf5eb09cad2 100644 --- a/dev-tools/omdb/tests/env.out +++ b/dev-tools/omdb/tests/env.out @@ -129,6 +129,10 @@ task: "physical_disk_adoption" ensure new physical disks are automatically marked in-service +task: "read_only_region_replacement_start" + detect if read-only regions need replacement and begin the process + + task: "region_replacement" detects if a region requires replacing and begins the process @@ -313,6 +317,10 @@ task: "physical_disk_adoption" ensure new physical disks are automatically marked in-service +task: "read_only_region_replacement_start" + detect if read-only regions need replacement and begin the process + + task: "region_replacement" detects if a region requires replacing and begins the process @@ -484,6 +492,10 @@ task: "physical_disk_adoption" ensure new physical disks are automatically marked in-service +task: "read_only_region_replacement_start" + detect if read-only regions need replacement and begin the process + + task: "region_replacement" detects if a region requires replacing and begins the process diff --git a/dev-tools/omdb/tests/successes.out b/dev-tools/omdb/tests/successes.out index 00c8c05b20f..1672d2ac283 100644 --- a/dev-tools/omdb/tests/successes.out +++ b/dev-tools/omdb/tests/successes.out @@ -337,6 +337,10 @@ task: "physical_disk_adoption" ensure new physical disks are automatically marked in-service +task: "read_only_region_replacement_start" + detect if read-only regions need replacement and begin the process + + task: "region_replacement" detects if a region requires replacing and begins the process @@ -613,6 +617,14 @@ task: "physical_disk_adoption" started at (s ago) and ran for ms last completion reported error: task disabled +task: "read_only_region_replacement_start" + configured period: every m + currently executing: no + last completed activation: , triggered by a periodic timer firing + started at (s ago) and ran for ms + total requests created ok: 0 + errors: 0 + task: "region_replacement" configured period: every m currently executing: no @@ -1104,6 +1116,14 @@ task: "physical_disk_adoption" started at (s ago) and ran for ms last completion reported error: task disabled +task: "read_only_region_replacement_start" + configured period: every m + currently executing: no + last completed activation: , triggered by a periodic timer firing + started at (s ago) and ran for ms + total requests created ok: 0 + errors: 0 + task: "region_replacement" configured period: every m currently executing: no diff --git a/nexus-config/src/nexus_config.rs b/nexus-config/src/nexus_config.rs index 10f7c0e3106..1f1ed10fc79 100644 --- a/nexus-config/src/nexus_config.rs +++ b/nexus-config/src/nexus_config.rs @@ -419,6 +419,9 @@ pub struct BackgroundTaskConfig { RegionSnapshotReplacementFinishConfig, /// configuration for TUF artifact replication task pub tuf_artifact_replication: TufArtifactReplicationConfig, + /// configuration for read-only region replacement start task + pub read_only_region_replacement_start: + ReadOnlyRegionReplacementStartConfig, } #[serde_as] @@ -735,6 +738,14 @@ pub struct TufArtifactReplicationConfig { pub min_sled_replication: usize, } +#[serde_as] +#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] +pub struct ReadOnlyRegionReplacementStartConfig { + /// period (in seconds) for periodic activations of this background task + #[serde_as(as = "DurationSeconds")] + pub period_secs: Duration, +} + /// Configuration for a nexus server #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] pub struct PackageConfig { @@ -993,6 +1004,7 @@ mod test { region_snapshot_replacement_finish.period_secs = 30 tuf_artifact_replication.period_secs = 300 tuf_artifact_replication.min_sled_replication = 3 + read_only_region_replacement_start.period_secs = 30 [default_region_allocation_strategy] type = "random" seed = 0 @@ -1194,6 +1206,10 @@ mod test { period_secs: Duration::from_secs(300), min_sled_replication: 3, }, + read_only_region_replacement_start: + ReadOnlyRegionReplacementStartConfig { + period_secs: Duration::from_secs(30), + }, }, default_region_allocation_strategy: crate::nexus_config::RegionAllocationStrategy::Random { @@ -1279,6 +1295,7 @@ mod test { region_snapshot_replacement_finish.period_secs = 30 tuf_artifact_replication.period_secs = 300 tuf_artifact_replication.min_sled_replication = 3 + read_only_region_replacement_start.period_secs = 30 [default_region_allocation_strategy] type = "random" "##, diff --git a/nexus/db-model/src/region_snapshot_replacement.rs b/nexus/db-model/src/region_snapshot_replacement.rs index 36730a072a9..4a92d7287bf 100644 --- a/nexus/db-model/src/region_snapshot_replacement.rs +++ b/nexus/db-model/src/region_snapshot_replacement.rs @@ -56,6 +56,82 @@ impl std::str::FromStr for RegionSnapshotReplacementState { } } +impl_enum_type!( + #[derive(SqlType, Debug, QueryId)] + #[diesel(postgres_type(name = "read_only_target_replacement_type", schema = "public"))] + pub struct ReadOnlyTargetReplacementTypeEnum; + + #[derive(Copy, Clone, Debug, AsExpression, FromSqlRow, Serialize, Deserialize, PartialEq)] + #[diesel(sql_type = ReadOnlyTargetReplacementTypeEnum)] + pub enum ReadOnlyTargetReplacementType; + + // Enum values + RegionSnapshot => b"region_snapshot" + ReadOnlyRegion => b"read_only_region" +); + +// FromStr impl required for use with clap (aka omdb) +impl std::str::FromStr for ReadOnlyTargetReplacementType { + type Err = String; + + fn from_str(s: &str) -> Result { + match s { + "region_snapshot" => { + Ok(ReadOnlyTargetReplacementType::RegionSnapshot) + } + "read_only_region" => { + Ok(ReadOnlyTargetReplacementType::ReadOnlyRegion) + } + _ => Err(format!("unrecognized value {} for enum", s)), + } + } +} + +#[derive(Debug, PartialEq)] +pub enum ReadOnlyTargetReplacement { + RegionSnapshot { + dataset_id: DbTypedUuid, + region_id: Uuid, + snapshot_id: Uuid, + }, + + ReadOnlyRegion { + region_id: Uuid, + }, +} + +impl slog::KV for ReadOnlyTargetReplacement { + fn serialize( + &self, + _record: &slog::Record<'_>, + serializer: &mut dyn slog::Serializer, + ) -> slog::Result { + match &self { + ReadOnlyTargetReplacement::RegionSnapshot { + dataset_id, + region_id, + snapshot_id, + } => { + serializer.emit_str("type".into(), "region_snapshot")?; + serializer + .emit_str("dataset_id".into(), &dataset_id.to_string())?; + serializer + .emit_str("region_id".into(), ®ion_id.to_string())?; + serializer + .emit_str("snapshot_id".into(), &snapshot_id.to_string())?; + } + + ReadOnlyTargetReplacement::ReadOnlyRegion { region_id } => { + serializer.emit_str("type".into(), "region_snapshot")?; + serializer + .emit_str("region_id".into(), ®ion_id.to_string())?; + } + } + + Ok(()) + } +} + /// Database representation of a RegionSnapshot replacement request. /// /// This record stores the data related to the operations required for Nexus to @@ -130,9 +206,10 @@ pub struct RegionSnapshotReplacement { pub request_time: DateTime, // These are a copy of fields from the corresponding region snapshot record - pub old_dataset_id: DbTypedUuid, - pub old_region_id: Uuid, - pub old_snapshot_id: Uuid, + // or the corresponding read-only region + old_dataset_id: Option>, + old_region_id: Uuid, + old_snapshot_id: Option, /// A synthetic volume that only is used to later delete the old snapshot pub old_snapshot_volume_id: Option>, @@ -148,18 +225,20 @@ pub struct RegionSnapshotReplacement { /// as long as this request so that all necessary replacements can be /// completed. pub new_region_volume_id: Option>, + + pub replacement_type: ReadOnlyTargetReplacementType, } impl RegionSnapshotReplacement { pub fn for_region_snapshot(region_snapshot: &RegionSnapshot) -> Self { - Self::new( + Self::new_from_region_snapshot( region_snapshot.dataset_id(), region_snapshot.region_id, region_snapshot.snapshot_id, ) } - pub fn new( + pub fn new_from_region_snapshot( old_dataset_id: DatasetUuid, old_region_id: Uuid, old_snapshot_id: Uuid, @@ -167,14 +246,31 @@ impl RegionSnapshotReplacement { Self { id: Uuid::new_v4(), request_time: Utc::now(), - old_dataset_id: old_dataset_id.into(), + old_dataset_id: Some(old_dataset_id.into()), old_region_id, - old_snapshot_id, + old_snapshot_id: Some(old_snapshot_id), old_snapshot_volume_id: None, new_region_id: None, new_region_volume_id: None, replacement_state: RegionSnapshotReplacementState::Requested, operating_saga_id: None, + replacement_type: ReadOnlyTargetReplacementType::RegionSnapshot, + } + } + + pub fn new_from_read_only_region(old_region_id: Uuid) -> Self { + Self { + id: Uuid::new_v4(), + request_time: Utc::now(), + old_dataset_id: None, + old_region_id, + old_snapshot_id: None, + old_snapshot_volume_id: None, + new_region_id: None, + new_region_volume_id: None, + replacement_state: RegionSnapshotReplacementState::Requested, + operating_saga_id: None, + replacement_type: ReadOnlyTargetReplacementType::ReadOnlyRegion, } } @@ -185,4 +281,22 @@ impl RegionSnapshotReplacement { pub fn new_region_volume_id(&self) -> Option { self.new_region_volume_id.map(|v| v.into()) } + + pub fn replacement_type(&self) -> ReadOnlyTargetReplacement { + match &self.replacement_type { + ReadOnlyTargetReplacementType::RegionSnapshot => { + ReadOnlyTargetReplacement::RegionSnapshot { + dataset_id: self.old_dataset_id.unwrap(), + region_id: self.old_region_id, + snapshot_id: self.old_snapshot_id.unwrap(), + } + } + + ReadOnlyTargetReplacementType::ReadOnlyRegion => { + ReadOnlyTargetReplacement::ReadOnlyRegion { + region_id: self.old_region_id, + } + } + } + } } diff --git a/nexus/db-model/src/schema.rs b/nexus/db-model/src/schema.rs index 8343d2ff2fc..23027113d11 100644 --- a/nexus/db-model/src/schema.rs +++ b/nexus/db-model/src/schema.rs @@ -1944,14 +1944,15 @@ table! { region_snapshot_replacement (id) { id -> Uuid, request_time -> Timestamptz, - old_dataset_id -> Uuid, + old_dataset_id -> Nullable, old_region_id -> Uuid, - old_snapshot_id -> Uuid, + old_snapshot_id -> Nullable, old_snapshot_volume_id -> Nullable, new_region_id -> Nullable, replacement_state -> crate::RegionSnapshotReplacementStateEnum, operating_saga_id -> Nullable, new_region_volume_id -> Nullable, + replacement_type -> crate::ReadOnlyTargetReplacementTypeEnum, } } diff --git a/nexus/db-model/src/schema_versions.rs b/nexus/db-model/src/schema_versions.rs index 79831241d99..0706d9847b4 100644 --- a/nexus/db-model/src/schema_versions.rs +++ b/nexus/db-model/src/schema_versions.rs @@ -17,7 +17,7 @@ use std::collections::BTreeMap; /// /// This must be updated when you change the database schema. Refer to /// schema/crdb/README.adoc in the root of this repository for details. -pub const SCHEMA_VERSION: SemverVersion = SemverVersion::new(123, 0, 0); +pub const SCHEMA_VERSION: SemverVersion = SemverVersion::new(124, 0, 0); /// List of all past database schema versions, in *reverse* order /// @@ -29,6 +29,7 @@ static KNOWN_VERSIONS: Lazy> = Lazy::new(|| { // | leaving the first copy as an example for the next person. // v // KnownVersion::new(next_int, "unique-dirname-with-the-sql-files"), + KnownVersion::new(124, "support-read-only-region-replacement"), KnownVersion::new(123, "vpc-subnet-contention"), KnownVersion::new(122, "tuf-artifact-replication"), KnownVersion::new(121, "dataset-to-crucible-dataset"), diff --git a/nexus/db-queries/src/db/datastore/region.rs b/nexus/db-queries/src/db/datastore/region.rs index 9e27ee9d3fd..bacba45a683 100644 --- a/nexus/db-queries/src/db/datastore/region.rs +++ b/nexus/db-queries/src/db/datastore/region.rs @@ -457,6 +457,42 @@ impl DataStore { .map_err(|e| public_error_from_diesel(e, ErrorHandler::Server)) } + /// Find read-only regions on expunged disks + pub async fn find_read_only_regions_on_expunged_physical_disks( + &self, + opctx: &OpContext, + ) -> LookupResult> { + let conn = self.pool_connection_authorized(opctx).await?; + + use db::schema::crucible_dataset::dsl as dataset_dsl; + use db::schema::physical_disk::dsl as physical_disk_dsl; + use db::schema::region::dsl as region_dsl; + use db::schema::zpool::dsl as zpool_dsl; + + region_dsl::region + .filter(region_dsl::dataset_id.eq_any( + dataset_dsl::crucible_dataset + .filter(dataset_dsl::time_deleted.is_null()) + .filter(dataset_dsl::pool_id.eq_any( + zpool_dsl::zpool + .filter(zpool_dsl::time_deleted.is_null()) + .filter(zpool_dsl::physical_disk_id.eq_any( + physical_disk_dsl::physical_disk + .filter(physical_disk_dsl::disk_policy.eq(PhysicalDiskPolicy::Expunged)) + .select(physical_disk_dsl::id) + )) + .select(zpool_dsl::id) + )) + .select(dataset_dsl::id) + )) + // only return read-only regions here + .filter(region_dsl::read_only.eq(true)) + .select(Region::as_select()) + .load_async(&*conn) + .await + .map_err(|e| public_error_from_diesel(e, ErrorHandler::Server)) + } + pub async fn region_set_port( &self, region_id: Uuid, diff --git a/nexus/db-queries/src/db/datastore/region_replacement.rs b/nexus/db-queries/src/db/datastore/region_replacement.rs index ba1c667e849..72afbac3198 100644 --- a/nexus/db-queries/src/db/datastore/region_replacement.rs +++ b/nexus/db-queries/src/db/datastore/region_replacement.rs @@ -32,14 +32,15 @@ use omicron_uuid_kinds::VolumeUuid; use uuid::Uuid; impl DataStore { - /// Create and insert a region replacement request for a Region, returning the ID of the - /// request. + /// Create and insert a region replacement request for a Region, returning + /// the ID of the request. pub async fn create_region_replacement_request_for_region( &self, opctx: &OpContext, region: &Region, ) -> Result { if region.read_only() { + // You want `create_read_only_region_replacement_request`! :) return Err(Error::invalid_request(format!( "region {} is read-only", region.id(), diff --git a/nexus/db-queries/src/db/datastore/region_snapshot_replacement.rs b/nexus/db-queries/src/db/datastore/region_snapshot_replacement.rs index a698d5617b4..a2139b24d14 100644 --- a/nexus/db-queries/src/db/datastore/region_snapshot_replacement.rs +++ b/nexus/db-queries/src/db/datastore/region_snapshot_replacement.rs @@ -12,6 +12,8 @@ use crate::db::datastore::SQL_BATCH_SIZE; use crate::db::error::public_error_from_diesel; use crate::db::error::ErrorHandler; use crate::db::model::to_db_typed_uuid; +use crate::db::model::ReadOnlyTargetReplacement; +use crate::db::model::ReadOnlyTargetReplacementType; use crate::db::model::RegionSnapshot; use crate::db::model::RegionSnapshotReplacement; use crate::db::model::RegionSnapshotReplacementState; @@ -27,6 +29,7 @@ use async_bb8_diesel::AsyncRunQueryDsl; use diesel::prelude::*; use omicron_common::api::external::Error; use omicron_uuid_kinds::VolumeUuid; +use std::net::SocketAddrV6; use uuid::Uuid; #[must_use] @@ -67,12 +70,17 @@ impl DataStore { opctx: &OpContext, request: RegionSnapshotReplacement, ) -> Result<(), Error> { + let ReadOnlyTargetReplacement::RegionSnapshot { snapshot_id, .. } = + request.replacement_type() + else { + return Err(Error::internal_error( + "wrong read-only target replacement type", + )); + }; + // Note: if `LookupPath` is used here, it will not be able to retrieve // deleted snapshots - let db_snapshot = match self - .snapshot_get(opctx, request.old_snapshot_id) - .await? - { + let db_snapshot = match self.snapshot_get(opctx, snapshot_id).await? { Some(db_snapshot) => db_snapshot, None => { return Err(Error::internal_error( @@ -170,6 +178,10 @@ impl DataStore { .filter(dsl::old_dataset_id.eq(region_snapshot.dataset_id)) .filter(dsl::old_region_id.eq(region_snapshot.region_id)) .filter(dsl::old_snapshot_id.eq(region_snapshot.snapshot_id)) + .filter( + dsl::replacement_type + .eq(ReadOnlyTargetReplacementType::RegionSnapshot), + ) .get_result_async::( &*self.pool_connection_authorized(opctx).await?, ) @@ -1374,6 +1386,160 @@ impl DataStore { None => public_error_from_diesel(e, ErrorHandler::Server), }) } + + pub async fn read_only_target_deleted( + &self, + request: &RegionSnapshotReplacement, + ) -> Result { + let deleted = match request.replacement_type() { + ReadOnlyTargetReplacement::RegionSnapshot { + dataset_id, + region_id, + snapshot_id, + } => self + .region_snapshot_get(dataset_id.into(), region_id, snapshot_id) + .await? + .is_none(), + + ReadOnlyTargetReplacement::ReadOnlyRegion { region_id } => { + self.get_region_optional(region_id).await?.is_none() + } + }; + + Ok(deleted) + } + + /// Returns Ok(Some(_)) if the read-only target exists and the target + /// address can be determined, Ok(None) if the read-only target does not + /// exist, or Err otherwise. + pub async fn read_only_target_addr( + &self, + request: &RegionSnapshotReplacement, + ) -> Result, Error> { + match request.replacement_type() { + ReadOnlyTargetReplacement::RegionSnapshot { + dataset_id, + region_id, + snapshot_id, + } => { + let region_snapshot = match self + .region_snapshot_get( + dataset_id.into(), + region_id, + snapshot_id, + ) + .await? + { + Some(region_snapshot) => region_snapshot, + None => return Ok(None), + }; + + match region_snapshot.snapshot_addr.parse() { + Ok(addr) => Ok(Some(addr)), + Err(e) => { + Err(Error::internal_error(&format!("parse error: {e}"))) + } + } + } + + ReadOnlyTargetReplacement::ReadOnlyRegion { region_id } => { + let region = match self.get_region_optional(region_id).await? { + Some(region) => region, + None => return Ok(None), + }; + + Ok(self.region_addr(region.id()).await?) + } + } + } + + /// Create and insert a read-only region replacement request, returning the + /// ID of the request. + pub async fn create_read_only_region_replacement_request( + &self, + opctx: &OpContext, + region_id: Uuid, + ) -> Result { + let request = + RegionSnapshotReplacement::new_from_read_only_region(region_id); + let request_id = request.id; + + self.insert_read_only_region_replacement_request(opctx, request) + .await?; + + Ok(request_id) + } + + /// Insert a read-only region replacement request into the DB, also creating + /// the VolumeRepair record. + pub async fn insert_read_only_region_replacement_request( + &self, + opctx: &OpContext, + request: RegionSnapshotReplacement, + ) -> Result<(), Error> { + let ReadOnlyTargetReplacement::ReadOnlyRegion { region_id } = + request.replacement_type() + else { + return Err(Error::internal_error( + "wrong read-only target replacement type", + )); + }; + + let db_region = match self.get_region_optional(region_id).await? { + Some(db_region) => db_region, + None => { + return Err(Error::internal_error( + "cannot perform read-only region replacement without \ + getting volume id", + )); + } + }; + + if !db_region.read_only() { + return Err(Error::internal_error( + "read-only region replacement requires read-only region", + )); + } + + let maybe_snapshot = self + .find_snapshot_by_volume_id(&opctx, db_region.volume_id()) + .await?; + + if maybe_snapshot.is_none() { + return Err(Error::internal_error( + "read-only region replacement requires snapshot volume", + )); + } + + self.insert_region_snapshot_replacement_request_with_volume_id( + opctx, + request, + db_region.volume_id(), + ) + .await + } + + /// Find a read-only region replacement request + pub async fn lookup_read_only_region_replacement_request( + &self, + opctx: &OpContext, + region_id: Uuid, + ) -> Result, Error> { + use db::schema::region_snapshot_replacement::dsl; + + dsl::region_snapshot_replacement + .filter(dsl::old_region_id.eq(region_id)) + .filter( + dsl::replacement_type + .eq(ReadOnlyTargetReplacementType::ReadOnlyRegion), + ) + .get_result_async::( + &*self.pool_connection_authorized(opctx).await?, + ) + .await + .optional() + .map_err(|e| public_error_from_diesel(e, ErrorHandler::Server)) + } } #[cfg(test)] @@ -1416,13 +1582,13 @@ mod test { .await .unwrap(); - let request_1 = RegionSnapshotReplacement::new( + let request_1 = RegionSnapshotReplacement::new_from_region_snapshot( dataset_1_id, region_1_id, snapshot_1_id, ); - let request_2 = RegionSnapshotReplacement::new( + let request_2 = RegionSnapshotReplacement::new_from_region_snapshot( dataset_2_id, region_2_id, snapshot_2_id, @@ -1475,7 +1641,7 @@ mod test { .await .unwrap(); - let request_1 = RegionSnapshotReplacement::new( + let request_1 = RegionSnapshotReplacement::new_from_region_snapshot( dataset_1_id, region_1_id, snapshot_1_id, @@ -1524,8 +1690,11 @@ mod test { .await .unwrap(); - let request = - RegionSnapshotReplacement::new(dataset_id, region_id, snapshot_id); + let request = RegionSnapshotReplacement::new_from_region_snapshot( + dataset_id, + region_id, + snapshot_id, + ); let request_id = request.id; @@ -1840,7 +2009,7 @@ mod test { .await .unwrap(); - let mut request = RegionSnapshotReplacement::new( + let mut request = RegionSnapshotReplacement::new_from_region_snapshot( DatasetUuid::new_v4(), Uuid::new_v4(), Uuid::new_v4(), diff --git a/nexus/db-queries/src/db/datastore/snapshot.rs b/nexus/db-queries/src/db/datastore/snapshot.rs index 607a2cf16ef..a6fe0345ac0 100644 --- a/nexus/db-queries/src/db/datastore/snapshot.rs +++ b/nexus/db-queries/src/db/datastore/snapshot.rs @@ -308,6 +308,23 @@ impl DataStore { } } + pub async fn find_snapshot_by_volume_id( + &self, + opctx: &OpContext, + volume_id: VolumeUuid, + ) -> LookupResult> { + let conn = self.pool_connection_authorized(opctx).await?; + + use db::schema::snapshot::dsl; + dsl::snapshot + .filter(dsl::volume_id.eq(to_db_typed_uuid(volume_id))) + .select(Snapshot::as_select()) + .first_async(&*conn) + .await + .optional() + .map_err(|e| public_error_from_diesel(e, ErrorHandler::Server)) + } + pub async fn find_snapshot_by_destination_volume_id( &self, opctx: &OpContext, diff --git a/nexus/db-queries/src/db/datastore/volume.rs b/nexus/db-queries/src/db/datastore/volume.rs index 63a35a1aa45..7c7afbfce06 100644 --- a/nexus/db-queries/src/db/datastore/volume.rs +++ b/nexus/db-queries/src/db/datastore/volume.rs @@ -3839,6 +3839,40 @@ impl DataStore { Ok(volumes) } + + /// Returns Some(bool) depending on if a read-only target exists in a + /// volume, None if the volume was deleted, or an error otherwise. + pub async fn volume_references_read_only_target( + &self, + volume_id: VolumeUuid, + address: SocketAddrV6, + ) -> LookupResult> { + let Some(volume) = self.volume_get(volume_id).await? else { + return Ok(None); + }; + + let vcr: VolumeConstructionRequest = + match serde_json::from_str(&volume.data()) { + Ok(vcr) => vcr, + + Err(e) => { + return Err(Error::internal_error(&format!( + "cannot deserialize volume data for {}: {e}", + volume.id(), + ))); + } + }; + + let reference = + read_only_target_in_vcr(&vcr, &address).map_err(|e| { + Error::internal_error(&format!( + "cannot deserialize volume data for {}: {e}", + volume.id(), + )) + })?; + + Ok(Some(reference)) + } } // Add some validation that runs only for tests diff --git a/nexus/examples/config-second.toml b/nexus/examples/config-second.toml index c21e470a6d5..9087c06c0c1 100644 --- a/nexus/examples/config-second.toml +++ b/nexus/examples/config-second.toml @@ -143,6 +143,7 @@ region_snapshot_replacement_step.period_secs = 30 region_snapshot_replacement_finish.period_secs = 30 tuf_artifact_replication.period_secs = 300 tuf_artifact_replication.min_sled_replication = 1 +read_only_region_replacement_start.period_secs = 30 [default_region_allocation_strategy] # allocate region on 3 random distinct zpools, on 3 random distinct sleds. diff --git a/nexus/examples/config.toml b/nexus/examples/config.toml index 78a72487c8f..155e61d58d9 100644 --- a/nexus/examples/config.toml +++ b/nexus/examples/config.toml @@ -129,6 +129,7 @@ region_snapshot_replacement_step.period_secs = 30 region_snapshot_replacement_finish.period_secs = 30 tuf_artifact_replication.period_secs = 300 tuf_artifact_replication.min_sled_replication = 1 +read_only_region_replacement_start.period_secs = 30 [default_region_allocation_strategy] # allocate region on 3 random distinct zpools, on 3 random distinct sleds. diff --git a/nexus/src/app/background/init.rs b/nexus/src/app/background/init.rs index eed15a1e5a5..0c9f09dc444 100644 --- a/nexus/src/app/background/init.rs +++ b/nexus/src/app/background/init.rs @@ -108,6 +108,7 @@ use super::tasks::metrics_producer_gc; use super::tasks::nat_cleanup; use super::tasks::phantom_disks; use super::tasks::physical_disk_adoption; +use super::tasks::read_only_region_replacement_start::*; use super::tasks::region_replacement; use super::tasks::region_replacement_driver; use super::tasks::region_snapshot_replacement_finish::*; @@ -180,6 +181,7 @@ pub struct BackgroundTasks { pub task_region_snapshot_replacement_step: Activator, pub task_region_snapshot_replacement_finish: Activator, pub task_tuf_artifact_replication: Activator, + pub task_read_only_region_replacement_start: Activator, // Handles to activate background tasks that do not get used by Nexus // at-large. These background tasks are implementation details as far as @@ -270,6 +272,7 @@ impl BackgroundTasksInitializer { task_region_snapshot_replacement_step: Activator::new(), task_region_snapshot_replacement_finish: Activator::new(), task_tuf_artifact_replication: Activator::new(), + task_read_only_region_replacement_start: Activator::new(), task_internal_dns_propagation: Activator::new(), task_external_dns_propagation: Activator::new(), @@ -339,6 +342,7 @@ impl BackgroundTasksInitializer { task_region_snapshot_replacement_step, task_region_snapshot_replacement_finish, task_tuf_artifact_replication, + task_read_only_region_replacement_start, // Add new background tasks here. Be sure to use this binding in a // call to `Driver::register()` below. That's what actually wires // up the Activator to the corresponding background task. @@ -898,6 +902,20 @@ impl BackgroundTasksInitializer { activator: task_tuf_artifact_replication, }); + driver.register(TaskDefinition { + name: "read_only_region_replacement_start", + description: + "detect if read-only regions need replacement and begin the \ + process", + period: config.read_only_region_replacement_start.period_secs, + task_impl: Box::new(ReadOnlyRegionReplacementDetector::new( + datastore, + )), + opctx: opctx.child(BTreeMap::new()), + watchers: vec![], + activator: task_read_only_region_replacement_start, + }); + driver } } diff --git a/nexus/src/app/background/tasks/mod.rs b/nexus/src/app/background/tasks/mod.rs index add3e47241a..62339a52e70 100644 --- a/nexus/src/app/background/tasks/mod.rs +++ b/nexus/src/app/background/tasks/mod.rs @@ -25,6 +25,7 @@ pub mod nat_cleanup; pub mod networking; pub mod phantom_disks; pub mod physical_disk_adoption; +pub mod read_only_region_replacement_start; pub mod region_replacement; pub mod region_replacement_driver; pub mod region_snapshot_replacement_finish; diff --git a/nexus/src/app/background/tasks/read_only_region_replacement_start.rs b/nexus/src/app/background/tasks/read_only_region_replacement_start.rs new file mode 100644 index 00000000000..a1920e0c43e --- /dev/null +++ b/nexus/src/app/background/tasks/read_only_region_replacement_start.rs @@ -0,0 +1,373 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +//! Background task for detecting read-only regions that need replacing and +//! beginning that process. +//! +//! This task's responsibility is to create replacement requests for read-only +//! regions when physical disks are expunged. The corresponding region snapshot +//! replacement start saga will be triggered by the 'region snapshot replacement +//! start' background task. + +use crate::app::background::BackgroundTask; +use futures::future::BoxFuture; +use futures::FutureExt; +use nexus_db_queries::context::OpContext; +use nexus_db_queries::db::DataStore; +use nexus_types::internal_api::background::ReadOnlyRegionReplacementStartStatus; +use omicron_common::api::external::Error; +use serde_json::json; +use std::sync::Arc; + +pub struct ReadOnlyRegionReplacementDetector { + datastore: Arc, +} + +impl ReadOnlyRegionReplacementDetector { + pub fn new(datastore: Arc) -> Self { + ReadOnlyRegionReplacementDetector { datastore } + } + + /// Find read-only regions on expunged physical disks and create replacement + /// requests for them. + async fn create_requests_for_read_only_regions_on_expunged_disks( + &self, + opctx: &OpContext, + status: &mut ReadOnlyRegionReplacementStartStatus, + ) { + let log = &opctx.log; + + // Find read-only regions on expunged physical disks + let regions_to_be_replaced = match self + .datastore + .find_read_only_regions_on_expunged_physical_disks(opctx) + .await + { + Ok(regions) => regions, + + Err(e) => { + let s = format!( + "find_read_only_regions_on_expunged_physical_disks \ + failed: {e}", + ); + + error!(&log, "{s}"); + status.errors.push(s); + return; + } + }; + + for region in regions_to_be_replaced { + let region_id = region.id(); + + // If no request exists yet, create one. + let existing_request = match self + .datastore + .lookup_read_only_region_replacement_request(opctx, region_id) + .await + { + Ok(existing_request) => existing_request, + + Err(e) => { + let s = + format!("error looking up replacement request: {e}"); + + error!( + &log, + "{s}"; + "region_id" => %region_id, + ); + status.errors.push(s); + continue; + } + }; + + if existing_request.is_none() { + match self + .datastore + .create_read_only_region_replacement_request( + opctx, region_id, + ) + .await + { + Ok(request_id) => { + let s = format!( + "created region snapshot replacement request \ + {request_id}" + ); + + info!( + &log, + "{s}"; + "region_id" => %region_id, + ); + status.requests_created_ok.push(s); + } + + Err(e) => { + match e { + Error::Conflict { message } + if message.external_message() + == "volume repair lock" => + { + // This is not a fatal error! If there are + // competing region replacement and region + // snapshot replacements, then they are both + // attempting to lock volumes. + } + + _ => { + let s = format!( + "error creating replacement request: {e}" + ); + + error!( + &log, + "{s}"; + "region_id" => %region_id, + ); + + status.errors.push(s); + } + } + } + } + } + } + } +} + +impl BackgroundTask for ReadOnlyRegionReplacementDetector { + fn activate<'a>( + &'a mut self, + opctx: &'a OpContext, + ) -> BoxFuture<'a, serde_json::Value> { + async { + let mut status = ReadOnlyRegionReplacementStartStatus::default(); + + self.create_requests_for_read_only_regions_on_expunged_disks( + opctx, + &mut status, + ) + .await; + + json!(status) + } + .boxed() + } +} + +#[cfg(test)] +mod test { + use super::*; + use crate::app::RegionAllocationStrategy; + use crate::app::MIN_DISK_SIZE_BYTES; + use crate::external_api::params; + use chrono::Utc; + use nexus_db_model::BlockSize; + use nexus_db_model::Generation; + use nexus_db_model::PhysicalDiskPolicy; + use nexus_db_model::ReadOnlyTargetReplacement; + use nexus_db_model::Snapshot; + use nexus_db_model::SnapshotIdentity; + use nexus_db_model::SnapshotState; + use nexus_db_queries::authz; + use nexus_db_queries::db::datastore::RegionAllocationFor; + use nexus_db_queries::db::datastore::RegionAllocationParameters; + use nexus_db_queries::db::lookup::LookupPath; + use nexus_test_utils::resource_helpers::create_project; + use nexus_test_utils_macros::nexus_test; + use omicron_common::api::external; + use omicron_uuid_kinds::DatasetUuid; + use omicron_uuid_kinds::GenericUuid; + use omicron_uuid_kinds::VolumeUuid; + use omicron_uuid_kinds::ZpoolUuid; + use sled_agent_client::VolumeConstructionRequest; + use std::collections::BTreeMap; + use uuid::Uuid; + + type ControlPlaneTestContext = + nexus_test_utils::ControlPlaneTestContext; + type DiskTest<'a> = + nexus_test_utils::resource_helpers::DiskTest<'a, crate::Server>; + + #[nexus_test(server = crate::Server)] + async fn test_expunge_disk_causes_read_only_region_replacement_request( + cptestctx: &ControlPlaneTestContext, + ) { + let disk_test = DiskTest::new(cptestctx).await; + + let client = &cptestctx.external_client; + let project = create_project(&client, "testing").await; + let project_id = project.identity.id; + + let nexus = &cptestctx.server.server_context().nexus; + let datastore = nexus.datastore(); + let opctx = OpContext::for_tests( + cptestctx.logctx.log.clone(), + datastore.clone(), + ); + + // Record which datasets map to which zpools for later + + let mut dataset_to_zpool: BTreeMap = + BTreeMap::default(); + + for zpool in disk_test.zpools() { + for dataset in &zpool.datasets { + dataset_to_zpool.insert(zpool.id, dataset.id); + } + } + + let mut task = + ReadOnlyRegionReplacementDetector::new(datastore.clone()); + + // Noop test + let result: ReadOnlyRegionReplacementStartStatus = + serde_json::from_value(task.activate(&opctx).await).unwrap(); + assert_eq!(result, ReadOnlyRegionReplacementStartStatus::default()); + + // Add three read-only regions + + let volume_id = VolumeUuid::new_v4(); + let snapshot_id = Uuid::new_v4(); + + let datasets_and_regions = datastore + .arbitrary_region_allocate( + &opctx, + RegionAllocationFor::SnapshotVolume { volume_id, snapshot_id }, + RegionAllocationParameters::FromDiskSource { + disk_source: ¶ms::DiskSource::Blank { + block_size: params::BlockSize::try_from(512).unwrap(), + }, + size: external::ByteCount::from_gibibytes_u32(1), + }, + &RegionAllocationStrategy::Random { seed: None }, + 3, + ) + .await + .unwrap(); + + assert_eq!(datasets_and_regions.len(), 3); + + for (_, region) in &datasets_and_regions { + assert!(region.read_only()); + } + + // Create the fake snapshot + + let (.., authz_project) = LookupPath::new(&opctx, &datastore) + .project_id(project_id) + .lookup_for(authz::Action::CreateChild) + .await + .unwrap(); + + datastore + .volume_create( + volume_id, + VolumeConstructionRequest::Volume { + id: Uuid::new_v4(), + block_size: 512, + sub_volumes: vec![], + read_only_parent: None, + }, + ) + .await + .unwrap(); + + datastore + .project_ensure_snapshot( + &opctx, + &authz_project, + Snapshot { + identity: SnapshotIdentity { + id: snapshot_id, + name: external::Name::try_from("snapshot".to_string()) + .unwrap() + .into(), + description: "snapshot".into(), + + time_created: Utc::now(), + time_modified: Utc::now(), + time_deleted: None, + }, + + project_id, + disk_id: Uuid::new_v4(), + + volume_id: volume_id.into(), + destination_volume_id: VolumeUuid::new_v4().into(), + + gen: Generation::new(), + state: SnapshotState::Creating, + block_size: BlockSize::Traditional, + + size: external::ByteCount::try_from(MIN_DISK_SIZE_BYTES) + .unwrap() + .into(), + }, + ) + .await + .unwrap(); + + // Expunge one of the physical disks + + let first_zpool = + disk_test.zpools().next().expect("Expected at least one zpool"); + + let (_, db_zpool) = LookupPath::new(&opctx, datastore) + .zpool_id(first_zpool.id.into_untyped_uuid()) + .fetch() + .await + .unwrap(); + + datastore + .physical_disk_update_policy( + &opctx, + db_zpool.physical_disk_id.into(), + PhysicalDiskPolicy::Expunged, + ) + .await + .unwrap(); + + // Activate the task - it should pick that up and create a replacement + // request for the read-only region on that expunged disk + + let result: ReadOnlyRegionReplacementStartStatus = + serde_json::from_value(task.activate(&opctx).await).unwrap(); + + eprintln!("{:?}", &result); + + assert_eq!(result.requests_created_ok.len(), 1); + assert!(result.errors.is_empty()); + + // The last part of the message is the replacement request id + let request_created_uuid: Uuid = result.requests_created_ok[0] + .split(" ") + .last() + .unwrap() + .parse() + .unwrap(); + + let request = datastore + .get_region_snapshot_replacement_request_by_id( + &opctx, + request_created_uuid, + ) + .await + .unwrap(); + + let ReadOnlyTargetReplacement::ReadOnlyRegion { + region_id: replacement_region_id, + } = request.replacement_type() + else { + panic!("wrong type!"); + }; + + let expunged_dataset_id = + dataset_to_zpool.get(&first_zpool.id).unwrap(); + let region = datastore.get_region(replacement_region_id).await.unwrap(); + assert_eq!(*expunged_dataset_id, region.dataset_id()); + } +} diff --git a/nexus/src/app/background/tasks/region_snapshot_replacement_finish.rs b/nexus/src/app/background/tasks/region_snapshot_replacement_finish.rs index 7633f483452..8aadcf36490 100644 --- a/nexus/src/app/background/tasks/region_snapshot_replacement_finish.rs +++ b/nexus/src/app/background/tasks/region_snapshot_replacement_finish.rs @@ -104,49 +104,45 @@ impl RegionSnapshotReplacementFinishDetector { }; if count == 0 { - // If the region snapshot has been deleted, then the snapshot - // replacement is done: the reference number went to zero and it - // was deleted, therefore there aren't any volumes left that - // reference it! - match self - .datastore - .region_snapshot_get( - request.old_dataset_id.into(), - request.old_region_id, - request.old_snapshot_id, - ) - .await - { - Ok(Some(_)) => { + // If the region snapshot or read-only region has been deleted, + // then the snapshot replacement is done: the reference number + // went to zero and it was deleted, therefore there aren't any + // volumes left that reference it! + + let request_id = request.id; + + match self.datastore.read_only_target_deleted(&request).await { + Ok(true) => { + // gone! + } + + Ok(false) => { + // not deleted yet info!( &log, - "region snapshot still exists"; - "request.old_dataset_id" => %request.old_dataset_id, - "request.old_region_id" => %request.old_region_id, - "request.old_snapshot_id" => %request.old_snapshot_id, + "read-only target still exists"; + "request_id" => %request_id, + request.replacement_type() ); continue; } - Ok(None) => { - // gone! - } - Err(e) => { let s = format!( - "error querying for region snapshot {} {} {}: {e}", - request.old_dataset_id, - request.old_region_id, - request.old_snapshot_id, + "error querying for read-only target deletion: {e}", + ); + error!( + &log, + "{s}"; + "request_id" => %request_id, + request.replacement_type() ); - error!(&log, "{s}"); status.errors.push(s); - continue; } - }; + } - let request_id = request.id; + let replacement = request.replacement_type(); match self.send_finish_request(opctx, request).await { Ok(()) => { @@ -155,7 +151,7 @@ impl RegionSnapshotReplacementFinishDetector { {request_id}" ); - info!(&log, "{s}"); + info!(&log, "{s}"; replacement); status.finish_invoked_ok.push(s); } @@ -164,7 +160,7 @@ impl RegionSnapshotReplacementFinishDetector { "invoking region snapshot replacement finish for \ {request_id} failed: {e}", ); - error!(&log, "{s}"); + error!(&log, "{s}"; replacement); status.errors.push(s); } } @@ -237,8 +233,11 @@ mod test { // Do not add the fake region snapshot to the database, as it should // have been deleted by the time the request transitions to "Running" - let request = - RegionSnapshotReplacement::new(dataset_id, region_id, snapshot_id); + let request = RegionSnapshotReplacement::new_from_region_snapshot( + dataset_id, + region_id, + snapshot_id, + ); let request_id = request.id; diff --git a/nexus/src/app/background/tasks/region_snapshot_replacement_garbage_collect.rs b/nexus/src/app/background/tasks/region_snapshot_replacement_garbage_collect.rs index 1da86c2fccf..9e76cd4daf6 100644 --- a/nexus/src/app/background/tasks/region_snapshot_replacement_garbage_collect.rs +++ b/nexus/src/app/background/tasks/region_snapshot_replacement_garbage_collect.rs @@ -86,9 +86,10 @@ impl RegionSnapshotReplacementGarbageCollect { for request in requests { let request_id = request.id; + let replacement = request.replacement_type(); let result = - self.send_garbage_collect_request(opctx, request.clone()).await; + self.send_garbage_collect_request(opctx, request).await; match result { Ok(()) => { @@ -97,13 +98,7 @@ impl RegionSnapshotReplacementGarbageCollect { ok for {request_id}" ); - info!( - &log, - "{s}"; - "request.snapshot_id" => %request.old_snapshot_id, - "request.region_id" => %request.old_region_id, - "request.dataset_id" => %request.old_dataset_id, - ); + info!(&log, "{s}"; replacement); status.garbage_collect_requested.push(s); } @@ -112,13 +107,7 @@ impl RegionSnapshotReplacementGarbageCollect { "sending region snapshot replacement garbage collect \ request failed: {e}", ); - error!( - &log, - "{s}"; - "request.snapshot_id" => %request.old_snapshot_id, - "request.region_id" => %request.old_region_id, - "request.dataset_id" => %request.old_dataset_id, - ); + error!(&log, "{s}"; replacement); status.errors.push(s); } } @@ -190,7 +179,7 @@ mod test { // Add two region snapshot requests that need garbage collection - let mut request = RegionSnapshotReplacement::new( + let mut request = RegionSnapshotReplacement::new_from_region_snapshot( DatasetUuid::new_v4(), Uuid::new_v4(), Uuid::new_v4(), @@ -223,7 +212,7 @@ mod test { .await .unwrap(); - let mut request = RegionSnapshotReplacement::new( + let mut request = RegionSnapshotReplacement::new_from_region_snapshot( DatasetUuid::new_v4(), Uuid::new_v4(), Uuid::new_v4(), diff --git a/nexus/src/app/background/tasks/region_snapshot_replacement_start.rs b/nexus/src/app/background/tasks/region_snapshot_replacement_start.rs index 8edbef80e6d..c7eb449312e 100644 --- a/nexus/src/app/background/tasks/region_snapshot_replacement_start.rs +++ b/nexus/src/app/background/tasks/region_snapshot_replacement_start.rs @@ -19,6 +19,7 @@ use crate::app::sagas::NexusSaga; use crate::app::RegionAllocationStrategy; use futures::future::BoxFuture; use futures::FutureExt; +use nexus_db_model::ReadOnlyTargetReplacement; use nexus_db_model::RegionSnapshotReplacement; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::DataStore; @@ -86,6 +87,12 @@ impl RegionSnapshotReplacementDetector { }; for region_snapshot in region_snapshots_to_be_replaced { + let replacement = ReadOnlyTargetReplacement::RegionSnapshot { + dataset_id: region_snapshot.dataset_id, + region_id: region_snapshot.region_id, + snapshot_id: region_snapshot.snapshot_id, + }; + // If no request exists yet, create one. let existing_request = match self .datastore @@ -101,13 +108,7 @@ impl RegionSnapshotReplacementDetector { let s = format!("error looking up replacement request: {e}"); - error!( - &log, - "{s}"; - "snapshot_id" => %region_snapshot.snapshot_id, - "region_id" => %region_snapshot.region_id, - "dataset_id" => %region_snapshot.dataset_id, - ); + error!(&log, "{s}"; replacement); status.errors.push(s); continue; } @@ -128,13 +129,7 @@ impl RegionSnapshotReplacementDetector { {request_id}" ); - info!( - &log, - "{s}"; - "snapshot_id" => %region_snapshot.snapshot_id, - "region_id" => %region_snapshot.region_id, - "dataset_id" => %region_snapshot.dataset_id, - ); + info!(&log, "{s}"; replacement); status.requests_created_ok.push(s); } @@ -155,14 +150,7 @@ impl RegionSnapshotReplacementDetector { "error creating replacement request: {e}" ); - error!( - &log, - "{s}"; - "snapshot_id" => %region_snapshot.snapshot_id, - "region_id" => %region_snapshot.region_id, - "dataset_id" => %region_snapshot.dataset_id, - ); - + error!(&log, "{s}"; replacement); status.errors.push(s); } } @@ -201,38 +189,32 @@ impl RegionSnapshotReplacementDetector { for request in requests { let request_id = request.id; + let replacement = request.replacement_type(); - // If the region snapshot is gone, then there are no more references - // in any volume, and the whole region snapshot replacement can be - // fast-tracked to Complete. + // If the region snapshot or read-only region is gone, then there + // are no more references in any volume, and the whole region + // snapshot replacement can be fast-tracked to Complete. - let maybe_region_snapshot = match self - .datastore - .region_snapshot_get( - request.old_dataset_id.into(), - request.old_region_id, - request.old_snapshot_id, - ) - .await - { - Ok(maybe_region_snapshot) => maybe_region_snapshot, + let deleted = + match self.datastore.read_only_target_deleted(&request).await { + Ok(deleted) => deleted, - Err(e) => { - let s = format!("query for region snapshot failed: {e}"); - - error!( - &log, - "{s}"; - "request.snapshot_id" => %request.old_snapshot_id, - "request.region_id" => %request.old_region_id, - "request.dataset_id" => %request.old_dataset_id, - ); - status.errors.push(s); - return; - } - }; + Err(e) => { + let s = format!( + "error querying for read-only target deletion: {e}", + ); + error!( + &log, + "{s}"; + "request_id" => %request_id, + replacement + ); + status.errors.push(s); + continue; + } + }; - if maybe_region_snapshot.is_none() { + if deleted { match self .datastore .set_region_snapshot_replacement_complete_from_requested( @@ -245,17 +227,18 @@ impl RegionSnapshotReplacementDetector { "region snapshot replacement {request_id} \ completed ok" ); - info!(&log, "{s}"); + info!(&log, "{s}"; replacement); status.requests_completed_ok.push(s); } Err(e) => { let s = format!( - "query to set region snapshot request state \ - to complete failed: {e}" + "query to set region snapshot request {request_id} \ + state to complete failed: {e}" ); - error!(&log, "{s}"; "request.id" => %request_id); + error!(&log, "{s}"; replacement); + status.errors.push(s); } } @@ -266,7 +249,7 @@ impl RegionSnapshotReplacementDetector { let result = self .send_start_request( authn::saga::Serialized::for_opctx(opctx), - request.clone(), + request, ) .await; @@ -277,13 +260,7 @@ impl RegionSnapshotReplacementDetector { {request_id}" ); - info!( - &log, - "{s}"; - "request.snapshot_id" => %request.old_snapshot_id, - "request.region_id" => %request.old_region_id, - "request.dataset_id" => %request.old_dataset_id, - ); + info!(&log, "{s}"; replacement); status.start_invoked_ok.push(s); } @@ -293,13 +270,7 @@ impl RegionSnapshotReplacementDetector { {request_id} failed: {e}", ); - error!( - &log, - "{s}"; - "request.snapshot_id" => %request.old_snapshot_id, - "request.region_id" => %request.old_region_id, - "request.dataset_id" => %request.old_dataset_id, - ); + error!(&log, "{s}"; replacement); status.errors.push(s); } } @@ -342,6 +313,7 @@ mod test { use nexus_db_model::BlockSize; use nexus_db_model::Generation; use nexus_db_model::PhysicalDiskPolicy; + use nexus_db_model::ReadOnlyTargetReplacement; use nexus_db_model::RegionSnapshot; use nexus_db_model::RegionSnapshotReplacement; use nexus_db_model::Snapshot; @@ -404,8 +376,11 @@ mod test { datastore.region_snapshot_create(region_snapshot).await.unwrap(); - let request = - RegionSnapshotReplacement::new(dataset_id, region_id, snapshot_id); + let request = RegionSnapshotReplacement::new_from_region_snapshot( + dataset_id, + region_id, + snapshot_id, + ); let request_id = request.id; @@ -623,12 +598,21 @@ mod test { .await .unwrap(); - assert_eq!(request.old_snapshot_id, snapshot_id); - assert_eq!(request.old_region_id, region_id); + let ReadOnlyTargetReplacement::RegionSnapshot { + dataset_id: replacement_dataset_id, + region_id: replacement_region_id, + snapshot_id: replacement_snapshot_id, + } = request.replacement_type() + else { + panic!("wrong type!"); + }; + + assert_eq!(replacement_snapshot_id, snapshot_id); + assert_eq!(replacement_region_id, region_id); let dataset_id = dataset_to_zpool.get(&first_zpool.id.to_string()).unwrap(); - assert_eq!(&request.old_dataset_id.to_string(), dataset_id); + assert_eq!(&replacement_dataset_id.to_string(), dataset_id); } #[nexus_test(server = crate::Server)] @@ -679,8 +663,11 @@ mod test { .await .unwrap(); - let request = - RegionSnapshotReplacement::new(dataset_id, region_id, snapshot_id); + let request = RegionSnapshotReplacement::new_from_region_snapshot( + dataset_id, + region_id, + snapshot_id, + ); let request_id = request.id; diff --git a/nexus/src/app/background/tasks/region_snapshot_replacement_step.rs b/nexus/src/app/background/tasks/region_snapshot_replacement_step.rs index dc1649cf5a2..fb9c27e5c9a 100644 --- a/nexus/src/app/background/tasks/region_snapshot_replacement_step.rs +++ b/nexus/src/app/background/tasks/region_snapshot_replacement_step.rs @@ -133,15 +133,15 @@ impl RegionSnapshotReplacementFindAffected { match result { Ok(()) => { let s = format!( - "region snapshot replacement step garbage \ - collect request ok for {request_id}" + "region snapshot replacement step garbage collect \ + request ok for {request_id}" ); info!( &log, "{s}"; - "request.volume_id" => %request.volume_id(), - "request.old_snapshot_volume_id" => ?request.old_snapshot_volume_id(), + "volume_id" => %request.volume_id(), + "old_snapshot_volume_id" => ?request.old_snapshot_volume_id(), ); status.step_garbage_collect_invoked_ok.push(s); } @@ -154,8 +154,8 @@ impl RegionSnapshotReplacementFindAffected { error!( &log, "{s}"; - "request.volume_id" => %request.volume_id(), - "request.old_snapshot_volume_id" => ?request.old_snapshot_volume_id(), + "volume_id" => %request.volume_id(), + "old_snapshot_volume_id" => ?request.old_snapshot_volume_id(), ); status.errors.push(s); } @@ -202,65 +202,48 @@ impl RegionSnapshotReplacementFindAffected { }; for request in requests { - // Find all volumes that reference the replaced snapshot - let region_snapshot = match self - .datastore - .region_snapshot_get( - request.old_dataset_id.into(), - request.old_region_id, - request.old_snapshot_id, - ) - .await - { - Ok(Some(region_snapshot)) => region_snapshot, - - Ok(None) => { - // If the associated region snapshot was deleted, then there - // are no more volumes that reference it. This is not an - // error! Continue processing the other requests. - let s = format!( - "region snapshot {} {} {} not found", - request.old_dataset_id, - request.old_region_id, - request.old_snapshot_id, - ); - info!(&log, "{s}"); - - continue; - } - - Err(e) => { - let s = format!( - "error querying for region snapshot {} {} {}: {e}", - request.old_dataset_id, - request.old_region_id, - request.old_snapshot_id, - ); - error!(&log, "{s}"); - status.errors.push(s); - - continue; - } - }; - - let snapshot_addr = match region_snapshot.snapshot_addr.parse() { - Ok(addr) => addr, + let replacement = request.replacement_type(); + + // Find all volumes that reference the replaced read-only target + let target_addr = + match self.datastore.read_only_target_addr(&request).await { + Ok(Some(address)) => address, + + Ok(None) => { + // If the associated region snapshot or read-only region was + // deleted, then there are no more volumes that reference + // it. This is not an error! Continue processing the other + // requests. + let s = format!( + "read-only target for {} not found", + request.id, + ); + info!(&log, "{s}"; replacement); - Err(e) => { - let s = format!( - "region snapshot addr {} could not be parsed: {e}", - region_snapshot.snapshot_addr, - ); - error!(&log, "{s}"); - status.errors.push(s); + continue; + } - continue; - } - }; + Err(e) => { + let s = format!( + "error querying for read-only target address: {e}", + ); + error!( + &log, + "{s}"; + "request_id" => %request.id, + replacement, + ); + status.errors.push(s); + continue; + } + }; let volumes = match self .datastore - .find_volumes_referencing_socket_addr(&opctx, snapshot_addr) + .find_volumes_referencing_socket_addr( + &opctx, + target_addr.into(), + ) .await { Ok(volumes) => volumes, @@ -271,6 +254,7 @@ impl RegionSnapshotReplacementFindAffected { log, "{s}"; "request id" => ?request.id, + replacement ); status.errors.push(s); @@ -293,16 +277,16 @@ impl RegionSnapshotReplacementFindAffected { // step records are created for some volume id, and a null old // snapshot volume id: // - // volume_id: references snapshot_addr + // volume_id: references target_addr // old_snapshot_volume_id: null // // The region snapshot replacement step saga will create a - // volume to stash the reference to snapshot_addr, and then call - // `volume_replace_snapshot`. This will swap snapshot_addr + // volume to stash the reference to target_addr, and then call + // `volume_replace_snapshot`. This will swap target_addr // reference into the old snapshot volume for later deletion: // - // volume_id: does _not_ reference snapshot_addr anymore - // old_snapshot_volume_id: now references snapshot_addr + // volume_id: does _not_ reference target_addr anymore + // old_snapshot_volume_id: now references target_addr // // If `find_volumes_referencing_socket_addr` is executed before // that volume is deleted, it will return the old snapshot @@ -312,8 +296,8 @@ impl RegionSnapshotReplacementFindAffected { // Allowing a region snapshot replacement step record to be // created in this case would mean that (depending on when the // functions execute), an indefinite amount of work would be - // created, continually "moving" the snapshot_addr from - // temporary volume to temporary volume. + // created, continually "moving" the target_addr from temporary + // volume to temporary volume. // // If the volume was soft deleted, then skip making a step for // it. @@ -325,6 +309,7 @@ impl RegionSnapshotReplacementFindAffected { it"; "request id" => ?request.id, "volume id" => ?volume.id(), + &replacement, ); continue; @@ -347,6 +332,7 @@ impl RegionSnapshotReplacementFindAffected { "{s}"; "request id" => ?request.id, "volume id" => ?volume.id(), + &replacement ); status.step_records_created_ok.push(s); } @@ -357,19 +343,12 @@ impl RegionSnapshotReplacementFindAffected { "step already exists for volume id"; "request id" => ?request.id, "volume id" => ?volume.id(), + &replacement ); } }, Err(e) => { - let s = format!("error creating step request: {e}"); - warn!( - log, - "{s}"; - "request id" => ?request.id, - "volume id" => ?volume.id(), - ); - match e { Error::Conflict { message } if message.external_message() @@ -382,6 +361,17 @@ impl RegionSnapshotReplacementFindAffected { } _ => { + let s = + format!("error creating step request: {e}"); + + error!( + log, + "{s}"; + "request id" => ?request.id, + "volume id" => ?volume.id(), + &replacement + ); + status.errors.push(s); } } @@ -448,18 +438,125 @@ impl RegionSnapshotReplacementFindAffected { } }; - if volume_deleted { - // Volume was soft or hard deleted, so proceed with clean up, - // which if this is in state Requested there won't be any - // additional associated state, so transition the record to + // Also check if the read-only target is still present in the + // volume: if the read-only parent was removed (eg. after a + // completed scrub), then this step request could now be invalid. + // + // Also note: if that read-only parent removal removed the last + // reference to the read-only target, then it will be deleted. + + let associated_replacement_request = match self + .datastore + .get_region_snapshot_replacement_request_by_id( + opctx, + request.request_id, + ) + .await + { + Ok(request) => request, + + Err(e) => { + // Nexus deleted the request before all the steps were + // done?! + let s = format!( + "error looking up region snapshot replacement {}: \ + {e}", + request.request_id, + ); + error!(log, "{s}"); + status.errors.push(s); + + // Continue on to other steps + continue; + } + }; + + let maybe_target_address = match self + .datastore + .read_only_target_addr(&associated_replacement_request) + .await + { + Ok(maybe_target_address) => maybe_target_address, + + Err(e) => { + let s = format!( + "error looking up read-only target address: {e}" + ); + error!(log, "{s}"; "request_id" => %request.request_id); + status.errors.push(s); + + continue; + } + }; + + let target_still_referenced = + if let Some(target_address) = &maybe_target_address { + match self + .datastore + .volume_references_read_only_target( + request.volume_id(), + *target_address, + ) + .await + { + Ok(maybe_referenced) => maybe_referenced.unwrap_or({ + // This means that the volume was deleted! + false + }), + + Err(e) => { + let s = format!( + "error determining if volume reference exists:\ + {e}" + ); + error!( + log, + "{s}"; + "request_id" => %request.request_id, + ); + status.errors.push(s); + + continue; + } + } + } else { + // Note: if in this branch, then the below + // `step_invalidated` check will already trip for + // maybe_target_address.is_none(). + + false + }; + + let step_invalidated = volume_deleted + || maybe_target_address.is_none() + || !target_still_referenced; + + if step_invalidated { + // The replacement step was somehow invalidated, so proceed with + // clean up, which if this is in state Requested there won't be + // any additional associated state, so transition the record to // Completed. info!( &log, - "request {} step {} volume {} was soft or hard deleted!", + "request {} step {} {}", request.request_id, request_step_id, - request.volume_id, + if volume_deleted { + format!( + "volume {} was soft or hard deleted!", + request.volume_id, + ) + } else if maybe_target_address.is_none() { + String::from("associated read-only target was deleted") + } else if !target_still_referenced { + format!( + "volume {} no longer references target", + request.volume_id, + ) + } else { + String::from("UNKNOWN") + } ); let result = self @@ -671,8 +768,11 @@ mod test { datastore.region_snapshot_create(fake_region_snapshot).await.unwrap(); - let request = - RegionSnapshotReplacement::new(dataset_id, region_id, snapshot_id); + let request = RegionSnapshotReplacement::new_from_region_snapshot( + dataset_id, + region_id, + snapshot_id, + ); let request_id = request.id; diff --git a/nexus/src/app/sagas/region_snapshot_replacement_garbage_collect.rs b/nexus/src/app/sagas/region_snapshot_replacement_garbage_collect.rs index 5eb85b76735..0192f6ca04e 100644 --- a/nexus/src/app/sagas/region_snapshot_replacement_garbage_collect.rs +++ b/nexus/src/app/sagas/region_snapshot_replacement_garbage_collect.rs @@ -274,7 +274,7 @@ pub(crate) mod test { .await .unwrap(); - let mut request = RegionSnapshotReplacement::new( + let mut request = RegionSnapshotReplacement::new_from_region_snapshot( DatasetUuid::new_v4(), Uuid::new_v4(), Uuid::new_v4(), diff --git a/nexus/src/app/sagas/region_snapshot_replacement_start.rs b/nexus/src/app/sagas/region_snapshot_replacement_start.rs index f4486311b62..e302caa80db 100644 --- a/nexus/src/app/sagas/region_snapshot_replacement_start.rs +++ b/nexus/src/app/sagas/region_snapshot_replacement_start.rs @@ -62,6 +62,7 @@ use crate::app::sagas::common_storage::find_only_new_region; use crate::app::sagas::declare_saga_actions; use crate::app::RegionAllocationStrategy; use crate::app::{authn, db}; +use nexus_db_model::ReadOnlyTargetReplacement; use nexus_db_queries::db::datastore::NewRegionVolumeId; use nexus_db_queries::db::datastore::OldSnapshotVolumeId; use nexus_types::identity::Resource; @@ -96,6 +97,9 @@ declare_saga_actions! { + rsrss_set_saga_id - rsrss_set_saga_id_undo } + GET_REQUEST_SNAPSHOT_AND_REGION_ID -> "snapshot_and_region_id" { + + rsrss_get_snapshot_and_region_id + } GET_CLONE_SOURCE -> "clone_source" { + rsrss_get_clone_source } @@ -202,6 +206,7 @@ impl NexusSaga for SagaRegionSnapshotReplacementStart { )); builder.append(set_saga_id_action()); + builder.append(get_request_snapshot_and_region_id_action()); builder.append(get_clone_source_action()); builder.append(get_alloc_region_params_action()); builder.append(alloc_new_region_action()); @@ -280,6 +285,61 @@ enum CloneSource { Region { region_id: Uuid }, } +async fn rsrss_get_snapshot_and_region_id( + sagactx: NexusActionContext, +) -> Result<(Uuid, Uuid), ActionError> { + let params = sagactx.saga_params::()?; + let osagactx = sagactx.user_data(); + + let opctx = crate::context::op_context_for_saga_action( + &sagactx, + ¶ms.serialized_authn, + ); + + let (snapshot_id, region_id) = match params.request.replacement_type() { + ReadOnlyTargetReplacement::RegionSnapshot { + region_id, + snapshot_id, + .. + } => (snapshot_id, region_id), + + ReadOnlyTargetReplacement::ReadOnlyRegion { region_id } => { + let Some(region) = osagactx + .datastore() + .get_region_optional(region_id) + .await + .map_err(ActionError::action_failed)? + else { + return Err(ActionError::action_failed(Error::internal_error( + &format!("region {region_id} deleted"), + ))); + }; + + let maybe_snapshot = osagactx + .datastore() + .find_snapshot_by_volume_id(&opctx, region.volume_id()) + .await + .map_err(ActionError::action_failed)?; + + match maybe_snapshot { + Some(snapshot) => (snapshot.id(), region.id()), + + None => { + return Err(ActionError::action_failed( + Error::internal_error(&format!( + "region {} volume {} deleted", + region.id(), + region.volume_id(), + )), + )); + } + } + } + }; + + Ok((snapshot_id, region_id)) +} + async fn rsrss_get_clone_source( sagactx: NexusActionContext, ) -> Result { @@ -323,6 +383,9 @@ async fn rsrss_get_clone_source( // reason behind this. The region snapshots and read-only regions will have // identical contents. + let (snapshot_id, _) = + sagactx.lookup::<(Uuid, Uuid)>("snapshot_and_region_id")?; + // First, try to select another region snapshot that's part of this // snapshot. @@ -333,27 +396,38 @@ async fn rsrss_get_clone_source( let mut non_expunged_region_snapshots = osagactx .datastore() - .find_non_expunged_region_snapshots( - &opctx, - params.request.old_snapshot_id, - ) + .find_non_expunged_region_snapshots(&opctx, snapshot_id) .await .map_err(ActionError::action_failed)?; - // Filter out the request's region snapshot - if there are no other - // candidates, this could be chosen later in this function. + // Filter out the request's region snapshot, if appropriate - if there are + // no other candidates, this could be chosen later in this function, but it + // may be experiencing problems and shouldn't be the first choice for a + // clone source. + + match params.request.replacement_type() { + ReadOnlyTargetReplacement::RegionSnapshot { + dataset_id, + region_id, + snapshot_id, + } => { + non_expunged_region_snapshots.retain(|rs| { + !(rs.dataset_id == dataset_id + && rs.region_id == region_id + && rs.snapshot_id == snapshot_id) + }); + } - non_expunged_region_snapshots.retain(|rs| { - !(rs.dataset_id == params.request.old_dataset_id - && rs.region_id == params.request.old_region_id - && rs.snapshot_id == params.request.old_snapshot_id) - }); + ReadOnlyTargetReplacement::ReadOnlyRegion { .. } => { + // no-op + } + } if let Some(candidate) = non_expunged_region_snapshots.pop() { info!( log, "found another non-expunged region snapshot"; - "snapshot_id" => %params.request.old_snapshot_id, + "snapshot_id" => %snapshot_id, "dataset_id" => %candidate.dataset_id, "region_id" => %candidate.region_id, ); @@ -370,22 +444,19 @@ async fn rsrss_get_clone_source( info!( log, "no region snapshot clone source candidates"; - "snapshot_id" => %params.request.old_snapshot_id, + "snapshot_id" => %snapshot_id, ); // Look up the existing snapshot let maybe_db_snapshot = osagactx .datastore() - .snapshot_get(&opctx, params.request.old_snapshot_id) + .snapshot_get(&opctx, snapshot_id) .await .map_err(ActionError::action_failed)?; let Some(db_snapshot) = maybe_db_snapshot else { return Err(ActionError::action_failed(Error::internal_error( - &format!( - "snapshot {} was hard deleted!", - params.request.old_snapshot_id - ), + &format!("snapshot {} was hard deleted!", snapshot_id), ))); }; @@ -395,11 +466,23 @@ async fn rsrss_get_clone_source( .await .map_err(ActionError::action_failed)?; + // Filter out the request's region, if appropriate. + + match params.request.replacement_type() { + ReadOnlyTargetReplacement::RegionSnapshot { .. } => { + // no-op + } + + ReadOnlyTargetReplacement::ReadOnlyRegion { region_id } => { + non_expunged_read_only_regions.retain(|r| r.id() != region_id); + } + } + if let Some(candidate) = non_expunged_read_only_regions.pop() { info!( log, "found region clone source candidate"; - "snapshot_id" => %params.request.old_snapshot_id, + "snapshot_id" => %snapshot_id, "dataset_id" => %candidate.dataset_id(), "region_id" => %candidate.id(), ); @@ -408,26 +491,69 @@ async fn rsrss_get_clone_source( } // If no other non-expunged region snapshot or read-only region exists, then - // check if the request's region snapshot is non-expunged. This will use the - // region snapshot that is being replaced as a clone source, which may not - // work if there's a problem with that region snapshot that this replacement - // request is meant to fix! + // check if the request's read-only target is non-expunged. This will use + // the region snapshot or read-only region that is being replaced as a clone + // source, which may not work if there's a problem with it that this + // replacement request is meant to fix! + + match params.request.replacement_type() { + ReadOnlyTargetReplacement::RegionSnapshot { + dataset_id, + region_id, + .. + } => { + let request_dataset_on_in_service_physical_disk = osagactx + .datastore() + .crucible_dataset_physical_disk_in_service(dataset_id.into()) + .await + .map_err(ActionError::action_failed)?; - let request_dataset_on_in_service_physical_disk = osagactx - .datastore() - .crucible_dataset_physical_disk_in_service( - params.request.old_dataset_id.into(), - ) - .await - .map_err(ActionError::action_failed)?; + if request_dataset_on_in_service_physical_disk { + // If the request region snapshot's dataset has not been + // expunged, it can be used - if request_dataset_on_in_service_physical_disk { - // If the request region snapshot's dataset has not been expunged, it - // can be used - return Ok(CloneSource::RegionSnapshot { - dataset_id: params.request.old_dataset_id.into(), - region_id: params.request.old_region_id, - }); + info!( + log, + "using request region snapshot as clone source candidate" + ); + + return Ok(CloneSource::RegionSnapshot { + dataset_id: dataset_id.into(), + region_id, + }); + } + } + + ReadOnlyTargetReplacement::ReadOnlyRegion { region_id } => { + let Some(region) = osagactx + .datastore() + .get_region_optional(region_id) + .await + .map_err(ActionError::action_failed)? + else { + return Err(ActionError::action_failed(Error::internal_error( + &format!("region {region_id} deleted"), + ))); + }; + + let request_dataset_on_in_service_physical_disk = osagactx + .datastore() + .crucible_dataset_physical_disk_in_service(region.dataset_id()) + .await + .map_err(ActionError::action_failed)?; + + if request_dataset_on_in_service_physical_disk { + // If the request read-only region's dataset has not been + // expunged, it can be used. + + info!( + log, + "using request read-only region as clone source candidate" + ); + + return Ok(CloneSource::Region { region_id }); + } + } } // If all targets of a Volume::Region are on expunged datasets, then the @@ -435,7 +561,7 @@ async fn rsrss_get_clone_source( return Err(ActionError::action_failed(format!( "no clone source candidate for {}!", - params.request.old_snapshot_id, + snapshot_id, ))); } @@ -462,25 +588,26 @@ async fn rsrss_get_alloc_region_params( ); // Look up the existing snapshot + + let (snapshot_id, region_id) = + sagactx.lookup::<(Uuid, Uuid)>("snapshot_and_region_id")?; + let maybe_db_snapshot = osagactx .datastore() - .snapshot_get(&opctx, params.request.old_snapshot_id) + .snapshot_get(&opctx, snapshot_id) .await .map_err(ActionError::action_failed)?; let Some(db_snapshot) = maybe_db_snapshot else { return Err(ActionError::action_failed(Error::internal_error( - &format!( - "snapshot {} was hard deleted!", - params.request.old_snapshot_id - ), + &format!("snapshot {} was hard deleted!", snapshot_id), ))); }; // Find the region to replace let db_region = osagactx .datastore() - .get_region(params.request.old_region_id) + .get_region(region_id) .await .map_err(ActionError::action_failed)?; @@ -613,7 +740,6 @@ async fn rsrss_new_region_ensure( (nexus_db_model::CrucibleDataset, crucible_agent_client::types::Region), ActionError, > { - let params = sagactx.saga_params::()?; let osagactx = sagactx.user_data(); let log = osagactx.log(); @@ -622,24 +748,22 @@ async fn rsrss_new_region_ensure( "new_dataset_and_region", )?; + let (snapshot_id, _) = + sagactx.lookup::<(Uuid, Uuid)>("snapshot_and_region_id")?; let clone_source = sagactx.lookup::("clone_source")?; let mut source_repair_addr: SocketAddrV6 = match clone_source { CloneSource::RegionSnapshot { dataset_id, region_id } => { let region_snapshot = osagactx .datastore() - .region_snapshot_get( - dataset_id, - region_id, - params.request.old_snapshot_id, - ) + .region_snapshot_get(dataset_id, region_id, snapshot_id) .await .map_err(ActionError::action_failed)?; let Some(region_snapshot) = region_snapshot else { return Err(ActionError::action_failed(format!( "region snapshot {} {} {} deleted!", - dataset_id, region_id, params.request.old_snapshot_id, + dataset_id, region_id, snapshot_id, ))); }; @@ -806,19 +930,19 @@ async fn rsrss_get_old_snapshot_volume_id( ¶ms.serialized_authn, ); + let (snapshot_id, _) = + sagactx.lookup::<(Uuid, Uuid)>("snapshot_and_region_id")?; + // Look up the existing snapshot let maybe_db_snapshot = osagactx .datastore() - .snapshot_get(&opctx, params.request.old_snapshot_id) + .snapshot_get(&opctx, snapshot_id) .await .map_err(ActionError::action_failed)?; let Some(db_snapshot) = maybe_db_snapshot else { return Err(ActionError::action_failed(Error::internal_error( - &format!( - "snapshot {} was hard deleted!", - params.request.old_snapshot_id - ), + &format!("snapshot {} was hard deleted!", snapshot_id), ))); }; @@ -892,7 +1016,7 @@ async fn rsrss_create_fake_volume_undo( #[derive(Debug)] struct ReplaceParams { old_volume_id: VolumeUuid, - old_snapshot_address: SocketAddrV6, + old_target_address: SocketAddrV6, new_region_address: SocketAddrV6, new_volume_id: VolumeUuid, } @@ -905,37 +1029,20 @@ async fn get_replace_params( let new_volume_id = sagactx.lookup::("new_volume_id")?; - let region_snapshot = osagactx + let Some(old_target_address) = osagactx .datastore() - .region_snapshot_get( - params.request.old_dataset_id.into(), - params.request.old_region_id, - params.request.old_snapshot_id, - ) + .read_only_target_addr(¶ms.request) .await - .map_err(ActionError::action_failed)?; - - let Some(region_snapshot) = region_snapshot else { + .map_err(ActionError::action_failed)? + else { + // This is ok - the next background task invocation will move the + // request state forward appropriately. return Err(ActionError::action_failed(format!( - "region snapshot {} {} {} deleted!", - params.request.old_dataset_id, - params.request.old_region_id, - params.request.old_snapshot_id, + "request {} target deleted!", + params.request.id, ))); }; - let old_snapshot_address: SocketAddrV6 = - match region_snapshot.snapshot_addr.parse() { - Ok(addr) => addr, - - Err(e) => { - return Err(ActionError::action_failed(format!( - "parsing {} as SocketAddrV6 failed: {e}", - region_snapshot.snapshot_addr, - ))); - } - }; - let (new_dataset, ensured_region) = sagactx.lookup::<( db::model::CrucibleDataset, @@ -957,7 +1064,7 @@ async fn get_replace_params( // will swap the existing and replacement target Ok(ReplaceParams { old_volume_id, - old_snapshot_address, + old_target_address, new_region_address, new_volume_id, }) @@ -974,7 +1081,7 @@ async fn rsrss_replace_snapshot_in_volume( info!( log, "replacing {} with {} in volume {}", - replacement_params.old_snapshot_address, + replacement_params.old_target_address, replacement_params.new_region_address, replacement_params.old_volume_id, ); @@ -985,7 +1092,7 @@ async fn rsrss_replace_snapshot_in_volume( .datastore() .volume_replace_snapshot( VolumeWithTarget(replacement_params.old_volume_id), - ExistingTarget(replacement_params.old_snapshot_address), + ExistingTarget(replacement_params.old_target_address), ReplacementTarget(replacement_params.new_region_address), VolumeToDelete(replacement_params.new_volume_id), ) @@ -1035,7 +1142,7 @@ async fn rsrss_replace_snapshot_in_volume_undo( info!( log, "undo: replacing {} with {} in volume {}", - replacement_params.old_snapshot_address, + replacement_params.old_target_address, replacement_params.new_region_address, replacement_params.old_volume_id, ); @@ -1051,7 +1158,7 @@ async fn rsrss_replace_snapshot_in_volume_undo( .volume_replace_snapshot( VolumeWithTarget(replacement_params.old_volume_id), ExistingTarget(replacement_params.new_region_address), - ReplacementTarget(replacement_params.old_snapshot_address), + ReplacementTarget(replacement_params.old_target_address), VolumeToDelete(replacement_params.new_volume_id), ) .await?; diff --git a/nexus/src/app/sagas/region_snapshot_replacement_step.rs b/nexus/src/app/sagas/region_snapshot_replacement_step.rs index 849c410f4e1..a9382431d45 100644 --- a/nexus/src/app/sagas/region_snapshot_replacement_step.rs +++ b/nexus/src/app/sagas/region_snapshot_replacement_step.rs @@ -200,7 +200,7 @@ async fn rsrss_set_saga_id_undo( #[derive(Debug, Serialize, Deserialize)] struct ReplaceParams { - old_snapshot_address: SocketAddrV6, + old_target_address: SocketAddrV6, new_region_address: SocketAddrV6, } @@ -227,37 +227,20 @@ async fn rsrss_create_replace_params( .await .map_err(ActionError::action_failed)?; - let region_snapshot = osagactx + let Some(old_target_address) = osagactx .datastore() - .region_snapshot_get( - region_snapshot_replace_request.old_dataset_id.into(), - region_snapshot_replace_request.old_region_id, - region_snapshot_replace_request.old_snapshot_id, - ) + .read_only_target_addr(®ion_snapshot_replace_request) .await - .map_err(ActionError::action_failed)?; - - let Some(region_snapshot) = region_snapshot else { + .map_err(ActionError::action_failed)? + else { + // This is ok - the next background task invocation will move the + // request state forward appropriately. return Err(ActionError::action_failed(format!( - "region snapshot {} {} {} deleted!", - region_snapshot_replace_request.old_dataset_id, - region_snapshot_replace_request.old_region_id, - region_snapshot_replace_request.old_snapshot_id, + "request {} target deleted!", + region_snapshot_replace_request.id, ))); }; - let old_snapshot_address: SocketAddrV6 = - match region_snapshot.snapshot_addr.parse() { - Ok(addr) => addr, - - Err(e) => { - return Err(ActionError::action_failed(format!( - "parsing {} as SocketAddrV6 failed: {e}", - region_snapshot.snapshot_addr, - ))); - } - }; - let Some(new_region_id) = region_snapshot_replace_request.new_region_id else { return Err(ActionError::action_failed(format!( @@ -272,7 +255,7 @@ async fn rsrss_create_replace_params( .await .map_err(ActionError::action_failed)?; - Ok(ReplaceParams { old_snapshot_address, new_region_address }) + Ok(ReplaceParams { old_target_address, new_region_address }) } async fn rssrs_create_fake_volume( @@ -351,7 +334,7 @@ async fn rsrss_replace_snapshot_in_volume( .datastore() .volume_replace_snapshot( VolumeWithTarget(params.request.volume_id()), - ExistingTarget(replace_params.old_snapshot_address), + ExistingTarget(replace_params.old_target_address), ReplacementTarget(replace_params.new_region_address), VolumeToDelete(new_volume_id), ) @@ -397,7 +380,7 @@ async fn rsrss_replace_snapshot_in_volume_undo( .volume_replace_snapshot( VolumeWithTarget(params.request.volume_id()), ExistingTarget(replace_params.new_region_address), - ReplacementTarget(replace_params.old_snapshot_address), + ReplacementTarget(replace_params.old_target_address), VolumeToDelete(new_volume_id), ) .await?; diff --git a/nexus/test-utils/src/background.rs b/nexus/test-utils/src/background.rs index b01046543bf..3a293dfd51c 100644 --- a/nexus/test-utils/src/background.rs +++ b/nexus/test-utils/src/background.rs @@ -61,7 +61,7 @@ pub async fn wait_background_task( Err(CondCheckError::<()>::NotYet) } }, - &Duration::from_millis(500), + &Duration::from_millis(50), &Duration::from_secs(60), ) .await @@ -150,7 +150,7 @@ pub async fn activate_background_task( Err(CondCheckError::<()>::NotYet) } }, - &Duration::from_millis(500), + &Duration::from_millis(50), &Duration::from_secs(60), ) .await @@ -346,34 +346,52 @@ pub async fn run_region_snapshot_replacement_finish( status.finish_invoked_ok.len() } -/// Run all replacement related background tasks until they aren't doing -/// anything anymore. -pub async fn run_replacement_tasks_to_completion( +/// Run the read_only_region_replacement_start background task, returning how +/// many actions were taken +pub async fn run_read_only_region_replacement_start( internal_client: &ClientTestContext, -) { - wait_for_condition( - || async { - let actions_taken = - // region replacement related - run_region_replacement(internal_client).await + - run_region_replacement_driver(internal_client).await + - // region snapshot replacement related - run_region_snapshot_replacement_start(internal_client).await + - run_region_snapshot_replacement_garbage_collection(internal_client).await + - run_region_snapshot_replacement_step(internal_client).await + - run_region_snapshot_replacement_finish(internal_client).await; - - if actions_taken > 0 { - Err(CondCheckError::<()>::NotYet) - } else { - Ok(()) - } - }, - &Duration::from_secs(1), - &Duration::from_secs(60), +) -> usize { + let last_background_task = activate_background_task( + &internal_client, + "read_only_region_replacement_start", ) - .await - .unwrap(); + .await; + + let LastResult::Completed(last_result_completed) = + last_background_task.last + else { + panic!( + "unexpected {:?} returned from read_only_region_replacement_start \ + task", + last_background_task.last, + ); + }; + + let status = + serde_json::from_value::( + last_result_completed.details, + ) + .unwrap(); + + assert!(status.errors.is_empty()); + + status.requests_created_ok.len() +} + +/// Run all replacement related background tasks and return how many actions +/// were taken. +pub async fn run_all_crucible_replacement_tasks( + internal_client: &ClientTestContext, +) -> usize { + // region replacement related + run_region_replacement(internal_client).await + + run_region_replacement_driver(internal_client).await + + // region snapshot replacement related + run_region_snapshot_replacement_start(internal_client).await + + run_region_snapshot_replacement_garbage_collection(internal_client).await + + run_region_snapshot_replacement_step(internal_client).await + + run_region_snapshot_replacement_finish(internal_client).await + + run_read_only_region_replacement_start(internal_client).await } pub async fn wait_tuf_artifact_replication_step( diff --git a/nexus/tests/config.test.toml b/nexus/tests/config.test.toml index 634a98c8937..1aa20e4b3d1 100644 --- a/nexus/tests/config.test.toml +++ b/nexus/tests/config.test.toml @@ -161,6 +161,7 @@ region_snapshot_replacement_finish.period_secs = 60 tuf_artifact_replication.period_secs = 3600 # Update integration tests are started with 4 sled agents. tuf_artifact_replication.min_sled_replication = 3 +read_only_region_replacement_start.period_secs = 60 [default_region_allocation_strategy] # we only have one sled in the test environment, so we need to use the diff --git a/nexus/tests/integration_tests/crucible_replacements.rs b/nexus/tests/integration_tests/crucible_replacements.rs index c97cfefeddc..b4bdcd3c558 100644 --- a/nexus/tests/integration_tests/crucible_replacements.rs +++ b/nexus/tests/integration_tests/crucible_replacements.rs @@ -4,12 +4,17 @@ //! Tests related to region and region snapshot replacement +use async_bb8_diesel::AsyncRunQueryDsl; +use diesel::ExpressionMethods; +use diesel::QueryDsl; use dropshot::test_util::ClientTestContext; use nexus_client::types::LastResult; use nexus_db_model::PhysicalDiskPolicy; +use nexus_db_model::ReadOnlyTargetReplacement; use nexus_db_model::RegionReplacementState; use nexus_db_model::RegionSnapshotReplacementState; use nexus_db_queries::context::OpContext; +use nexus_db_queries::db; use nexus_db_queries::db::datastore::region_snapshot_replacement::*; use nexus_db_queries::db::lookup::LookupPath; use nexus_db_queries::db::DataStore; @@ -26,6 +31,7 @@ use nexus_test_utils_macros::nexus_test; use nexus_types::external_api::params; use nexus_types::external_api::views; use nexus_types::identity::Asset; +use nexus_types::identity::Resource; use nexus_types::internal_api::background::*; use omicron_common::api::external; use omicron_common::api::external::IdentityMetadataCreateParams; @@ -86,6 +92,76 @@ where .all_items } +async fn replacements_left(datastore: &DataStore) -> i64 { + let conn = datastore.pool_connection_for_tests().await.unwrap(); + + let region_replacement_left = { + use db::schema::region_replacement::dsl; + + dsl::region_replacement + .filter(dsl::replacement_state.ne(RegionReplacementState::Complete)) + .select(diesel::dsl::count_star()) + .first_async::(&*conn) + .await + .unwrap() + }; + + let region_snapshot_replacement_left = { + use db::schema::region_snapshot_replacement::dsl; + + dsl::region_snapshot_replacement + .filter( + dsl::replacement_state + .ne(RegionSnapshotReplacementState::Complete), + ) + .select(diesel::dsl::count_star()) + .first_async::(&*conn) + .await + .unwrap() + }; + + region_replacement_left + region_snapshot_replacement_left +} + +pub(crate) async fn wait_for_all_replacements( + datastore: &Arc, + internal_client: &ClientTestContext, +) { + wait_for_condition( + || { + let datastore = datastore.clone(); + + async move { + // Trigger all the replacement related background tasks. If + // there were actions taken, continually activate the tasks to + // push the replacements forward. + // + // If no actions were taken and no replacements are left, we are + // done waiting. `replacements_left` should only be called after + // `run_all_crucible_replacement_tasks`, as that could create + // more replacements. + + let actions_taken = + run_all_crucible_replacement_tasks(internal_client).await; + + if actions_taken > 0 { + return Err(CondCheckError::<()>::NotYet); + } + + if replacements_left(&datastore).await == 0 { + return Ok(()); + } + + Err(CondCheckError::<()>::NotYet) + } + }, + &std::time::Duration::from_millis(50), + &std::time::Duration::from_secs(60), + ) + .await + .expect("all replacements finished"); +} + /// Assert that the first part of region replacement does not create a freed /// crucible region (that would be picked up by a volume delete saga) #[nexus_test] @@ -275,7 +351,8 @@ mod region_replacement { pub async fn finish_test(&self) { // Make sure that all the background tasks can run to completion. - run_replacement_tasks_to_completion(&self.internal_client).await; + wait_for_all_replacements(&self.datastore, &self.internal_client) + .await; // Assert the request is in state Complete @@ -294,7 +371,6 @@ mod region_replacement { ); // Assert there are no more Crucible resources - assert!(self.disk_test.crucible_resources_deleted().await); } @@ -357,27 +433,30 @@ mod region_replacement { } } }, - &std::time::Duration::from_millis(500), + &std::time::Duration::from_millis(50), &std::time::Duration::from_secs(60), ) .await .expect("request transitioned to expected state"); - // Assert the request state + // Assert the request state (if the expected start state is + // different from the expected end state) - let region_replacement = self - .datastore - .get_region_replacement_request_by_id( - &self.opctx(), - self.replacement_request_id, - ) - .await - .unwrap(); + if expected_start_state.0 != expected_end_state.0 { + let region_replacement = self + .datastore + .get_region_replacement_request_by_id( + &self.opctx(), + self.replacement_request_id, + ) + .await + .unwrap(); - assert_eq!( - region_replacement.replacement_state, - expected_end_state.0 - ); + assert_eq!( + region_replacement.replacement_state, + expected_end_state.0 + ); + } } /// Run the "region replacement" task to transition the request to @@ -451,8 +530,8 @@ mod region_replacement { } } }, - &std::time::Duration::from_millis(500), - &std::time::Duration::from_secs(10), + &std::time::Duration::from_millis(50), + &std::time::Duration::from_secs(30), ) .await .expect("most recent step"); @@ -775,7 +854,7 @@ async fn test_racing_replacements_for_soft_deleted_disk_volume( } } }, - &std::time::Duration::from_millis(500), + &std::time::Duration::from_millis(50), &std::time::Duration::from_secs(20), ) .await @@ -825,7 +904,7 @@ async fn test_racing_replacements_for_soft_deleted_disk_volume( } } }, - &std::time::Duration::from_millis(500), + &std::time::Duration::from_millis(50), &std::time::Duration::from_secs(20), ) .await @@ -837,15 +916,19 @@ async fn test_racing_replacements_for_soft_deleted_disk_volume( .unwrap(); assert_eq!(region_snapshot_replacements.len(), 1); - assert_eq!( - region_snapshot_replacements[0].old_dataset_id, - dataset.id().into() - ); - assert_eq!(region_snapshot_replacements[0].old_region_id, region.id()); - assert_eq!( - region_snapshot_replacements[0].old_snapshot_id, - snapshot.identity.id - ); + + let ReadOnlyTargetReplacement::RegionSnapshot { + dataset_id: replacement_dataset_id, + region_id: replacement_region_id, + snapshot_id: replacement_snapshot_id, + } = region_snapshot_replacements[0].replacement_type() + else { + panic!("wrong replacement type!"); + }; + + assert_eq!(replacement_dataset_id, dataset.id().into()); + assert_eq!(replacement_region_id, region.id()); + assert_eq!(replacement_snapshot_id, snapshot.identity.id); assert_eq!( region_snapshot_replacements[0].replacement_state, RegionSnapshotReplacementState::ReplacementDone, @@ -906,7 +989,7 @@ async fn test_racing_replacements_for_soft_deleted_disk_volume( } } }, - &std::time::Duration::from_millis(500), + &std::time::Duration::from_millis(50), &std::time::Duration::from_secs(60), ) .await @@ -1003,7 +1086,7 @@ async fn test_racing_replacements_for_soft_deleted_disk_volume( } } }, - &std::time::Duration::from_millis(500), + &std::time::Duration::from_millis(50), &std::time::Duration::from_secs(60), ) .await @@ -1065,7 +1148,7 @@ async fn test_racing_replacements_for_soft_deleted_disk_volume( } } }, - &std::time::Duration::from_millis(500), + &std::time::Duration::from_millis(50), &std::time::Duration::from_secs(60), ) .await @@ -1096,7 +1179,7 @@ async fn test_racing_replacements_for_soft_deleted_disk_volume( // Make sure that all the background tasks can run to completion. - run_replacement_tasks_to_completion(&internal_client).await; + wait_for_all_replacements(datastore, &internal_client).await; // The disk volume should be deleted by the snapshot delete: wait until this // happens @@ -1115,8 +1198,8 @@ async fn test_racing_replacements_for_soft_deleted_disk_volume( } } }, - &std::time::Duration::from_millis(500), - &std::time::Duration::from_secs(10), + &std::time::Duration::from_millis(50), + &std::time::Duration::from_secs(30), ) .await .expect("disk volume deleted"); @@ -1334,42 +1417,11 @@ mod region_snapshot_replacement { pub async fn finish_test(&self) { // Make sure that all the background tasks can run to completion. - run_replacement_tasks_to_completion(&self.internal_client).await; + wait_for_all_replacements(&self.datastore, &self.internal_client) + .await; // Assert the request is in state Complete - wait_for_condition( - || { - let datastore = self.datastore.clone(); - let opctx = self.opctx(); - let replacement_request_id = self.replacement_request_id; - - async move { - let region_replacement = datastore - .get_region_snapshot_replacement_request_by_id( - &opctx, - replacement_request_id, - ) - .await - .unwrap(); - - let state = region_replacement.replacement_state; - - if state == RegionSnapshotReplacementState::Complete { - // The saga transitioned the request ok - Ok(()) - } else { - // The saga is still running - Err(CondCheckError::<()>::NotYet) - } - } - }, - &std::time::Duration::from_millis(500), - &std::time::Duration::from_secs(10), - ) - .await - .expect("request transitioned to expected state"); - let region_snapshot_replacement = self .datastore .get_region_snapshot_replacement_request_by_id( @@ -1445,7 +1497,7 @@ mod region_snapshot_replacement { } } }, - &std::time::Duration::from_millis(500), + &std::time::Duration::from_millis(50), &std::time::Duration::from_secs(60), ) .await @@ -1555,6 +1607,51 @@ mod region_snapshot_replacement { } } } + + pub async fn assert_read_only_target_gone(&self) { + let region_snapshot_replace_request = self + .datastore + .get_region_snapshot_replacement_request_by_id( + &self.opctx(), + self.replacement_request_id, + ) + .await + .unwrap(); + + assert!(self + .datastore + .read_only_target_addr(®ion_snapshot_replace_request) + .await + .unwrap() + .is_none()); + } + + pub async fn remove_disk_from_snapshot_rop(&self) { + let disk_url = get_disk_url("disk-from-snapshot"); + + let disk_from_snapshot: external::Disk = + NexusRequest::object_get(&self.client, &disk_url) + .authn_as(AuthnMode::PrivilegedUser) + .execute() + .await + .unwrap() + .parsed_body() + .unwrap(); + + let disk_id = disk_from_snapshot.identity.id; + + // Note: `make_request` needs a type here, otherwise rustc cannot + // figure out the type of the `request_body` parameter + self.internal_client + .make_request::( + http::Method::POST, + &format!("/disk/{disk_id}/remove-read-only-parent"), + None, + http::StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + } } } @@ -1740,6 +1837,86 @@ async fn test_delete_volume_region_snapshot_replacement_step( test_harness.assert_no_crucible_resources_leaked().await; } +/// Assert that a region snapshot replacement step can still transition to +/// VolumeDeleted if the volume-remove-read-only-parent fires _after_ the step +/// was created. +#[nexus_test(extra_sled_agents = 3)] +async fn test_region_snapshot_replacement_step_after_rop_remove( + cptestctx: &ControlPlaneTestContext, +) { + let test_harness = + region_snapshot_replacement::DeletedVolumeTest::new(cptestctx).await; + + // The request leaves the above `new` function in state Requested: + // - transition the request to "ReplacementDone" + // - transition the request to "Running" + // - manually create a region snapshot replacement step for the disk created + // from the snapshot + // - invoke the volume-remove-read-only-parent saga, which will delete the + // region snapshot + // - finally, call finish_test + + test_harness.transition_request_to_replacement_done().await; + test_harness.transition_request_to_running().await; + + test_harness.create_manual_region_snapshot_replacement_step().await; + + // Remove the ROP of the disk created from the snapshot + test_harness.remove_disk_from_snapshot_rop().await; + + // Now the volume doesn't reference the read-only target but the step + // request still exists. + test_harness.finish_test().await; + + // Delete the resources, and assert there are no more Crucible resources + test_harness.delete_the_disk().await; + test_harness.delete_the_snapshot().await; + test_harness.delete_the_disk_from_snapshot().await; + + test_harness.assert_no_crucible_resources_leaked().await; +} + +/// Assert that a region snapshot replacement step can still transition to +/// VolumeDeleted if the volume-remove-read-only-parent fires _after_ the step +/// was created and the read-only target is gone. +#[nexus_test(extra_sled_agents = 3)] +async fn test_region_snapshot_replacement_step_after_rop_remove_target_gone( + cptestctx: &ControlPlaneTestContext, +) { + let test_harness = + region_snapshot_replacement::DeletedVolumeTest::new(cptestctx).await; + + // The request leaves the above `new` function in state Requested: + // - transition the request to "ReplacementDone" + // - transition the request to "Running" + // - manually create a region snapshot replacement step for the disk created + // from the snapshot + // - delete the disk and snapshot + // - invoke the volume-remove-read-only-parent saga, which will delete the + // region snapshot + // - finally, call finish_test + + test_harness.transition_request_to_replacement_done().await; + test_harness.transition_request_to_running().await; + + test_harness.create_manual_region_snapshot_replacement_step().await; + test_harness.delete_the_disk().await; + test_harness.delete_the_snapshot().await; + + // Remove the ROP of the disk created from the snapshot + test_harness.remove_disk_from_snapshot_rop().await; + test_harness.assert_read_only_target_gone().await; + + // Now the region snapshot is gone but the step request still exists. + + test_harness.finish_test().await; + + // Delete the final resource, and assert there are no more Crucible + // resources + test_harness.delete_the_disk_from_snapshot().await; + test_harness.assert_no_crucible_resources_leaked().await; +} + /// Tests that replacement can occur until completion #[nexus_test(extra_sled_agents = 3)] async fn test_replacement_sanity(cptestctx: &ControlPlaneTestContext) { @@ -1819,7 +1996,19 @@ async fn test_replacement_sanity(cptestctx: &ControlPlaneTestContext) { // Now, run all replacement tasks to completion let internal_client = &cptestctx.internal_client; - run_replacement_tasks_to_completion(&internal_client).await; + wait_for_all_replacements(&datastore, &internal_client).await; + + // Validate all regions are on non-expunged physical disks + assert!(datastore + .find_read_write_regions_on_expunged_physical_disks(&opctx) + .await + .unwrap() + .is_empty()); + assert!(datastore + .find_read_only_regions_on_expunged_physical_disks(&opctx) + .await + .unwrap() + .is_empty()); } /// Tests that multiple replacements can occur until completion @@ -1913,7 +2102,7 @@ async fn test_region_replacement_triple_sanity( .unwrap(); // Now, run all replacement tasks to completion - run_replacement_tasks_to_completion(&internal_client).await; + wait_for_all_replacements(&datastore, &internal_client).await; } let disk_allocated_regions = @@ -1927,6 +2116,18 @@ async fn test_region_replacement_triple_sanity( // Assert region snapshots replaced with three read-only regions assert_eq!(snapshot_allocated_regions.len(), 3); assert!(snapshot_allocated_regions.iter().all(|(_, r)| r.read_only())); + + // Validate all regions are on non-expunged physical disks + assert!(datastore + .find_read_write_regions_on_expunged_physical_disks(&opctx) + .await + .unwrap() + .is_empty()); + assert!(datastore + .find_read_only_regions_on_expunged_physical_disks(&opctx) + .await + .unwrap() + .is_empty()); } /// Tests that multiple replacements can occur until completion, after expunging @@ -2024,7 +2225,7 @@ async fn test_region_replacement_triple_sanity_2( } // Now, run all replacement tasks to completion - run_replacement_tasks_to_completion(&internal_client).await; + wait_for_all_replacements(&datastore, &internal_client).await; // Expunge the last physical disk { @@ -2052,7 +2253,7 @@ async fn test_region_replacement_triple_sanity_2( } // Now, run all replacement tasks to completion - run_replacement_tasks_to_completion(&internal_client).await; + wait_for_all_replacements(&datastore, &internal_client).await; let disk_allocated_regions = datastore.get_allocated_regions(db_disk.volume_id()).await.unwrap(); @@ -2065,4 +2266,249 @@ async fn test_region_replacement_triple_sanity_2( // Assert region snapshots replaced with three read-only regions assert_eq!(snapshot_allocated_regions.len(), 3); assert!(snapshot_allocated_regions.iter().all(|(_, r)| r.read_only())); + + // Validate all regions are on non-expunged physical disks + assert!(datastore + .find_read_write_regions_on_expunged_physical_disks(&opctx) + .await + .unwrap() + .is_empty()); + assert!(datastore + .find_read_only_regions_on_expunged_physical_disks(&opctx) + .await + .unwrap() + .is_empty()); +} + +/// Tests that replacement can occur until completion twice - meaning region +/// snapshots are replaced with read-only regions, and then read-only regions +/// are replaced with other read-only regions. +#[nexus_test(extra_sled_agents = 3)] +async fn test_replacement_sanity_twice(cptestctx: &ControlPlaneTestContext) { + let nexus = &cptestctx.server.server_context().nexus; + let datastore = nexus.datastore(); + let opctx = + OpContext::for_tests(cptestctx.logctx.log.new(o!()), datastore.clone()); + let internal_client = &cptestctx.internal_client; + + // Create one zpool per sled, each with one dataset. This is required for + // region and region snapshot replacement to have somewhere to move the + // data. + DiskTestBuilder::new(&cptestctx) + .on_all_sleds() + .with_zpool_count(1) + .build() + .await; + + // Any volumes sent to the Pantry for reconciliation should return active + // for this test + cptestctx + .first_sim_server() + .pantry_server + .as_ref() + .unwrap() + .pantry + .set_auto_activate_volumes(); + + // Create a disk and a snapshot and a disk from that snapshot + let client = &cptestctx.external_client; + let _project_id = create_project_and_pool(client).await; + + let disk = create_disk(&client, PROJECT_NAME, "disk").await; + let snapshot = create_snapshot(&client, PROJECT_NAME, "disk", "snap").await; + let _disk_from_snapshot = create_disk_from_snapshot( + &client, + PROJECT_NAME, + "disk-from-snap", + snapshot.identity.id, + ) + .await; + + // Manually create region snapshot replacement requests for each region + // snapshot. + + let (.., db_disk) = LookupPath::new(&opctx, &datastore) + .disk_id(disk.identity.id) + .fetch() + .await + .unwrap(); + + assert_eq!(db_disk.id(), disk.identity.id); + + let disk_allocated_regions = + datastore.get_allocated_regions(db_disk.volume_id()).await.unwrap(); + + for (_, region) in &disk_allocated_regions { + let region_snapshot = datastore + .region_snapshot_get( + region.dataset_id(), + region.id(), + snapshot.identity.id, + ) + .await + .expect("found region snapshot") + .unwrap(); + + datastore + .create_region_snapshot_replacement_request( + &opctx, + ®ion_snapshot, + ) + .await + .unwrap(); + + wait_for_all_replacements(&datastore, &internal_client).await; + } + + // Now, do it again, except this time specifying the read-only regions + + let (.., db_snapshot) = LookupPath::new(&opctx, &datastore) + .snapshot_id(snapshot.identity.id) + .fetch() + .await + .unwrap(); + + assert_eq!(db_snapshot.id(), snapshot.identity.id); + + let snapshot_allocated_regions = + datastore.get_allocated_regions(db_snapshot.volume_id()).await.unwrap(); + + for (_, region) in &snapshot_allocated_regions { + let region = + datastore.get_region(region.id()).await.expect("found region"); + + datastore + .create_read_only_region_replacement_request(&opctx, region.id()) + .await + .unwrap(); + + wait_for_all_replacements(&datastore, &internal_client).await; + } +} + +/// Tests that expunging a sled with read-only regions will lead to them being +/// replaced +#[nexus_test(extra_sled_agents = 3)] +async fn test_read_only_replacement_sanity( + cptestctx: &ControlPlaneTestContext, +) { + let nexus = &cptestctx.server.server_context().nexus; + let datastore = nexus.datastore(); + let opctx = + OpContext::for_tests(cptestctx.logctx.log.new(o!()), datastore.clone()); + let internal_client = &cptestctx.internal_client; + + // Create one zpool per sled, each with one dataset. This is required for + // region and region snapshot replacement to have somewhere to move the + // data. + DiskTestBuilder::new(&cptestctx) + .on_all_sleds() + .with_zpool_count(1) + .build() + .await; + + // Any volumes sent to the Pantry for reconciliation should return active + // for this test + cptestctx + .first_sim_server() + .pantry_server + .as_ref() + .unwrap() + .pantry + .set_auto_activate_volumes(); + + // Create a disk and a snapshot and a disk from that snapshot + let client = &cptestctx.external_client; + let _project_id = create_project_and_pool(client).await; + + let disk = create_disk(&client, PROJECT_NAME, "disk").await; + let snapshot = create_snapshot(&client, PROJECT_NAME, "disk", "snap").await; + let _disk_from_snapshot = create_disk_from_snapshot( + &client, + PROJECT_NAME, + "disk-from-snap", + snapshot.identity.id, + ) + .await; + + // Manually create region snapshot replacement requests for each region + // snapshot. + + let (.., db_disk) = LookupPath::new(&opctx, &datastore) + .disk_id(disk.identity.id) + .fetch() + .await + .unwrap(); + + assert_eq!(db_disk.id(), disk.identity.id); + + let disk_allocated_regions = + datastore.get_allocated_regions(db_disk.volume_id()).await.unwrap(); + + for (_, region) in &disk_allocated_regions { + let region_snapshot = datastore + .region_snapshot_get( + region.dataset_id(), + region.id(), + snapshot.identity.id, + ) + .await + .expect("found region snapshot") + .unwrap(); + + datastore + .create_region_snapshot_replacement_request( + &opctx, + ®ion_snapshot, + ) + .await + .unwrap(); + + wait_for_all_replacements(&datastore, &internal_client).await; + } + + // Now expunge a sled with read-only regions on it. + + let (.., db_snapshot) = LookupPath::new(&opctx, &datastore) + .snapshot_id(snapshot.identity.id) + .fetch() + .await + .unwrap(); + + assert_eq!(db_snapshot.id(), snapshot.identity.id); + + let snapshot_allocated_regions = + datastore.get_allocated_regions(db_snapshot.volume_id()).await.unwrap(); + + let (dataset, region) = &snapshot_allocated_regions[0]; + assert!(region.read_only()); + + let (_, db_zpool) = LookupPath::new(&opctx, datastore) + .zpool_id(dataset.pool_id.into_untyped_uuid()) + .fetch() + .await + .unwrap(); + + datastore + .physical_disk_update_policy( + &opctx, + db_zpool.physical_disk_id.into(), + PhysicalDiskPolicy::Expunged, + ) + .await + .unwrap(); + + wait_for_all_replacements(&datastore, &internal_client).await; + + // Validate all regions are on non-expunged physical disks + assert!(datastore + .find_read_write_regions_on_expunged_physical_disks(&opctx) + .await + .unwrap() + .is_empty()); + assert!(datastore + .find_read_only_regions_on_expunged_physical_disks(&opctx) + .await + .unwrap() + .is_empty()); } diff --git a/nexus/tests/integration_tests/schema.rs b/nexus/tests/integration_tests/schema.rs index fa41d17aa96..39cc532decb 100644 --- a/nexus/tests/integration_tests/schema.rs +++ b/nexus/tests/integration_tests/schema.rs @@ -1554,6 +1554,78 @@ fn after_107_0_0(client: &Client) -> BoxFuture<'_, ()> { ); }) } + +fn before_124_0_0(client: &Client) -> BoxFuture<'_, ()> { + Box::pin(async { + // Insert a region snapshot replacement record + let request_id: Uuid = + "5f867d89-a61f-48cd-ac7d-aecbcb23c2f9".parse().unwrap(); + let dataset_id: Uuid = + "c625d694-185b-4c64-9369-402b7ba1362e".parse().unwrap(); + let region_id: Uuid = + "bda60191-05a0-4881-8bca-0855464ecd9f".parse().unwrap(); + let snapshot_id: Uuid = + "0b8382de-d787-450a-8516-235f33eb0946".parse().unwrap(); + + client + .batch_execute(&format!( + " + INSERT INTO region_snapshot_replacement ( + id, + request_time, + old_dataset_id, + old_region_id, + old_snapshot_id, + old_snapshot_volume_id, + new_region_id, + replacement_state, + operating_saga_id, + new_region_volume_id + ) VALUES ( + '{request_id}', + now(), + '{dataset_id}', + '{region_id}', + '{snapshot_id}', + NULL, + NULL, + 'requested', + NULL, + NULL + );" + )) + .await + .expect("failed to insert record"); + }) +} + +fn after_124_0_0(client: &Client) -> BoxFuture<'_, ()> { + Box::pin(async { + let rows = client + .query( + "SELECT replacement_type FROM region_snapshot_replacement;", + &[], + ) + .await + .expect("failed to load region snapshot replacements"); + + let records = process_rows(&rows); + + assert_eq!(records.len(), 1); + + assert_eq!( + records[0].values, + vec![ColumnValue::new( + "replacement_type", + SqlEnum::from(( + "read_only_target_replacement_type", + "region_snapshot" + )), + )], + "existing region snapshot replacement should have replacement type", + ); + }) +} // Lazily initializes all migration checks. The combination of Rust function // pointers and async makes defining a static table fairly painful, so we're // using lazy initialization instead. @@ -1594,6 +1666,11 @@ fn get_migration_checks() -> BTreeMap { DataMigrationFns { before: Some(before_107_0_0), after: after_107_0_0 }, ); + map.insert( + SemverVersion::new(124, 0, 0), + DataMigrationFns { before: Some(before_124_0_0), after: after_124_0_0 }, + ); + map } diff --git a/nexus/tests/integration_tests/volume_management.rs b/nexus/tests/integration_tests/volume_management.rs index 5219da0ab9f..ba5f41f6631 100644 --- a/nexus/tests/integration_tests/volume_management.rs +++ b/nexus/tests/integration_tests/volume_management.rs @@ -5,6 +5,7 @@ //! Tests that Nexus properly manages and cleans up Crucible resources //! associated with Volumes +use crate::integration_tests::crucible_replacements::wait_for_all_replacements; use crate::integration_tests::sleds::sleds_list; use async_bb8_diesel::AsyncRunQueryDsl; use chrono::Utc; @@ -37,7 +38,6 @@ use nexus_db_queries::db::lookup::LookupPath; use nexus_db_queries::db::pagination::paginated; use nexus_db_queries::db::pagination::Paginator; use nexus_db_queries::db::DataStore; -use nexus_test_utils::background::run_replacement_tasks_to_completion; use nexus_test_utils::http_testing::AuthnMode; use nexus_test_utils::http_testing::NexusRequest; use nexus_test_utils::http_testing::RequestBuilder; @@ -4097,7 +4097,7 @@ async fn test_read_only_region_reference_counting( let (dataset, region) = &allocated_regions[0]; - let request = RegionSnapshotReplacement::new( + let request = RegionSnapshotReplacement::new_from_region_snapshot( dataset.id(), region.id(), snapshot.identity.id, @@ -4108,7 +4108,7 @@ async fn test_read_only_region_reference_counting( .await .unwrap(); - run_replacement_tasks_to_completion(&internal_client).await; + wait_for_all_replacements(datastore, &internal_client).await; // The snapshot's allocated regions should have the one read-only region @@ -4363,7 +4363,7 @@ async fn test_read_only_region_reference_counting_layers( let (dataset, region) = &allocated_regions[0]; - let request = RegionSnapshotReplacement::new( + let request = RegionSnapshotReplacement::new_from_region_snapshot( dataset.id(), region.id(), snapshot.identity.id, @@ -4374,7 +4374,7 @@ async fn test_read_only_region_reference_counting_layers( .await .unwrap(); - run_replacement_tasks_to_completion(&internal_client).await; + wait_for_all_replacements(datastore, &internal_client).await; // Grab the read-only region in the snapshot volume @@ -5611,7 +5611,7 @@ async fn test_double_layer_with_read_only_region_delete( let (dataset, region) = &allocated_regions[0]; - let request = RegionSnapshotReplacement::new( + let request = RegionSnapshotReplacement::new_from_region_snapshot( dataset.id(), region.id(), snapshot.identity.id, @@ -5622,7 +5622,7 @@ async fn test_double_layer_with_read_only_region_delete( .await .unwrap(); - run_replacement_tasks_to_completion(&internal_client).await; + wait_for_all_replacements(datastore, &internal_client).await; assert!(!disk_test.crucible_resources_deleted().await); @@ -5720,7 +5720,7 @@ async fn test_double_layer_snapshot_with_read_only_region_delete_2( let (dataset, region) = &allocated_regions[0]; - let request = RegionSnapshotReplacement::new( + let request = RegionSnapshotReplacement::new_from_region_snapshot( dataset.id(), region.id(), snapshot.identity.id, @@ -5733,7 +5733,7 @@ async fn test_double_layer_snapshot_with_read_only_region_delete_2( .await .unwrap(); - run_replacement_tasks_to_completion(&internal_client).await; + wait_for_all_replacements(datastore, &internal_client).await; wait_for_condition( || { @@ -5760,7 +5760,7 @@ async fn test_double_layer_snapshot_with_read_only_region_delete_2( } } }, - &std::time::Duration::from_millis(500), + &std::time::Duration::from_millis(50), &std::time::Duration::from_secs(60), ) .await @@ -5768,7 +5768,7 @@ async fn test_double_layer_snapshot_with_read_only_region_delete_2( let (dataset, region) = &allocated_regions[1]; - let request = RegionSnapshotReplacement::new( + let request = RegionSnapshotReplacement::new_from_region_snapshot( dataset.id(), region.id(), snapshot.identity.id, @@ -5779,7 +5779,7 @@ async fn test_double_layer_snapshot_with_read_only_region_delete_2( .await .unwrap(); - run_replacement_tasks_to_completion(&internal_client).await; + wait_for_all_replacements(datastore, &internal_client).await; assert!(!disk_test.crucible_resources_deleted().await); @@ -5797,7 +5797,7 @@ async fn test_double_layer_snapshot_with_read_only_region_delete_2( let (dataset, region) = &allocated_regions[2]; - let request = RegionSnapshotReplacement::new( + let request = RegionSnapshotReplacement::new_from_region_snapshot( dataset.id(), region.id(), snapshot.identity.id, @@ -5808,7 +5808,7 @@ async fn test_double_layer_snapshot_with_read_only_region_delete_2( .await .unwrap(); - run_replacement_tasks_to_completion(&internal_client).await; + wait_for_all_replacements(datastore, &internal_client).await; assert!(!disk_test.crucible_resources_deleted().await); diff --git a/nexus/types/src/internal_api/background.rs b/nexus/types/src/internal_api/background.rs index 80b42bcd412..4fe7a418fbb 100644 --- a/nexus/types/src/internal_api/background.rs +++ b/nexus/types/src/internal_api/background.rs @@ -449,3 +449,11 @@ impl slog::KV for DebugDatasetsRendezvousStats { Ok(()) } } + +/// The status of a `read_only_region_replacement_start` background task +/// activation +#[derive(Serialize, Deserialize, Default, Debug, PartialEq, Eq)] +pub struct ReadOnlyRegionReplacementStartStatus { + pub requests_created_ok: Vec, + pub errors: Vec, +} diff --git a/schema/crdb/dbinit.sql b/schema/crdb/dbinit.sql index 08fe84241a9..f186adf7a23 100644 --- a/schema/crdb/dbinit.sql +++ b/schema/crdb/dbinit.sql @@ -1425,11 +1425,18 @@ CREATE TABLE IF NOT EXISTS omicron.public.snapshot ( size_bytes INT NOT NULL ); -CREATE UNIQUE INDEX IF NOT EXISTS lookup_snapshot_by_project ON omicron.public.snapshot ( - project_id, - name -) WHERE - time_deleted IS NULL; +CREATE UNIQUE INDEX IF NOT EXISTS lookup_snapshot_by_project + ON omicron.public.snapshot ( + project_id, + name + ) WHERE + time_deleted IS NULL; + +CREATE INDEX IF NOT EXISTS lookup_snapshot_by_destination_volume_id + ON omicron.public.snapshot ( destination_volume_id ); + +CREATE INDEX IF NOT EXISTS lookup_snapshot_by_volume_id + ON omicron.public.snapshot ( volume_id ); /* * Oximeter collector servers. @@ -4553,8 +4560,6 @@ CREATE INDEX IF NOT EXISTS lookup_any_disk_by_volume_id ON omicron.public.disk ( volume_id ); -CREATE INDEX IF NOT EXISTS lookup_snapshot_by_destination_volume_id ON omicron.public.snapshot ( destination_volume_id ); - CREATE TYPE IF NOT EXISTS omicron.public.region_snapshot_replacement_state AS ENUM ( 'requested', 'allocating', @@ -4565,14 +4570,19 @@ CREATE TYPE IF NOT EXISTS omicron.public.region_snapshot_replacement_state AS EN 'completing' ); +CREATE TYPE IF NOT EXISTS omicron.public.read_only_target_replacement_type AS ENUM ( + 'region_snapshot', + 'read_only_region' +); + CREATE TABLE IF NOT EXISTS omicron.public.region_snapshot_replacement ( id UUID PRIMARY KEY, request_time TIMESTAMPTZ NOT NULL, - old_dataset_id UUID NOT NULL, + old_dataset_id UUID, old_region_id UUID NOT NULL, - old_snapshot_id UUID NOT NULL, + old_snapshot_id UUID, old_snapshot_volume_id UUID, @@ -4582,10 +4592,23 @@ CREATE TABLE IF NOT EXISTS omicron.public.region_snapshot_replacement ( operating_saga_id UUID, - new_region_volume_id UUID + new_region_volume_id UUID, + + replacement_type omicron.public.read_only_target_replacement_type NOT NULL, + + CONSTRAINT proper_replacement_fields CHECK ( + ( + (replacement_type = 'region_snapshot') AND + ((old_dataset_id IS NOT NULL) AND (old_snapshot_id IS NOT NULL)) + ) OR ( + (replacement_type = 'read_only_region') AND + ((old_dataset_id IS NULL) AND (old_snapshot_id IS NULL)) + ) + ) ); -CREATE INDEX IF NOT EXISTS lookup_region_snapshot_replacement_by_state on omicron.public.region_snapshot_replacement (replacement_state); +CREATE INDEX IF NOT EXISTS lookup_region_snapshot_replacement_by_state +ON omicron.public.region_snapshot_replacement (replacement_state); CREATE TYPE IF NOT EXISTS omicron.public.region_snapshot_replacement_step_state AS ENUM ( 'requested', @@ -4831,7 +4854,7 @@ INSERT INTO omicron.public.db_metadata ( version, target_version ) VALUES - (TRUE, NOW(), NOW(), '123.0.0', NULL) + (TRUE, NOW(), NOW(), '124.0.0', NULL) ON CONFLICT DO NOTHING; COMMIT; diff --git a/schema/crdb/support-read-only-region-replacement/up01.sql b/schema/crdb/support-read-only-region-replacement/up01.sql new file mode 100644 index 00000000000..526dbe07f01 --- /dev/null +++ b/schema/crdb/support-read-only-region-replacement/up01.sql @@ -0,0 +1,2 @@ +CREATE INDEX IF NOT EXISTS lookup_snapshot_by_volume_id + ON omicron.public.snapshot ( volume_id ); diff --git a/schema/crdb/support-read-only-region-replacement/up02.sql b/schema/crdb/support-read-only-region-replacement/up02.sql new file mode 100644 index 00000000000..c013f74c98a --- /dev/null +++ b/schema/crdb/support-read-only-region-replacement/up02.sql @@ -0,0 +1,4 @@ +CREATE TYPE IF NOT EXISTS omicron.public.read_only_target_replacement_type AS ENUM ( + 'region_snapshot', + 'read_only_region' +); diff --git a/schema/crdb/support-read-only-region-replacement/up03.sql b/schema/crdb/support-read-only-region-replacement/up03.sql new file mode 100644 index 00000000000..acec13a8fa8 --- /dev/null +++ b/schema/crdb/support-read-only-region-replacement/up03.sql @@ -0,0 +1,2 @@ +ALTER TABLE omicron.public.region_snapshot_replacement + ALTER COLUMN old_dataset_id DROP NOT NULL; diff --git a/schema/crdb/support-read-only-region-replacement/up04.sql b/schema/crdb/support-read-only-region-replacement/up04.sql new file mode 100644 index 00000000000..25023f9b316 --- /dev/null +++ b/schema/crdb/support-read-only-region-replacement/up04.sql @@ -0,0 +1,2 @@ +ALTER TABLE omicron.public.region_snapshot_replacement + ALTER COLUMN old_snapshot_id DROP NOT NULL; diff --git a/schema/crdb/support-read-only-region-replacement/up05.sql b/schema/crdb/support-read-only-region-replacement/up05.sql new file mode 100644 index 00000000000..83ec535a111 --- /dev/null +++ b/schema/crdb/support-read-only-region-replacement/up05.sql @@ -0,0 +1,2 @@ +ALTER TABLE omicron.public.region_snapshot_replacement + ADD COLUMN IF NOT EXISTS replacement_type omicron.public.read_only_target_replacement_type NOT NULL DEFAULT 'region_snapshot'; diff --git a/schema/crdb/support-read-only-region-replacement/up06.sql b/schema/crdb/support-read-only-region-replacement/up06.sql new file mode 100644 index 00000000000..f3b49a109e4 --- /dev/null +++ b/schema/crdb/support-read-only-region-replacement/up06.sql @@ -0,0 +1,2 @@ +ALTER TABLE omicron.public.region_snapshot_replacement + ALTER COLUMN replacement_type DROP DEFAULT; diff --git a/schema/crdb/support-read-only-region-replacement/up07.sql b/schema/crdb/support-read-only-region-replacement/up07.sql new file mode 100644 index 00000000000..e51456ec28e --- /dev/null +++ b/schema/crdb/support-read-only-region-replacement/up07.sql @@ -0,0 +1,9 @@ +ALTER TABLE omicron.public.region_snapshot_replacement ADD CONSTRAINT IF NOT EXISTS proper_replacement_fields CHECK ( + ( + (replacement_type = 'region_snapshot') AND + ((old_dataset_id IS NOT NULL) AND (old_snapshot_id IS NOT NULL)) + ) OR ( + (replacement_type = 'read_only_region') AND + ((old_dataset_id IS NULL) AND (old_snapshot_id IS NULL)) + ) +); diff --git a/smf/nexus/multi-sled/config-partial.toml b/smf/nexus/multi-sled/config-partial.toml index f9b24c663f1..12f587db9a4 100644 --- a/smf/nexus/multi-sled/config-partial.toml +++ b/smf/nexus/multi-sled/config-partial.toml @@ -75,6 +75,7 @@ region_snapshot_replacement_step.period_secs = 30 region_snapshot_replacement_finish.period_secs = 30 tuf_artifact_replication.period_secs = 300 tuf_artifact_replication.min_sled_replication = 3 +read_only_region_replacement_start.period_secs = 30 [default_region_allocation_strategy] # by default, allocate across 3 distinct sleds diff --git a/smf/nexus/single-sled/config-partial.toml b/smf/nexus/single-sled/config-partial.toml index ba951ba4e07..016c5430a47 100644 --- a/smf/nexus/single-sled/config-partial.toml +++ b/smf/nexus/single-sled/config-partial.toml @@ -75,6 +75,7 @@ region_snapshot_replacement_step.period_secs = 30 region_snapshot_replacement_finish.period_secs = 30 tuf_artifact_replication.period_secs = 300 tuf_artifact_replication.min_sled_replication = 1 +read_only_region_replacement_start.period_secs = 30 [default_region_allocation_strategy] # by default, allocate without requirement for distinct sleds. From 95a6a79374a1e1415d50cff299f4ae55f913bb22 Mon Sep 17 00:00:00 2001 From: David Crespo Date: Thu, 13 Feb 2025 12:22:04 -0600 Subject: [PATCH 35/43] Bump web console (fix date parsing) (#7536) https://github.com/oxidecomputer/console/compare/2720e146...7de4b11a * [7de4b11a](https://github.com/oxidecomputer/console/commit/7de4b11a) oxidecomputer/console#2641 * [7548260d](https://github.com/oxidecomputer/console/commit/7548260d) oxidecomputer/console#2690 * [39d166b5](https://github.com/oxidecomputer/console/commit/39d166b5) oxlint: bump, rules of hooks + other react rules * [40048263](https://github.com/oxidecomputer/console/commit/40048263) oxidecomputer/console#2688 --- tools/console_version | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/console_version b/tools/console_version index 1d3cd5e529d..b46740bd862 100644 --- a/tools/console_version +++ b/tools/console_version @@ -1,2 +1,2 @@ -COMMIT="2720e146bccc3ee91bed30c48dc0136638887f96" -SHA2="c313e0ab4d0c63854084effe55f3573623a1289fa42ad01455ee8460251deca1" +COMMIT="7de4b11a043dc026e25a94858d3d89b817622e6d" +SHA2="5a687d1d4607ff13f6060321f8c1526604d92250ef5ddfe2c0f975ae2b942345" From c3770bdff3fd1c71625a9463f0f521d4faa8f3a7 Mon Sep 17 00:00:00 2001 From: "oxide-renovate[bot]" <146848827+oxide-renovate[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 13:45:01 -0800 Subject: [PATCH 36/43] Update hickory-dns monorepo to 0.24.3 (#7539) --- Cargo.lock | 17 ++++++++--------- Cargo.toml | 8 ++++---- workspace-hack/Cargo.toml | 2 -- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5e477021460..64abf6787d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3902,9 +3902,9 @@ checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" [[package]] name = "hickory-client" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "949d2fef0bbdd31a0f6affc6bf390b4a0017492903eff6f7516cb382d9e85536" +checksum = "2ea0169f8b21726527197c7190e5a23b7fd514a3e04f99c571e05631e1f8a9c8" dependencies = [ "cfg-if", "data-encoding", @@ -3945,9 +3945,9 @@ dependencies = [ [[package]] name = "hickory-resolver" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a2e2aba9c389ce5267d31cf1e4dace82390ae276b0b364ea55630b1fa1b44b4" +checksum = "dcf287bde7b776e85d7188e6e5db7cf410a2f9531fe82817eb87feed034c8d14" dependencies = [ "cfg-if", "futures-util", @@ -3966,9 +3966,9 @@ dependencies = [ [[package]] name = "hickory-server" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e6d1c2df0614595224b32479c72dd6fc82c9bda85962907c45fdb95a691489" +checksum = "7b75179158e7267618f0a587d2337f05e9d71ab3cb03ac2bde2ea5969bc65695" dependencies = [ "async-trait", "bytes", @@ -5149,7 +5149,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -7544,7 +7544,6 @@ dependencies = [ "getrandom", "group", "hashbrown 0.15.1", - "heck 0.4.1", "hex", "hickory-proto", "hmac", @@ -11236,7 +11235,7 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", "syn 2.0.96", diff --git a/Cargo.toml b/Cargo.toml index a36c1b0855e..000e7e09ddb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -417,10 +417,10 @@ headers = "0.4.0" heck = "0.5" hex = "0.4.3" hex-literal = "0.4.1" -hickory-client = "0.24.2" -hickory-proto = "0.24.2" -hickory-resolver = "0.24.2" -hickory-server = "0.24.2" +hickory-client = "0.24.3" +hickory-proto = "0.24.3" +hickory-resolver = "0.24.3" +hickory-server = "0.24.3" highway = "1.2.0" hkdf = "0.12.4" http = "1.2.0" diff --git a/workspace-hack/Cargo.toml b/workspace-hack/Cargo.toml index 226c9edbd31..744c3a1f375 100644 --- a/workspace-hack/Cargo.toml +++ b/workspace-hack/Cargo.toml @@ -63,7 +63,6 @@ generic-array = { version = "0.14.7", default-features = false, features = ["mor getrandom = { version = "0.2.15", default-features = false, features = ["js", "rdrand", "std"] } group = { version = "0.13.0", default-features = false, features = ["alloc"] } hashbrown = { version = "0.15.1" } -heck = { version = "0.4.1" } hex = { version = "0.4.3", features = ["serde"] } hickory-proto = { version = "0.24.3", features = ["text-parsing"] } hmac = { version = "0.12.1", default-features = false, features = ["reset"] } @@ -184,7 +183,6 @@ generic-array = { version = "0.14.7", default-features = false, features = ["mor getrandom = { version = "0.2.15", default-features = false, features = ["js", "rdrand", "std"] } group = { version = "0.13.0", default-features = false, features = ["alloc"] } hashbrown = { version = "0.15.1" } -heck = { version = "0.4.1" } hex = { version = "0.4.3", features = ["serde"] } hickory-proto = { version = "0.24.3", features = ["text-parsing"] } hmac = { version = "0.12.1", default-features = false, features = ["reset"] } From 9cd1105b3a263c5bd615c91e5f54d675b7110f70 Mon Sep 17 00:00:00 2001 From: "oxide-renovate[bot]" <146848827+oxide-renovate[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 23:57:26 -0800 Subject: [PATCH 37/43] Update Rust crate diesel to 2.2.7 (#7515) --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 64abf6787d4..01aad6c61a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2383,9 +2383,9 @@ dependencies = [ [[package]] name = "diesel" -version = "2.2.6" +version = "2.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf1bedf64cdb9643204a36dd15b19a6ce8e7aa7f7b105868e9f1fad5ffa7d12" +checksum = "04001f23ba8843dc315804fa324000376084dfb1c30794ff68dd279e6e5696d5" dependencies = [ "bitflags 2.6.0", "byteorder", diff --git a/Cargo.toml b/Cargo.toml index 000e7e09ddb..22e9c9e8d52 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -378,7 +378,7 @@ debug-ignore = "1.0.5" derive_more = "0.99.18" derive-where = "1.2.7" # Having the i-implement-... feature here makes diesel go away from the workspace-hack -diesel = { version = "2.2.6", features = ["i-implement-a-third-party-backend-and-opt-into-breaking-changes", "postgres", "r2d2", "chrono", "serde_json", "network-address", "uuid"] } +diesel = { version = "2.2.7", features = ["i-implement-a-third-party-backend-and-opt-into-breaking-changes", "postgres", "r2d2", "chrono", "serde_json", "network-address", "uuid"] } diesel-dtrace = "0.4.2" dns-server = { path = "dns-server" } dns-server-api = { path = "dns-server-api" } From 92bfabd7bdc036ffb49ce021416a453d9b278d10 Mon Sep 17 00:00:00 2001 From: Rain Date: Fri, 14 Feb 2025 10:38:02 -0800 Subject: [PATCH 38/43] prioritize some slow tests to run first (#7542) I've noticed some tests be really slow, and if we decide to run them at the end can cause the entire suite to take longer. Use nextest's new prioritization feature to run them first. A CI test run: [Before](https://buildomat.eng.oxide.computer/wg/0/details/01JM0MBHDGSK6XN3HBEHCKZGVD/jAmTO9CSgt66QfrBETI1Iu6LV1AmFAagcLSucIFVsgQnRmLG/01JM0MBWCAGBTDYV95YBBH6FHD#S7624): > Summary [2608.012s] 1802 tests run: 1802 passed (23 slow, 1 leaky), 4 skipped [After](https://buildomat.eng.oxide.computer/wg/0/details/01JM1FZ1EJW8WC53MNAXSTQFG4/L4NZVElgTNha3FQe1HR2B9AKEdlEmOBNvbbuuu4BVxtHsTZz/01JM1FZFRZEZZ8PTN4HHYDJSKX#S7626): > Summary [2182.362s] 1802 tests run: 1802 passed (21 slow, 1 leaky), 4 skipped That's an around 400 second speedup -- not bad! There's still some opportunity in parallelizing the ClickHouse cluster tests, but this is good for now. --- .config/nextest.toml | 11 ++++++++++- .github/buildomat/build-and-test.sh | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.config/nextest.toml b/.config/nextest.toml index cc21a442b39..1a3e0497635 100644 --- a/.config/nextest.toml +++ b/.config/nextest.toml @@ -3,7 +3,7 @@ # # The required version should be bumped up if we need new features, performance # improvements or bugfixes that are present in newer versions of nextest. -nextest-version = { required = "0.9.77", recommended = "0.9.86" } +nextest-version = { required = "0.9.91", recommended = "0.9.91" } experimental = ["setup-scripts"] @@ -48,9 +48,18 @@ live-tests = { max-threads = 1 } [profile.default] default-filter = 'all() - package(omicron-live-tests) - package(end-to-end-tests)' +[[profile.default.overrides]] +# These tests are quite slow and can hold up the run, so run them first. +filter = 'package(oximeter-db) and test(=client::tests::test_replicated) + test(test_action_failure_can_unwind)' +priority = 20 + [[profile.default.overrides]] filter = 'package(oximeter-db) and test(replicated) + package(omicron-clickhouse-admin)' test-group = 'clickhouse-cluster' +# client::tests::test_replicated is part of this filter, but it's matched with +# the higher priority (20) first. The other tests in this group are run after +# that. +priority = 10 [[profile.default.overrides]] # These tests can time out under heavy contention. diff --git a/.github/buildomat/build-and-test.sh b/.github/buildomat/build-and-test.sh index 369274eb7a6..da0e7f080fc 100755 --- a/.github/buildomat/build-and-test.sh +++ b/.github/buildomat/build-and-test.sh @@ -18,7 +18,7 @@ target_os=$1 # NOTE: This version should be in sync with the recommended version in # .config/nextest.toml. (Maybe build an automated way to pull the recommended # version in the future.) -NEXTEST_VERSION='0.9.86' +NEXTEST_VERSION='0.9.91' cargo --version rustc --version From faa57693092f63923e32632800c9d9c20a42fb4e Mon Sep 17 00:00:00 2001 From: John Gallagher Date: Fri, 14 Feb 2025 14:39:13 -0500 Subject: [PATCH 39/43] blueprint execution: Make inter-step dependency explicit (#7524) Zone cleanup and saga reassignment both assume that expunged zones in the blueprint are no longer running, which is currently dependent on the earlier `deploy_zones` execution step completing successfully. Add an empty `DeployZonesDone` token to make this dependency explicit. This is a small change with no runtime effect that will prevent us from closing #6999 before we address these steps. --- nexus/reconfigurator/execution/src/lib.rs | 60 +++++++++++-------- .../execution/src/omicron_zones.rs | 26 ++++++-- nexus/reconfigurator/execution/src/sagas.rs | 2 + 3 files changed, 58 insertions(+), 30 deletions(-) diff --git a/nexus/reconfigurator/execution/src/lib.rs b/nexus/reconfigurator/execution/src/lib.rs index 9da8924ada3..40c520dc0a3 100644 --- a/nexus/reconfigurator/execution/src/lib.rs +++ b/nexus/reconfigurator/execution/src/lib.rs @@ -20,6 +20,7 @@ use omicron_physical_disks::DeployDisksDone; use omicron_uuid_kinds::GenericUuid; use omicron_uuid_kinds::OmicronZoneUuid; use omicron_uuid_kinds::SledUuid; +use omicron_zones::DeployZonesDone; use slog::info; use slog_error_chain::InlineErrorChain; use std::collections::BTreeMap; @@ -102,14 +103,6 @@ pub async fn realize_blueprint_with_overrides( blueprint, ); - register_support_bundle_failure_step( - &engine.for_component(ExecutionComponent::SupportBundles), - &opctx, - datastore, - blueprint, - nexus_id, - ); - let sled_list = register_sled_list_step( &engine.for_component(ExecutionComponent::SledList), &opctx, @@ -131,7 +124,7 @@ pub async fn realize_blueprint_with_overrides( sled_list.clone(), ); - register_deploy_zones_step( + let deploy_zones_done = register_deploy_zones_step( &engine.for_component(ExecutionComponent::OmicronZones), &opctx, blueprint, @@ -154,12 +147,13 @@ pub async fn realize_blueprint_with_overrides( sled_list.clone(), ); - register_cleanup_expunged_zones_step( + let deploy_zones_done = register_cleanup_expunged_zones_step( &engine.for_component(ExecutionComponent::OmicronZones), &opctx, datastore, resolver, blueprint, + deploy_zones_done, ); register_decommission_sleds_step( @@ -188,12 +182,22 @@ pub async fn realize_blueprint_with_overrides( blueprint, ); + let deploy_zones_done = register_support_bundle_failure_step( + &engine.for_component(ExecutionComponent::SupportBundles), + &opctx, + datastore, + blueprint, + nexus_id, + deploy_zones_done, + ); + let reassign_saga_output = register_reassign_sagas_step( &engine.for_component(ExecutionComponent::OmicronZones), &opctx, datastore, blueprint, nexus_id, + deploy_zones_done, ); let register_cockroach_output = register_cockroachdb_settings_step( @@ -249,12 +253,14 @@ fn register_support_bundle_failure_step<'a>( datastore: &'a DataStore, blueprint: &'a Blueprint, nexus_id: OmicronZoneUuid, -) { + deploy_zones_done: StepHandle, +) -> StepHandle { registrar .new_step( ExecutionStepId::Ensure, "Mark support bundles as failed if they rely on an expunged disk or sled", - move |_cx| async move { + move |cx| async move { + let done = deploy_zones_done.into_value(cx.token()).await; datastore .support_bundle_fail_expunged( &opctx, blueprint, nexus_id @@ -262,10 +268,10 @@ fn register_support_bundle_failure_step<'a>( .await .map_err(|err| anyhow!(err))?; - StepSuccess::new(()).into() + StepSuccess::new(done).into() }, ) - .register(); + .register() } fn register_sled_list_step<'a>( @@ -354,14 +360,14 @@ fn register_deploy_zones_step<'a>( opctx: &'a OpContext, blueprint: &'a Blueprint, sleds: SharedStepHandle>>, -) { +) -> StepHandle { registrar .new_step( ExecutionStepId::Ensure, "Deploy Omicron zones", move |cx| async move { let sleds_by_id = sleds.into_value(cx.token()).await; - omicron_zones::deploy_zones( + let done = omicron_zones::deploy_zones( &opctx, &sleds_by_id, &blueprint.blueprint_zones, @@ -369,10 +375,10 @@ fn register_deploy_zones_step<'a>( .await .map_err(merge_anyhow_list)?; - StepSuccess::new(()).into() + StepSuccess::new(done).into() }, ) - .register(); + .register() } fn register_plumb_firewall_rules_step<'a>( @@ -447,25 +453,28 @@ fn register_cleanup_expunged_zones_step<'a>( datastore: &'a DataStore, resolver: &'a Resolver, blueprint: &'a Blueprint, -) { + deploy_zones_done: StepHandle, +) -> StepHandle { registrar .new_step( ExecutionStepId::Remove, "Cleanup expunged zones", - move |_cx| async move { + move |cx| async move { + let done = deploy_zones_done.into_value(cx.token()).await; omicron_zones::clean_up_expunged_zones( &opctx, datastore, resolver, blueprint.all_omicron_zones(BlueprintZoneFilter::Expunged), + &done, ) .await .map_err(merge_anyhow_list)?; - StepSuccess::new(()).into() + StepSuccess::new(done).into() }, ) - .register(); + .register() } fn register_decommission_sleds_step<'a>( @@ -591,6 +600,7 @@ fn register_reassign_sagas_step<'a>( datastore: &'a DataStore, blueprint: &'a Blueprint, nexus_id: OmicronZoneUuid, + deploy_zones_done: StepHandle, ) -> StepHandle { // For this and subsequent steps, we'll assume that any errors that we // encounter do *not* require stopping execution. We'll just accumulate @@ -601,13 +611,15 @@ fn register_reassign_sagas_step<'a>( .new_step( ExecutionStepId::Ensure, "Reassign sagas", - move |_cx| async move { + move |cx| async move { + let done = deploy_zones_done.into_value(cx.token()).await; + // For any expunged Nexus zones, re-assign in-progress sagas to // some other Nexus. If this fails for some reason, it doesn't // affect anything else. let sec_id = nexus_db_model::SecId::from(nexus_id); let reassigned = sagas::reassign_sagas_from_expunged( - &opctx, datastore, blueprint, sec_id, + &opctx, datastore, blueprint, sec_id, &done, ) .await .context("failed to re-assign sagas"); diff --git a/nexus/reconfigurator/execution/src/omicron_zones.rs b/nexus/reconfigurator/execution/src/omicron_zones.rs index 73ef7fcaa79..0c9217dffdf 100644 --- a/nexus/reconfigurator/execution/src/omicron_zones.rs +++ b/nexus/reconfigurator/execution/src/omicron_zones.rs @@ -33,13 +33,18 @@ use std::collections::BTreeMap; use std::net::SocketAddr; use std::net::SocketAddrV6; +/// Typestate indicating that the deploy disks step was performed. +#[derive(Debug)] +#[must_use = "token indicating completion of deploy_zones"] +pub(crate) struct DeployZonesDone(()); + /// Idempotently ensure that the specified Omicron zones are deployed to the /// corresponding sleds pub(crate) async fn deploy_zones( opctx: &OpContext, sleds_by_id: &BTreeMap, zones: &BTreeMap, -) -> Result<(), Vec> { +) -> Result> { let errors: Vec<_> = stream::iter(zones) .filter_map(|(sled_id, config)| async move { let db_sled = match sleds_by_id.get(sled_id) { @@ -94,7 +99,7 @@ pub(crate) async fn deploy_zones( .await; if errors.is_empty() { - Ok(()) + Ok(DeployZonesDone(())) } else { Err(errors) } @@ -106,6 +111,7 @@ pub(crate) async fn clean_up_expunged_zones( datastore: &DataStore, resolver: &R, expunged_zones: impl Iterator, + _deploy_zones_done: &DeployZonesDone, ) -> Result<(), Vec> { let errors: Vec = stream::iter(expunged_zones) .filter_map(|(sled_id, config)| async move { @@ -429,7 +435,7 @@ mod test { // Get a success result back when the blueprint has an empty set of // zones. let (_, blueprint) = create_blueprint(BTreeMap::new()); - deploy_zones(&opctx, &sleds_by_id, &blueprint.blueprint_zones) + _ = deploy_zones(&opctx, &sleds_by_id, &blueprint.blueprint_zones) .await .expect("failed to deploy no zones"); @@ -487,7 +493,7 @@ mod test { } // Execute it. - deploy_zones(&opctx, &sleds_by_id, &blueprint.blueprint_zones) + _ = deploy_zones(&opctx, &sleds_by_id, &blueprint.blueprint_zones) .await .expect("failed to deploy initial zones"); @@ -504,7 +510,7 @@ mod test { .respond_with(status_code(204)), ); } - deploy_zones(&opctx, &sleds_by_id, &blueprint.blueprint_zones) + _ = deploy_zones(&opctx, &sleds_by_id, &blueprint.blueprint_zones) .await .expect("failed to deploy same zones"); s1.verify_and_clear(); @@ -590,7 +596,7 @@ mod test { } // Activate the task - deploy_zones(&opctx, &sleds_by_id, &blueprint.blueprint_zones) + _ = deploy_zones(&opctx, &sleds_by_id, &blueprint.blueprint_zones) .await .expect("failed to deploy last round of zones"); s1.verify_and_clear(); @@ -641,6 +647,10 @@ mod test { } let fake_resolver = FixedResolver(vec![mock_admin.addr()]); + // This is a unit test, so pretend we already successfully called + // deploy_zones. + let deploy_zones_done = DeployZonesDone(()); + // We haven't yet inserted a mapping from zone ID to cockroach node ID // in the db, so trying to clean up the zone should log a warning but // otherwise succeed, without attempting to contact our mock admin @@ -651,6 +661,7 @@ mod test { datastore, &fake_resolver, iter::once((any_sled_id, &crdb_zone)), + &deploy_zones_done, ) .await .expect("unknown node ID: no cleanup"); @@ -697,6 +708,7 @@ mod test { datastore, &fake_resolver, iter::once((any_sled_id, &crdb_zone)), + &deploy_zones_done, ) .await .expect("decommissioned test node"); @@ -728,6 +740,7 @@ mod test { datastore, &fake_resolver, iter::once((any_sled_id, &crdb_zone)), + &deploy_zones_done, ) .await .expect_err("no successful response should result in failure"); @@ -756,6 +769,7 @@ mod test { datastore, &fake_resolver, iter::once((any_sled_id, &crdb_zone)), + &deploy_zones_done, ) .await .expect("decommissioned test node"); diff --git a/nexus/reconfigurator/execution/src/sagas.rs b/nexus/reconfigurator/execution/src/sagas.rs index 458328ef008..464f0815c90 100644 --- a/nexus/reconfigurator/execution/src/sagas.rs +++ b/nexus/reconfigurator/execution/src/sagas.rs @@ -4,6 +4,7 @@ //! Re-assign sagas from expunged Nexus zones +use crate::omicron_zones::DeployZonesDone; use nexus_db_model::SecId; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::DataStore; @@ -20,6 +21,7 @@ pub(crate) async fn reassign_sagas_from_expunged( datastore: &DataStore, blueprint: &Blueprint, nexus_id: SecId, + _deploy_zones_done: &DeployZonesDone, ) -> Result { let log = &opctx.log; From fb0b7b75a8a290cb6fa0de75f77083c4db3f0940 Mon Sep 17 00:00:00 2001 From: James MacMahon Date: Fri, 14 Feb 2025 15:45:25 -0500 Subject: [PATCH 40/43] Address `test_region_replacement_triple_sanity_2` flake (#7544) `test_region_replacement_triple_sanity_2` performs two disk expungements before starting the Crucible replacement machinery to ensure that losing two out of three parts of a Volume's region set will not result in lost data. This test was occasionally failing with an assertion that indicated not all resources on expunged physical disks had been replaced in a volume. `wait_for_all_replacements` is a routine that previously would: 1. run all background tasks related to region replacement and region snapshot replacement 2. bail out of the loop if there are no more non-completed replacements This is incorrect! "no more non-completed replacements" is not an indicator that all necessary resource movement has completed, only that _current_ movement has completed. Rerunning the background tasks could request more work. The real check that function should be performing is whether or not any resources used by Volumes are backed by physical disks that are expunged. This commit changes `wait_for_all_replacements` to: 1. run all background tasks related to region replacement and region snapshot replacement, but ignore the output 2. check how many resources are still backed by expunged physical disks, and loop if there still are some 3. check if work is in-progress, and loop if so 4. return to the caller Also in this commit: - an omdb command has been added that will print what resources need to be replaced (because they're on expunged physical disks) - an errant eprintln has been removed (it was showing up in the `--nocapture` output) Fixes #7535 --- dev-tools/omdb/src/bin/omdb/db.rs | 76 ++++++++++ dev-tools/omdb/tests/usage_errors.out | 4 + nexus/test-utils/src/background.rs | 2 - .../crucible_replacements.rs | 143 ++++++++++++------ 4 files changed, 179 insertions(+), 46 deletions(-) diff --git a/dev-tools/omdb/src/bin/omdb/db.rs b/dev-tools/omdb/src/bin/omdb/db.rs index 96e5c39c7f0..4f4d0f5bee4 100644 --- a/dev-tools/omdb/src/bin/omdb/db.rs +++ b/dev-tools/omdb/src/bin/omdb/db.rs @@ -316,6 +316,8 @@ pub struct DbFetchOptions { /// Subcommands that query or update the database #[derive(Debug, Subcommand, Clone)] enum DbCommands { + /// Print any Crucible resources that are located on expunged physical disks + ReplacementsToDo, /// Print information about the rack Rack(RackArgs), /// Print information about virtual disks @@ -915,6 +917,9 @@ impl DbArgs { self.db_url_opts.with_datastore(omdb, log, |opctx, datastore| { async move { match &self.command { + DbCommands::ReplacementsToDo => { + replacements_to_do(&opctx, &datastore).await + } DbCommands::Rack(RackArgs { command: RackCommands::List }) => { cmd_db_rack_list(&opctx, &datastore, &fetch_opts).await } @@ -1419,6 +1424,77 @@ async fn cmd_db_disk_list( Ok(()) } +async fn replacements_to_do( + opctx: &OpContext, + datastore: &DataStore, +) -> Result<(), anyhow::Error> { + #[derive(Tabled)] + #[tabled(rename_all = "SCREAMING_SNAKE_CASE")] + struct RegionRow { + id: String, + dataset_id: String, + resource: String, + } + + let region_rows: Vec = vec![ + datastore + .find_read_only_regions_on_expunged_physical_disks(opctx) + .await?, + datastore + .find_read_write_regions_on_expunged_physical_disks(opctx) + .await?, + ] + .into_iter() + .flatten() + .map(|region| RegionRow { + id: region.id().to_string(), + dataset_id: region.dataset_id().to_string(), + resource: if region.read_only() { + String::from("read-only region") + } else { + String::from("read/write region") + }, + }) + .collect(); + + let table = tabled::Table::new(region_rows) + .with(tabled::settings::Style::empty()) + .with(tabled::settings::Padding::new(0, 1, 0, 0)) + .to_string(); + + println!("{}", table); + + println!(""); + + #[derive(Tabled)] + #[tabled(rename_all = "SCREAMING_SNAKE_CASE")] + struct RegionSnapshotRow { + dataset_id: String, + region_id: String, + snapshot_id: String, + } + + let rs_rows: Vec = datastore + .find_region_snapshots_on_expunged_physical_disks(opctx) + .await? + .into_iter() + .map(|rs| RegionSnapshotRow { + dataset_id: rs.dataset_id().to_string(), + region_id: rs.region_id.to_string(), + snapshot_id: rs.snapshot_id.to_string(), + }) + .collect(); + + let table = tabled::Table::new(rs_rows) + .with(tabled::settings::Style::empty()) + .with(tabled::settings::Padding::new(0, 1, 0, 0)) + .to_string(); + + println!("{}", table); + + Ok(()) +} + /// Run `omdb db rack info`. async fn cmd_db_rack_list( opctx: &OpContext, diff --git a/dev-tools/omdb/tests/usage_errors.out b/dev-tools/omdb/tests/usage_errors.out index 15474230f4e..44b7d13aed7 100644 --- a/dev-tools/omdb/tests/usage_errors.out +++ b/dev-tools/omdb/tests/usage_errors.out @@ -113,6 +113,8 @@ Query the control plane database (CockroachDB) Usage: omdb db [OPTIONS] Commands: + replacements-to-do Print any Crucible resources that are located on expunged physical + disks rack Print information about the rack disks Print information about virtual disks dns Print information about internal and external DNS @@ -163,6 +165,8 @@ Query the control plane database (CockroachDB) Usage: omdb db [OPTIONS] Commands: + replacements-to-do Print any Crucible resources that are located on expunged physical + disks rack Print information about the rack disks Print information about virtual disks dns Print information about internal and external DNS diff --git a/nexus/test-utils/src/background.rs b/nexus/test-utils/src/background.rs index 3a293dfd51c..b7a30b88bfe 100644 --- a/nexus/test-utils/src/background.rs +++ b/nexus/test-utils/src/background.rs @@ -305,8 +305,6 @@ pub async fn run_region_snapshot_replacement_step( ) .unwrap(); - eprintln!("{:?}", &status.errors); - assert!(status.errors.is_empty()); status.step_records_created_ok.len() diff --git a/nexus/tests/integration_tests/crucible_replacements.rs b/nexus/tests/integration_tests/crucible_replacements.rs index b4bdcd3c558..84c53d4a606 100644 --- a/nexus/tests/integration_tests/crucible_replacements.rs +++ b/nexus/tests/integration_tests/crucible_replacements.rs @@ -38,6 +38,7 @@ use omicron_common::api::external::IdentityMetadataCreateParams; use omicron_test_utils::dev::poll::{wait_for_condition, CondCheckError}; use omicron_uuid_kinds::GenericUuid; use omicron_uuid_kinds::VolumeUuid; +use slog::info; use slog::Logger; use std::collections::HashSet; use std::net::SocketAddr; @@ -92,37 +93,6 @@ where .all_items } -async fn replacements_left(datastore: &DataStore) -> i64 { - let conn = datastore.pool_connection_for_tests().await.unwrap(); - - let region_replacement_left = { - use db::schema::region_replacement::dsl; - - dsl::region_replacement - .filter(dsl::replacement_state.ne(RegionReplacementState::Complete)) - .select(diesel::dsl::count_star()) - .first_async::(&*conn) - .await - .unwrap() - }; - - let region_snapshot_replacement_left = { - use db::schema::region_snapshot_replacement::dsl; - - dsl::region_snapshot_replacement - .filter( - dsl::replacement_state - .ne(RegionSnapshotReplacementState::Complete), - ) - .select(diesel::dsl::count_star()) - .first_async::(&*conn) - .await - .unwrap() - }; - - region_replacement_left + region_snapshot_replacement_left -} - pub(crate) async fn wait_for_all_replacements( datastore: &Arc, internal_client: &ClientTestContext, @@ -130,29 +100,105 @@ pub(crate) async fn wait_for_all_replacements( wait_for_condition( || { let datastore = datastore.clone(); + let opctx = OpContext::for_tests( + internal_client.client_log.new(o!()), + datastore.clone(), + ); async move { - // Trigger all the replacement related background tasks. If - // there were actions taken, continually activate the tasks to - // push the replacements forward. + // Trigger all the replacement related background tasks. These + // will add replacement requests to the database and trigger the + // associated sagas to push the replacements forward. Bail out + // of this loop only when there's no more resources on expunged + // physical disks. // - // If no actions were taken and no replacements are left, we are - // done waiting. `replacements_left` should only be called after - // `run_all_crucible_replacement_tasks`, as that could create - // more replacements. + // Be careful not to check if the background tasks performed any + // actions, or if there are in-progress replacement requests: + // the fixed point that we're waiting for is for all Crucible + // resources to be moved to non-expunged physical disks. + // Detecting whether or not there's an in-progress replacement + // can tell you that something is _currently_ moving but not + // that all work is done. + + run_all_crucible_replacement_tasks(internal_client).await; + + let ro_left_to_do = datastore + .find_read_only_regions_on_expunged_physical_disks(&opctx) + .await + .unwrap() + .len(); + + let rw_left_to_do = datastore + .find_read_write_regions_on_expunged_physical_disks(&opctx) + .await + .unwrap() + .len(); + + let rs_left_to_do = datastore + .find_region_snapshots_on_expunged_physical_disks(&opctx) + .await + .unwrap() + .len(); - let actions_taken = - run_all_crucible_replacement_tasks(internal_client).await; + if ro_left_to_do + rw_left_to_do + rs_left_to_do > 0 { + info!( + &internal_client.client_log, + "wait_for_all_replacements: ro {} rw {} rs {}", + ro_left_to_do, + rw_left_to_do, + rs_left_to_do, + ); - if actions_taken > 0 { return Err(CondCheckError::<()>::NotYet); } - if replacements_left(&datastore).await == 0 { - return Ok(()); + // Now that all resources have been moved, wait for the requests + // to all transition to complete. + + let conn = datastore.pool_connection_for_tests().await.unwrap(); + + let region_replacement_left = { + use db::schema::region_replacement::dsl; + + dsl::region_replacement + .filter( + dsl::replacement_state + .ne(RegionReplacementState::Complete), + ) + .select(diesel::dsl::count_star()) + .first_async::(&*conn) + .await + .unwrap() + }; + + let region_snapshot_replacement_left = { + use db::schema::region_snapshot_replacement::dsl; + + dsl::region_snapshot_replacement + .filter( + dsl::replacement_state + .ne(RegionSnapshotReplacementState::Complete), + ) + .select(diesel::dsl::count_star()) + .first_async::(&*conn) + .await + .unwrap() + }; + + if region_replacement_left + region_snapshot_replacement_left + > 0 + { + info!( + &internal_client.client_log, + "wait_for_all_replacements: rr {} rsr {}", + region_replacement_left, + region_snapshot_replacement_left, + ); + + return Err(CondCheckError::<()>::NotYet); } - Err(CondCheckError::<()>::NotYet) + Ok(()) } }, &std::time::Duration::from_millis(50), @@ -2137,6 +2183,7 @@ async fn test_region_replacement_triple_sanity( async fn test_region_replacement_triple_sanity_2( cptestctx: &ControlPlaneTestContext, ) { + let log = &cptestctx.logctx.log; let nexus = &cptestctx.server.server_context().nexus; let datastore = nexus.datastore(); let opctx = @@ -2214,6 +2261,8 @@ async fn test_region_replacement_triple_sanity_2( .await .unwrap(); + info!(log, "expunging physical disk {}", db_zpool.physical_disk_id); + datastore .physical_disk_update_policy( &opctx, @@ -2224,6 +2273,8 @@ async fn test_region_replacement_triple_sanity_2( .unwrap(); } + info!(log, "waiting for all replacements"); + // Now, run all replacement tasks to completion wait_for_all_replacements(&datastore, &internal_client).await; @@ -2242,6 +2293,8 @@ async fn test_region_replacement_triple_sanity_2( .await .unwrap(); + info!(log, "expunging physical disk {}", db_zpool.physical_disk_id); + datastore .physical_disk_update_policy( &opctx, @@ -2252,6 +2305,8 @@ async fn test_region_replacement_triple_sanity_2( .unwrap(); } + info!(log, "waiting for all replacements"); + // Now, run all replacement tasks to completion wait_for_all_replacements(&datastore, &internal_client).await; From 31da03c1534bce0611a5c305bc6b5640be257341 Mon Sep 17 00:00:00 2001 From: Rain Date: Fri, 14 Feb 2025 12:45:53 -0800 Subject: [PATCH 41/43] update to daft 0.1.1 and oxnet 0.1.0 (#7516) The release version of daft switches to somewhat lazier diffing, so we maintain some nested maps. It would be interesting to see how eager diffing can be brought back as an option in daft at some point, but this is ok for now. --- Cargo.lock | 63 ++---- Cargo.toml | 14 +- common/src/api/external/mod.rs | 10 +- common/src/zpool_name.rs | 7 +- dev-tools/ls-apis/tests/api_dependencies.out | 1 - nexus/reconfigurator/planning/src/planner.rs | 27 +-- nexus/types/src/deployment/blueprint_diff.rs | 203 ++++++++++--------- package-manifest.toml | 8 +- tools/maghemite_ddm_openapi_version | 4 +- tools/maghemite_mg_openapi_version | 4 +- tools/maghemite_mgd_checksums | 4 +- 11 files changed, 168 insertions(+), 177 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 01aad6c61a8..5431c497935 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2070,8 +2070,9 @@ dependencies = [ [[package]] name = "daft" -version = "0.1.0" -source = "git+https://github.com/oxidecomputer/daft?branch=main#9e7b55349f61bded974cba9c1727a70a62586a37" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a75caf1eeef382d47bf5d3012b5ec521311cd876a1304ac8807ec86d4df42a7" dependencies = [ "daft-derive", "newtype-uuid", @@ -2082,8 +2083,9 @@ dependencies = [ [[package]] name = "daft-derive" -version = "0.1.0" -source = "git+https://github.com/oxidecomputer/daft?branch=main#9e7b55349f61bded974cba9c1727a70a62586a37" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a851e4efac7afda4a5e1a11fea1d65ef528dbdcff08177d7087e4bb6225e60a9" dependencies = [ "proc-macro2", "quote", @@ -2183,7 +2185,7 @@ dependencies = [ [[package]] name = "ddm-admin-client" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/maghemite?rev=93cd0d642cf1b58f9f4528275e2a2aa758e9feb3#93cd0d642cf1b58f9f4528275e2a2aa758e9feb3" +source = "git+https://github.com/oxidecomputer/maghemite?rev=cb2b592e890ca9e93d8193e9765e2a62459d5fa8#cb2b592e890ca9e93d8193e9765e2a62459d5fa8" dependencies = [ "oxnet", "percent-encoding", @@ -4491,7 +4493,7 @@ dependencies = [ [[package]] name = "illumos-sys-hdrs" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/opte?rev=b56afeeb14e0042cbd7bda85b166ed86ee17820e#b56afeeb14e0042cbd7bda85b166ed86ee17820e" +source = "git+https://github.com/oxidecomputer/opte?rev=cd9aa6467c5e62c6d97f6aafa2150d6930e3a0fa#cd9aa6467c5e62c6d97f6aafa2150d6930e3a0fa" [[package]] name = "illumos-utils" @@ -4870,9 +4872,9 @@ checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "ipnetwork" -version = "0.20.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf466541e9d546596ee94f9f69590f89473455f88372423e0008fc1a7daf100e" +checksum = "cf370abdafd54d13e54a620e8c3e1145f28e46cc9d704bc6d94414559df41763" dependencies = [ "schemars", "serde", @@ -4988,7 +4990,7 @@ dependencies = [ [[package]] name = "kstat-macro" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/opte?rev=b56afeeb14e0042cbd7bda85b166ed86ee17820e#b56afeeb14e0042cbd7bda85b166ed86ee17820e" +source = "git+https://github.com/oxidecomputer/opte?rev=cd9aa6467c5e62c6d97f6aafa2150d6930e3a0fa#cd9aa6467c5e62c6d97f6aafa2150d6930e3a0fa" dependencies = [ "quote", "syn 2.0.96", @@ -5087,7 +5089,7 @@ checksum = "b024e211b1b371da58cd69e4fb8fa4ed16915edcc0e2e1fb04ac4bad61959f25" [[package]] name = "libfalcon" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/falcon?branch=main#651fb5889d66be90ac1afa4a730c573b643aef1e" +source = "git+https://github.com/oxidecomputer/falcon?branch=main#f3fe0542198c08bbb82d16f168e6482db9bec5b9" dependencies = [ "anstyle", "anyhow", @@ -5097,7 +5099,7 @@ dependencies = [ "futures", "indicatif", "libc", - "libnet 0.1.0 (git+https://github.com/oxidecomputer/netadm-sys?branch=main)", + "libnet", "propolis-client 0.1.0 (git+https://github.com/oxidecomputer/propolis?rev=fae5334bcad5e864794332c6fed5e6bb9ec88831)", "propolis-server-config", "rand", @@ -5161,29 +5163,7 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libnet" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/netadm-sys?branch=main#e07ad76458eb50601e0da4f9da16dbc942bfc2ba" -dependencies = [ - "anyhow", - "cfg-if", - "colored", - "dlpi", - "libc", - "num_enum", - "nvpair", - "nvpair-sys", - "oxnet", - "rand", - "rusty-doors", - "socket2", - "thiserror 1.0.69", - "tracing", - "winnow 0.6.20", -] - -[[package]] -name = "libnet" -version = "0.1.0" -source = "git+https://github.com/oxidecomputer/netadm-sys#e07ad76458eb50601e0da4f9da16dbc942bfc2ba" +source = "git+https://github.com/oxidecomputer/netadm-sys?branch=main#f4eae3d8070760922da93b9edd56ca4103b4c390" dependencies = [ "anyhow", "cfg-if", @@ -5517,7 +5497,7 @@ dependencies = [ [[package]] name = "mg-admin-client" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/maghemite?rev=93cd0d642cf1b58f9f4528275e2a2aa758e9feb3#93cd0d642cf1b58f9f4528275e2a2aa758e9feb3" +source = "git+https://github.com/oxidecomputer/maghemite?rev=cb2b592e890ca9e93d8193e9765e2a62459d5fa8#cb2b592e890ca9e93d8193e9765e2a62459d5fa8" dependencies = [ "anyhow", "chrono", @@ -7793,7 +7773,7 @@ dependencies = [ [[package]] name = "opte" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/opte?rev=b56afeeb14e0042cbd7bda85b166ed86ee17820e#b56afeeb14e0042cbd7bda85b166ed86ee17820e" +source = "git+https://github.com/oxidecomputer/opte?rev=cd9aa6467c5e62c6d97f6aafa2150d6930e3a0fa#cd9aa6467c5e62c6d97f6aafa2150d6930e3a0fa" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -7812,7 +7792,7 @@ dependencies = [ [[package]] name = "opte-api" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/opte?rev=b56afeeb14e0042cbd7bda85b166ed86ee17820e#b56afeeb14e0042cbd7bda85b166ed86ee17820e" +source = "git+https://github.com/oxidecomputer/opte?rev=cd9aa6467c5e62c6d97f6aafa2150d6930e3a0fa#cd9aa6467c5e62c6d97f6aafa2150d6930e3a0fa" dependencies = [ "illumos-sys-hdrs", "ingot", @@ -7825,10 +7805,10 @@ dependencies = [ [[package]] name = "opte-ioctl" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/opte?rev=b56afeeb14e0042cbd7bda85b166ed86ee17820e#b56afeeb14e0042cbd7bda85b166ed86ee17820e" +source = "git+https://github.com/oxidecomputer/opte?rev=cd9aa6467c5e62c6d97f6aafa2150d6930e3a0fa#cd9aa6467c5e62c6d97f6aafa2150d6930e3a0fa" dependencies = [ "libc", - "libnet 0.1.0 (git+https://github.com/oxidecomputer/netadm-sys)", + "libnet", "opte", "oxide-vpc", "postcard", @@ -7894,7 +7874,7 @@ dependencies = [ [[package]] name = "oxide-vpc" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/opte?rev=b56afeeb14e0042cbd7bda85b166ed86ee17820e#b56afeeb14e0042cbd7bda85b166ed86ee17820e" +source = "git+https://github.com/oxidecomputer/opte?rev=cd9aa6467c5e62c6d97f6aafa2150d6930e3a0fa#cd9aa6467c5e62c6d97f6aafa2150d6930e3a0fa" dependencies = [ "cfg-if", "illumos-sys-hdrs", @@ -8216,7 +8196,8 @@ dependencies = [ [[package]] name = "oxnet" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/oxnet#49ee85dcd294901031c3395ee773363db1cdc289" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff7aba867c36df803039621068faf1630d3039eb999c2f6c3950d1064d4fbbdf" dependencies = [ "ipnetwork", "schemars", diff --git a/Cargo.toml b/Cargo.toml index 22e9c9e8d52..34dca94a31a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -369,7 +369,7 @@ crucible-common = { git = "https://github.com/oxidecomputer/crucible", rev = "d2 # NOTE: See above! csv = "1.3.1" curve25519-dalek = "4" -daft = { git = "https://github.com/oxidecomputer/daft", branch = "main", features = ["newtype-uuid1", "oxnet01", "uuid1"] } +daft = { version = "0.1.1", features = ["derive", "newtype-uuid1", "oxnet01", "uuid1"] } datatest-stable = "0.2.9" display-error-chain = "0.2.2" omicron-ddm-admin-client = { path = "clients/ddm-admin-client" } @@ -451,7 +451,7 @@ ipcc = { path = "ipcc" } ipnet = "2.9" itertools = "0.13.0" internet-checksum = "0.2" -ipnetwork = { version = "0.20", features = ["schemars"] } +ipnetwork = { version = "0.21", features = ["schemars", "serde"] } ispf = { git = "https://github.com/oxidecomputer/ispf" } key-manager = { path = "key-manager" } kstat-rs = "0.2.4" @@ -466,8 +466,8 @@ macaddr = { version = "1.0.1", features = ["serde_std"] } maplit = "1.0.2" mockall = "0.13" newtype_derive = "0.1.6" -mg-admin-client = { git = "https://github.com/oxidecomputer/maghemite", rev = "93cd0d642cf1b58f9f4528275e2a2aa758e9feb3" } -ddm-admin-client = { git = "https://github.com/oxidecomputer/maghemite", rev = "93cd0d642cf1b58f9f4528275e2a2aa758e9feb3" } +mg-admin-client = { git = "https://github.com/oxidecomputer/maghemite", rev = "cb2b592e890ca9e93d8193e9765e2a62459d5fa8" } +ddm-admin-client = { git = "https://github.com/oxidecomputer/maghemite", rev = "cb2b592e890ca9e93d8193e9765e2a62459d5fa8" } multimap = "0.10.0" nexus-auth = { path = "nexus/auth" } nexus-client = { path = "clients/nexus-client" } @@ -515,9 +515,9 @@ omicron-test-utils = { path = "test-utils" } omicron-workspace-hack = "0.1.0" omicron-zone-package = "0.12.0" oxide-client = { path = "clients/oxide-client" } -oxide-vpc = { git = "https://github.com/oxidecomputer/opte", rev = "b56afeeb14e0042cbd7bda85b166ed86ee17820e", features = [ "api", "std" ] } +oxide-vpc = { git = "https://github.com/oxidecomputer/opte", rev = "cd9aa6467c5e62c6d97f6aafa2150d6930e3a0fa", features = [ "api", "std" ] } oxlog = { path = "dev-tools/oxlog" } -oxnet = { git = "https://github.com/oxidecomputer/oxnet" } +oxnet = "0.1.0" once_cell = "1.20.2" openapi-lint = { git = "https://github.com/oxidecomputer/openapi-lint", branch = "main" } openapi-manager-types = { path = "dev-tools/openapi-manager/types" } @@ -525,7 +525,7 @@ openapiv3 = "2.0.0" # must match samael's crate! openssl = "0.10" openssl-sys = "0.9" -opte-ioctl = { git = "https://github.com/oxidecomputer/opte", rev = "b56afeeb14e0042cbd7bda85b166ed86ee17820e" } +opte-ioctl = { git = "https://github.com/oxidecomputer/opte", rev = "cd9aa6467c5e62c6d97f6aafa2150d6930e3a0fa" } oso = "0.27" owo-colors = "4.1.0" oximeter = { path = "oximeter/oximeter" } diff --git a/common/src/api/external/mod.rs b/common/src/api/external/mod.rs index 8adb45beb50..87976a1c7fb 100644 --- a/common/src/api/external/mod.rs +++ b/common/src/api/external/mod.rs @@ -17,7 +17,7 @@ use anyhow::Context; use api_identity::ObjectIdentity; use chrono::DateTime; use chrono::Utc; -use daft::{leaf, Diffable}; +use daft::Diffable; use dropshot::HttpError; pub use dropshot::PaginationOrder; pub use error::*; @@ -758,11 +758,11 @@ impl From for i64 { PartialEq, PartialOrd, Serialize, + Diffable, )] +#[daft(leaf)] pub struct Generation(u64); -leaf!(Generation); - impl Generation { // `as` is a little distasteful because it allows lossy conversion, but we // know converting `i64::MAX` to `u64` will always succeed losslessly. @@ -1981,11 +1981,11 @@ impl JsonSchema for L4PortRange { Ord, SerializeDisplay, Hash, + Diffable, )] +#[daft(leaf)] pub struct MacAddr(pub macaddr::MacAddr6); -leaf!(MacAddr); - impl MacAddr { // Guest MAC addresses begin with the Oxide OUI A8:40:25. Further, guest // address are constrained to be in the virtual address range diff --git a/common/src/zpool_name.rs b/common/src/zpool_name.rs index 39835935f00..44701d88245 100644 --- a/common/src/zpool_name.rs +++ b/common/src/zpool_name.rs @@ -5,7 +5,7 @@ //! Zpool labels and kinds shared between Nexus and Sled Agents use camino::{Utf8Path, Utf8PathBuf}; -use daft::{leaf, Diffable}; +use daft::Diffable; use omicron_uuid_kinds::ZpoolUuid; use schemars::JsonSchema; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -39,14 +39,13 @@ pub enum ZpoolKind { /// /// This expects that the format will be: `ox{i,p}_` - we parse the prefix /// when reading the structure, and validate that the UUID can be utilized. -#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Diffable)] +#[daft(leaf)] pub struct ZpoolName { id: ZpoolUuid, kind: ZpoolKind, } -leaf!(ZpoolName); - const ZPOOL_NAME_REGEX: &str = r"^ox[ip]_[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"; /// Custom JsonSchema implementation to encode the constraints on Name. diff --git a/dev-tools/ls-apis/tests/api_dependencies.out b/dev-tools/ls-apis/tests/api_dependencies.out index ff02c52a688..46ab2d708f9 100644 --- a/dev-tools/ls-apis/tests/api_dependencies.out +++ b/dev-tools/ls-apis/tests/api_dependencies.out @@ -81,7 +81,6 @@ Repo Depot API (client: repo-depot-client) consumed by: omicron-sled-agent (omicron/sled-agent) via 1 path Sled Agent (client: sled-agent-client) - consumed by: dpd (dendrite/dpd) via 1 path consumed by: omicron-nexus (omicron/nexus) via 7 paths Wicketd (client: wicketd-client) diff --git a/nexus/reconfigurator/planning/src/planner.rs b/nexus/reconfigurator/planning/src/planner.rs index fc353d0c53c..3068d777c18 100644 --- a/nexus/reconfigurator/planning/src/planner.rs +++ b/nexus/reconfigurator/planning/src/planner.rs @@ -1010,7 +1010,7 @@ mod test { // No removed or modified zones on this sled let zones_cfg_diff = summary.zones_on_modified_sled(sled_id).unwrap(); assert!(zones_cfg_diff.zones.removed.is_empty()); - assert!(zones_cfg_diff.zones.modified.is_empty()); + assert_eq!(zones_cfg_diff.zones.modified().count(), 0); // 10 crucible zones addeed assert_eq!( *zones_cfg_diff.generation.after, @@ -1193,7 +1193,7 @@ mod test { .contains_key(sled_id)); let zones_cfg_diff = summary.zones_on_modified_sled(sled_id).unwrap(); - assert!(zones_cfg_diff.zones.modified.is_empty()); + assert_eq!(zones_cfg_diff.zones.modified().count(), 0); let zones_added = &zones_cfg_diff.zones.added; match zones_added.len() { n @ (3 | 4) => { @@ -1321,7 +1321,7 @@ mod test { let zones_diff = &summary.zones_on_modified_sled(&sled_id).unwrap().zones; assert!(zones_diff.removed.is_empty()); - assert!(zones_diff.modified.is_empty()); + assert_eq!(zones_diff.modified().count(), 0); let zones_added = &zones_diff.added; match zones_added.len() { 0 => {} @@ -1895,10 +1895,10 @@ mod test { DatasetKind::TransientZoneRoot, test_transient_zone_kind.clone(), ]); - for (_, sled_with_modified_datasets) in - &summary.diff.blueprint_datasets.modified + for (_, sled_with_modified_datasets) in &summary.modified_datasets_diff { - for (_, modified) in &sled_with_modified_datasets.datasets.modified + for modified in + sled_with_modified_datasets.datasets.modified_values_diff() { assert_eq!( *modified.disposition.before, @@ -1921,10 +1921,10 @@ mod test { assert!(expected_kinds.is_empty()); let (_zone_id, modified_zones) = - summary.diff.blueprint_zones.modified.iter().next().unwrap(); - assert_eq!(modified_zones.zones.modified.len(), 1); + summary.modified_zones_diff.iter().next().unwrap(); + assert_eq!(modified_zones.zones.modified().count(), 1); let (_, modified_zone) = - &modified_zones.zones.modified.first_key_value().unwrap(); + &modified_zones.zones.modified_diff().next().unwrap(); assert!( matches!(modified_zone.zone_type.before.kind(), ZoneKind::Crucible), "Expected the modified zone to be a Crucible zone, but it was: {:?}", @@ -2044,7 +2044,7 @@ mod test { assert_eq!(summary.total_zones_modified(), 6); let (_zone_id, zones_on_a_modified_sled) = - summary.diff.blueprint_zones.modified.iter().next().unwrap(); + summary.modified_zones_diff.iter().next().unwrap(); let added_zones = &zones_on_a_modified_sled.zones.added; assert_eq!(added_zones.len(), 1); for (_, zone) in added_zones { @@ -2052,10 +2052,11 @@ mod test { } assert_eq!( - zones_on_a_modified_sled.zones.modified.len(), + zones_on_a_modified_sled.zones.modified().count(), zones_using_zpool ); - for (_, modified_zone) in &zones_on_a_modified_sled.zones.modified { + for (_, modified_zone) in zones_on_a_modified_sled.zones.modified_diff() + { assert_eq!( *modified_zone.disposition.after, BlueprintZoneDisposition::Expunged, @@ -2380,7 +2381,7 @@ mod test { "for {desc}, generation should have been bumped" ); - for (_, modified_zone) in &modified_zones.zones.modified { + for modified_zone in modified_zones.zones.modified_values_diff() { assert_eq!( *modified_zone.disposition.after, BlueprintZoneDisposition::Expunged, diff --git a/nexus/types/src/deployment/blueprint_diff.rs b/nexus/types/src/deployment/blueprint_diff.rs index db75685cbd1..c43476a353b 100644 --- a/nexus/types/src/deployment/blueprint_diff.rs +++ b/nexus/types/src/deployment/blueprint_diff.rs @@ -40,6 +40,11 @@ pub struct BlueprintDiffSummary<'a> { pub before: &'a Blueprint, pub after: &'a Blueprint, pub diff: BlueprintDiff<'a>, + pub modified_zones_diff: BTreeMap>, + pub modified_disks_diff: + BTreeMap>, + pub modified_datasets_diff: + BTreeMap>, pub all_sleds: BTreeSet, pub sleds_added: BTreeSet, pub sleds_removed: BTreeSet, @@ -50,6 +55,23 @@ pub struct BlueprintDiffSummary<'a> { impl<'a> BlueprintDiffSummary<'a> { pub fn new(before: &'a Blueprint, after: &'a Blueprint) -> Self { let diff = before.diff(after); + + let modified_zones_diff = diff + .blueprint_zones + .modified_diff() + .map(|(k, v)| (*k, v)) + .collect(); + let modified_disks_diff = diff + .blueprint_disks + .modified_diff() + .map(|(k, v)| (*k, v)) + .collect(); + let modified_datasets_diff = diff + .blueprint_datasets + .modified_diff() + .map(|(k, v)| (*k, v)) + .collect(); + // We assume for now that sled_state additions represent sled additions. // Once we collapse the 4 blueprint maps this will be unambiguously // true. @@ -68,12 +90,12 @@ impl<'a> BlueprintDiffSummary<'a> { && diff.blueprint_datasets.removed.contains_key(sled_id)) || // Disks and datasets don't exist - (!diff.blueprint_disks.unchanged.contains_key(sled_id) + (!diff.blueprint_disks.is_unchanged(sled_id) && !diff.blueprint_disks.added.contains_key(sled_id) - && !diff.blueprint_disks.modified.contains_key(sled_id) - && !diff.blueprint_datasets.unchanged.contains_key(sled_id) + && !diff.blueprint_disks.is_modified(sled_id) + && !diff.blueprint_datasets.is_unchanged(sled_id) && !diff.blueprint_datasets.added.contains_key(sled_id) - && !diff.blueprint_datasets.modified.contains_key(sled_id) + && !diff.blueprint_datasets.is_modified(sled_id) ) }); @@ -87,20 +109,20 @@ impl<'a> BlueprintDiffSummary<'a> { // added, or removed disks or datasets at all on the given sled. If not, // we consider those sleds unchanged. let mut sleds_unchanged: BTreeSet<_> = - diff.blueprint_zones.unchanged.keys().map(|id| **id).collect(); + diff.blueprint_zones.unchanged_keys().map(|id| *id).collect(); sleds_unchanged.retain(|sled_id| { // Disks and datasets are unchanged - (diff.blueprint_disks.unchanged.contains_key(sled_id) - && diff.blueprint_datasets.unchanged.contains_key(sled_id)) || + (diff.blueprint_disks.is_unchanged(sled_id) + && diff.blueprint_datasets.is_unchanged(sled_id)) || // Disks and datasets don't exist (!diff.blueprint_disks.removed.contains_key(sled_id) && !diff.blueprint_disks.added.contains_key(sled_id) - && !diff.blueprint_disks.modified.contains_key(sled_id) + && !diff.blueprint_disks.is_modified(sled_id) && !diff.blueprint_datasets.removed.contains_key(sled_id) && !diff.blueprint_datasets.added.contains_key(sled_id) - && !diff.blueprint_datasets.modified.contains_key(sled_id) + && !diff.blueprint_datasets.is_modified(sled_id) ) }); @@ -112,12 +134,11 @@ impl<'a> BlueprintDiffSummary<'a> { // and datasets that are not in removed sleds. let mut sleds_modified: BTreeSet<_> = diff .sled_state - .modified - .keys() - .chain(diff.blueprint_zones.modified.keys()) - .chain(diff.blueprint_disks.modified.keys()) - .chain(diff.blueprint_datasets.modified.keys()) - .map(|k| **k) + .modified_keys() + .chain(diff.blueprint_zones.modified_keys()) + .chain(diff.blueprint_disks.modified_keys()) + .chain(diff.blueprint_datasets.modified_keys()) + .map(|k| *k) .collect(); for sled_id in diff .blueprint_disks @@ -142,6 +163,9 @@ impl<'a> BlueprintDiffSummary<'a> { before, after, diff, + modified_zones_diff, + modified_disks_diff, + modified_datasets_diff, all_sleds, sleds_added, sleds_removed, @@ -180,9 +204,7 @@ impl<'a> BlueprintDiffSummary<'a> { .values() .fold(0, |acc, c| acc + c.zones.len()) + self - .diff - .blueprint_zones - .modified + .modified_zones_diff .values() .fold(0, |acc, c| acc + c.zones.added.len()) } @@ -195,19 +217,15 @@ impl<'a> BlueprintDiffSummary<'a> { .values() .fold(0, |acc, c| acc + c.zones.len()) + self - .diff - .blueprint_zones - .modified + .modified_zones_diff .values() .fold(0, |acc, c| acc + c.zones.removed.len()) } /// The number of zones modified across all sleds pub fn total_zones_modified(&self) -> usize { - self.diff - .blueprint_zones - .modified + self.modified_zones_diff .values() - .fold(0, |acc, c| acc + c.zones.modified.len()) + .fold(0, |acc, c| acc + c.zones.modified().count()) } /// The number of disks added across all sleds @@ -218,9 +236,7 @@ impl<'a> BlueprintDiffSummary<'a> { .values() .fold(0, |acc, c| acc + c.disks.len()) + self - .diff - .blueprint_disks - .modified + .modified_disks_diff .values() .fold(0, |acc, c| acc + c.disks.added.len()) } @@ -233,19 +249,15 @@ impl<'a> BlueprintDiffSummary<'a> { .values() .fold(0, |acc, c| acc + c.disks.len()) + self - .diff - .blueprint_disks - .modified + .modified_disks_diff .values() .fold(0, |acc, c| acc + c.disks.removed.len()) } /// The number of disks modified across all sleds pub fn total_disks_modified(&self) -> usize { - self.diff - .blueprint_disks - .modified + self.modified_disks_diff .values() - .fold(0, |acc, c| acc + c.disks.modified.len()) + .fold(0, |acc, c| acc + c.disks.modified().count()) } /// The number of datasets added across all sleds @@ -256,9 +268,7 @@ impl<'a> BlueprintDiffSummary<'a> { .values() .fold(0, |acc, c| acc + c.datasets.len()) + self - .diff - .blueprint_datasets - .modified + .modified_datasets_diff .values() .fold(0, |acc, c| acc + c.datasets.added.len()) } @@ -271,43 +281,39 @@ impl<'a> BlueprintDiffSummary<'a> { .values() .fold(0, |acc, c| acc + c.datasets.len()) + self - .diff - .blueprint_datasets - .modified + .modified_datasets_diff .values() .fold(0, |acc, c| acc + c.datasets.removed.len()) } /// The number of datasets modified across all sleds pub fn total_datasets_modified(&self) -> usize { - self.diff - .blueprint_datasets - .modified + self.modified_datasets_diff .values() - .fold(0, |acc, c| acc + c.datasets.modified.len()) + .fold(0, |acc, c| acc + c.datasets.modified().count()) } /// Return the `BlueprintZonesConfigDiff` for a modified sled pub fn zones_on_modified_sled( &self, sled_id: &SledUuid, - ) -> Option<&'a BlueprintZonesConfigDiff> { - self.diff.blueprint_zones.modified.get(sled_id) + ) -> Option<&BlueprintZonesConfigDiff<'a>> { + self.modified_zones_diff.get(sled_id) } /// Return the `BlueprintDisksConfigDiff` for a modified sled pub fn disks_on_modified_sled( &self, sled_id: &SledUuid, - ) -> Option<&'a BlueprintPhysicalDisksConfigDiff> { - self.diff.blueprint_disks.modified.get(sled_id) + ) -> Option<&BlueprintPhysicalDisksConfigDiff<'a>> { + self.modified_disks_diff.get(sled_id) } /// Return the `BlueprintDatasetsConfigDiff` for a modified sled pub fn datasets_on_modified_sled( &self, sled_id: &SledUuid, - ) -> Option<&'a BlueprintDatasetsConfigDiff> { - self.diff.blueprint_datasets.modified.get(sled_id) + ) -> Option<&BlueprintDatasetsConfigDiff<'a>> { + self.modified_datasets_diff.get(sled_id) } /// Iterate over all added zones on a sled @@ -325,7 +331,7 @@ impl<'a> BlueprintDiffSummary<'a> { } // Then check if the sled is modified and there are any added zones - let zones_cfg_diff = self.diff.blueprint_zones.modified.get(sled_id)?; + let zones_cfg_diff = self.modified_zones_diff.get(sled_id)?; if zones_cfg_diff.zones.added.is_empty() { return None; } @@ -355,7 +361,7 @@ impl<'a> BlueprintDiffSummary<'a> { } // Then check if the sled is modified and there are any removed zones - let zones_cfg_diff = self.diff.blueprint_zones.modified.get(sled_id)?; + let zones_cfg_diff = self.modified_zones_diff.get(sled_id)?; if zones_cfg_diff.zones.removed.is_empty() { return None; } @@ -372,14 +378,16 @@ impl<'a> BlueprintDiffSummary<'a> { sled_id: &SledUuid, ) -> Option<(BpDiffZonesModified, BpDiffZoneErrors)> { // Then check if the sled is modified and there are any modified zones - let zones_cfg_diff = self.diff.blueprint_zones.modified.get(sled_id)?; - if zones_cfg_diff.zones.modified.is_empty() { + let zones_cfg_diff = self.modified_zones_diff.get(sled_id)?; + let mut modified_zones = + zones_cfg_diff.zones.modified_values_diff().peekable(); + if modified_zones.peek().is_none() { return None; } Some(BpDiffZonesModified::new( *zones_cfg_diff.generation.before, *zones_cfg_diff.generation.after, - zones_cfg_diff.zones.modified.values(), + modified_zones, )) } @@ -389,8 +397,8 @@ impl<'a> BlueprintDiffSummary<'a> { sled_id: &SledUuid, ) -> Option { // First check if the sled is unchanged - if let Some(&zones_cfg) = - self.diff.blueprint_zones.unchanged.get(sled_id) + if let Some(zones_cfg) = + self.diff.blueprint_zones.get_unchanged(sled_id) { if zones_cfg.zones.is_empty() { return None; @@ -403,14 +411,16 @@ impl<'a> BlueprintDiffSummary<'a> { } // Then check if the sled is modified and there are any unchanged zones - let zones_cfg_diff = self.diff.blueprint_zones.modified.get(sled_id)?; - if zones_cfg_diff.zones.unchanged.is_empty() { + let zones_cfg_diff = self.modified_zones_diff.get(sled_id)?; + let mut unchanged_zones = + zones_cfg_diff.zones.unchanged_values().peekable(); + if unchanged_zones.peek().is_none() { return None; } Some(BpDiffZoneDetails::new( Some(*zones_cfg_diff.generation.before), Some(*zones_cfg_diff.generation.after), - zones_cfg_diff.zones.unchanged.values().map(|z| *z), + unchanged_zones, )) } @@ -432,7 +442,7 @@ impl<'a> BlueprintDiffSummary<'a> { } // Then check if the sled is modified and there are any added disks - let disks_cfg_diff = self.diff.blueprint_disks.modified.get(sled_id)?; + let disks_cfg_diff = self.modified_disks_diff.get(sled_id)?; if disks_cfg_diff.disks.added.is_empty() { return None; } @@ -462,7 +472,7 @@ impl<'a> BlueprintDiffSummary<'a> { } // Then check if the sled is modified and there are any removed disks - let disks_cfg_diff = self.diff.blueprint_disks.modified.get(sled_id)?; + let disks_cfg_diff = self.modified_disks_diff.get(sled_id)?; if disks_cfg_diff.disks.removed.is_empty() { return None; } @@ -479,8 +489,8 @@ impl<'a> BlueprintDiffSummary<'a> { sled_id: &SledUuid, ) -> Option { // First check if the sled is unchanged - if let Some(&disks_cfg) = - self.diff.blueprint_disks.unchanged.get(sled_id) + if let Some(disks_cfg) = + self.diff.blueprint_disks.get_unchanged(sled_id) { if disks_cfg.disks.is_empty() { return None; @@ -493,14 +503,16 @@ impl<'a> BlueprintDiffSummary<'a> { } // Then check if the sled is modified and there are any unchanged disks - let disks_cfg_diff = self.diff.blueprint_disks.modified.get(sled_id)?; - if disks_cfg_diff.disks.unchanged.is_empty() { + let disks_cfg_diff = self.modified_disks_diff.get(sled_id)?; + let mut unchanged_disks = + disks_cfg_diff.disks.unchanged_values().peekable(); + if unchanged_disks.peek().is_none() { return None; } Some(DiffPhysicalDisksDetails::new( Some(*disks_cfg_diff.generation.before), Some(*disks_cfg_diff.generation.after), - disks_cfg_diff.disks.unchanged.values().map(|z| *z), + unchanged_disks, )) } @@ -524,8 +536,7 @@ impl<'a> BlueprintDiffSummary<'a> { } // Then check if the sled is modified and there are any added datasets - let datasets_cfg_diff = - self.diff.blueprint_datasets.modified.get(sled_id)?; + let datasets_cfg_diff = self.modified_datasets_diff.get(sled_id)?; if datasets_cfg_diff.datasets.added.is_empty() { return None; } @@ -556,8 +567,7 @@ impl<'a> BlueprintDiffSummary<'a> { } // Then check if the sled is modified and there are any removed datasets - let datasets_cfg_diff = - self.diff.blueprint_datasets.modified.get(sled_id)?; + let datasets_cfg_diff = self.modified_datasets_diff.get(sled_id)?; if datasets_cfg_diff.datasets.removed.is_empty() { return None; } @@ -574,8 +584,8 @@ impl<'a> BlueprintDiffSummary<'a> { sled_id: &SledUuid, ) -> Option { // First check if the sled is unchanged - if let Some(&datasets_cfg) = - self.diff.blueprint_datasets.unchanged.get(sled_id) + if let Some(datasets_cfg) = + self.diff.blueprint_datasets.get_unchanged(sled_id) { if datasets_cfg.datasets.is_empty() { return None; @@ -588,15 +598,16 @@ impl<'a> BlueprintDiffSummary<'a> { } // Then check if the sled is modified and there are any unchanged datasets - let datasets_cfg_diff = - self.diff.blueprint_datasets.modified.get(sled_id)?; - if datasets_cfg_diff.datasets.unchanged.is_empty() { + let datasets_cfg_diff = self.modified_datasets_diff.get(sled_id)?; + let mut unchanged_datasets = + datasets_cfg_diff.datasets.unchanged_values().peekable(); + if unchanged_datasets.peek().is_none() { return None; } Some(DiffDatasetsDetails::new( Some(*datasets_cfg_diff.generation.before), Some(*datasets_cfg_diff.generation.after), - datasets_cfg_diff.datasets.unchanged.values().map(|z| *z), + unchanged_datasets, )) } @@ -606,15 +617,16 @@ impl<'a> BlueprintDiffSummary<'a> { sled_id: &SledUuid, ) -> Option<(BpDiffDatasetsModified, BpDiffDatasetErrors)> { // Check if the sled is modified and there are any modified datasets - let datasets_cfg_diff = - self.diff.blueprint_datasets.modified.get(sled_id)?; - if datasets_cfg_diff.datasets.modified.is_empty() { + let datasets_cfg_diff = self.modified_datasets_diff.get(sled_id)?; + let mut modified_datasets = + datasets_cfg_diff.datasets.modified_values_diff().peekable(); + if modified_datasets.peek().is_none() { return None; } Some(BpDiffDatasetsModified::new( *datasets_cfg_diff.generation.before, *datasets_cfg_diff.generation.after, - datasets_cfg_diff.datasets.modified.values(), + modified_datasets, )) } } @@ -722,7 +734,7 @@ impl ModifiedZone { zone: BlueprintZoneConfig { disposition: *diff.disposition.after, id: *diff.id.after, - filesystem_pool: diff.filesystem_pool.after.clone(), + filesystem_pool: diff.filesystem_pool.after.cloned(), zone_type: diff.zone_type.after.clone(), }, }) @@ -748,12 +760,12 @@ impl BpDiffZonesModified { pub fn new<'a>( generation_before: Generation, generation_after: Generation, - zone_diffs: impl Iterator>, + zone_diffs: impl Iterator>, ) -> (BpDiffZonesModified, BpDiffZoneErrors) { let mut zones = vec![]; let mut errors = vec![]; for diff in zone_diffs { - match ModifiedZone::from_diff(diff) { + match ModifiedZone::from_diff(&diff) { Ok(modified_zone) => zones.push(modified_zone), Err(error) => errors.push(error), } @@ -1102,8 +1114,8 @@ impl ModifiedDataset { let prior_properties = ModifiableDatasetProperties { disposition: *disposition.before, - quota: *quota.before, - reservation: *reservation.before, + quota: quota.before.copied(), + reservation: reservation.before.copied(), compression: *compression.before, }; if pool.before != pool.after { @@ -1139,9 +1151,9 @@ impl ModifiedDataset { id: *id.after, pool: pool.after.clone(), kind: kind.after.clone(), - address: *address.after, - quota: *quota.after, - reservation: *reservation.after, + address: address.after.copied(), + quota: quota.after.copied(), + reservation: reservation.after.copied(), compression: *compression.after, }, }) @@ -1162,12 +1174,12 @@ impl BpDiffDatasetsModified { pub fn new<'a>( generation_before: Generation, generation_after: Generation, - dataset_diffs: impl Iterator>, + dataset_diffs: impl Iterator>, ) -> (BpDiffDatasetsModified, BpDiffDatasetErrors) { let mut datasets = vec![]; let mut errors = vec![]; for diff in dataset_diffs { - match ModifiedDataset::from_diff(diff) { + match ModifiedDataset::from_diff(&diff) { Ok(modified_zone) => datasets.push(modified_zone), Err(error) => errors.push(error), } @@ -1838,8 +1850,7 @@ impl<'diff> BlueprintDiffDisplay<'diff> { self.summary .diff .sled_state - .unchanged - .get(sled_id) + .get_unchanged(sled_id) .map(|before| before.to_string()) .unwrap_or("unknown".to_string()) } @@ -1853,11 +1864,11 @@ impl<'diff> BlueprintDiffDisplay<'diff> { } fn sled_state_modified(&self, sled_id: &SledUuid) -> String { let modified_sled_state = - self.summary.diff.sled_state.modified.get(sled_id); + self.summary.diff.sled_state.get_modified(sled_id); match modified_sled_state { None => { // The sled_state itself wasn't modified. It must be unchanged. - match self.summary.diff.sled_state.unchanged.get(sled_id) { + match self.summary.diff.sled_state.get_unchanged(sled_id) { Some(state) => { format!("{state}") } diff --git a/package-manifest.toml b/package-manifest.toml index 42eb9cb5fac..f5102a38491 100644 --- a/package-manifest.toml +++ b/package-manifest.toml @@ -654,10 +654,10 @@ source.repo = "maghemite" # `tools/maghemite_openapi_version`. Failing to do so will cause a failure when # building `ddm-admin-client` (which will instruct you to update # `tools/maghemite_openapi_version`). -source.commit = "93cd0d642cf1b58f9f4528275e2a2aa758e9feb3" +source.commit = "cb2b592e890ca9e93d8193e9765e2a62459d5fa8" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/maghemite/image//mg-ddm.sha256.txt -source.sha256 = "b0b1b96d76cf179313305aa85857e469dd76d90e1c075305b72bd3675ef9538e" +source.sha256 = "0f439a7f60c2c0d7d941376acd58aa091ab5a6849a5f00a57d34a3585a727437" output.type = "zone" output.intermediate_only = true @@ -669,10 +669,10 @@ source.repo = "maghemite" # `tools/maghemite_openapi_version`. Failing to do so will cause a failure when # building `ddm-admin-client` (which will instruct you to update # `tools/maghemite_openapi_version`). -source.commit = "93cd0d642cf1b58f9f4528275e2a2aa758e9feb3" +source.commit = "cb2b592e890ca9e93d8193e9765e2a62459d5fa8" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/maghemite/image//mgd.sha256.txt -source.sha256 = "9db633384abe06f23c2b396c4beda3e34ec9bf74d538a914eb57198f6ba8992e" +source.sha256 = "18b07ad8fe428a8ca0b89690d837ee57c484c64cdde2f01a4eda44cb5dcfc1b4" output.type = "zone" output.intermediate_only = true diff --git a/tools/maghemite_ddm_openapi_version b/tools/maghemite_ddm_openapi_version index c27cad916d7..fa0178b6353 100644 --- a/tools/maghemite_ddm_openapi_version +++ b/tools/maghemite_ddm_openapi_version @@ -1,2 +1,2 @@ -COMMIT="93cd0d642cf1b58f9f4528275e2a2aa758e9feb3" -SHA2="007bfb717ccbc077c0250dee3121aeb0c5bb0d1c16795429a514fa4f8635a5ef" +COMMIT="cb2b592e890ca9e93d8193e9765e2a62459d5fa8" +SHA2="0f439a7f60c2c0d7d941376acd58aa091ab5a6849a5f00a57d34a3585a727437" diff --git a/tools/maghemite_mg_openapi_version b/tools/maghemite_mg_openapi_version index 6d0710f45af..f2f703f5af1 100644 --- a/tools/maghemite_mg_openapi_version +++ b/tools/maghemite_mg_openapi_version @@ -1,2 +1,2 @@ -COMMIT="93cd0d642cf1b58f9f4528275e2a2aa758e9feb3" -SHA2="b24ab6aacc2a40421ff1bbf4983121209d8079f1656a6f986e8f92d55e0dade1" +COMMIT="cb2b592e890ca9e93d8193e9765e2a62459d5fa8" +SHA2="18b07ad8fe428a8ca0b89690d837ee57c484c64cdde2f01a4eda44cb5dcfc1b4" diff --git a/tools/maghemite_mgd_checksums b/tools/maghemite_mgd_checksums index 63b07c35445..4eee263ebb7 100644 --- a/tools/maghemite_mgd_checksums +++ b/tools/maghemite_mgd_checksums @@ -1,2 +1,2 @@ -CIDL_SHA256="9db633384abe06f23c2b396c4beda3e34ec9bf74d538a914eb57198f6ba8992e" -MGD_LINUX_SHA256="bf83bf460c21a3734b3fdaf0820efa641bbbc93a66ec29caa681ee4e488390a3" \ No newline at end of file +CIDL_SHA256="18b07ad8fe428a8ca0b89690d837ee57c484c64cdde2f01a4eda44cb5dcfc1b4" +MGD_LINUX_SHA256="4721aaaf9061325f76ac907728d38bf02f19e30a85348e311f635d1db7353f48" From e2f9776a2f86de2d4cd35926302bb99cedbdb3d4 Mon Sep 17 00:00:00 2001 From: John Gallagher Date: Fri, 14 Feb 2025 17:18:01 -0500 Subject: [PATCH 42/43] test flake fix: avoid random MAC address collisions (#7547) Fixes #7531 --- .../deployment/external_networking.rs | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/nexus/db-queries/src/db/datastore/deployment/external_networking.rs b/nexus/db-queries/src/db/datastore/deployment/external_networking.rs index 99d7cffdfbd..9dc1ecb1f50 100644 --- a/nexus/db-queries/src/db/datastore/deployment/external_networking.rs +++ b/nexus/db-queries/src/db/datastore/deployment/external_networking.rs @@ -439,6 +439,7 @@ mod tests { use omicron_uuid_kinds::ExternalIpUuid; use omicron_uuid_kinds::ZpoolUuid; use oxnet::IpNet; + use std::collections::BTreeSet; use std::net::IpAddr; use std::net::SocketAddr; use uuid::Uuid; @@ -467,6 +468,31 @@ mod tests { .expect("bad IP range"); let mut external_ips = external_ips_range.iter(); + let mut random_system_mac_iter = { + // Avoid test flakes when we happen to generate two equal MACs + // at random by just retrying; we only generate a handful of + // MACs here so there's no concern with this getting stuck. + let mut already_seen = BTreeSet::new(); + std::iter::from_fn(move || { + // Some absurdly high number to bail out if somehow we're + // not getting random MACs or we've generated so many that + // we're not seeing unique values. Our test harness + // currently only needs 3. + const MAX_TRIES: usize = 10_000; + for _ in 0..MAX_TRIES { + let mac = MacAddr::random_system(); + if already_seen.insert(mac) { + return Some(mac); + } + } + panic!( + "generated {MAX_TRIES} random mac addresses, \ + but only got {} unique values", + already_seen.len() + ); + }) + }; + let nexus_id = OmicronZoneUuid::new_v4(); let nexus_external_ip = OmicronZoneExternalFloatingIp { id: ExternalIpUuid::new_v4(), @@ -482,7 +508,7 @@ mod tests { .nth(NUM_INITIAL_RESERVED_IP_ADDRESSES) .unwrap() .into(), - mac: MacAddr::random_system(), + mac: random_system_mac_iter.next().unwrap(), subnet: IpNet::from(*NEXUS_OPTE_IPV4_SUBNET), vni: Vni::SERVICES_VNI, primary: true, @@ -508,7 +534,7 @@ mod tests { .nth(NUM_INITIAL_RESERVED_IP_ADDRESSES) .unwrap() .into(), - mac: MacAddr::random_system(), + mac: random_system_mac_iter.next().unwrap(), subnet: IpNet::from(*DNS_OPTE_IPV4_SUBNET), vni: Vni::SERVICES_VNI, primary: true, @@ -537,7 +563,7 @@ mod tests { .nth(NUM_INITIAL_RESERVED_IP_ADDRESSES) .unwrap() .into(), - mac: MacAddr::random_system(), + mac: random_system_mac_iter.next().unwrap(), subnet: IpNet::from(*NTP_OPTE_IPV4_SUBNET), vni: Vni::SERVICES_VNI, primary: true, From 998d4251bf586e2d637344ab5278c6c98a7089d6 Mon Sep 17 00:00:00 2001 From: John Gallagher Date: Tue, 18 Feb 2025 08:33:24 -0500 Subject: [PATCH 43/43] [reconfigurator] Fix assert_planning_makes_no_changes() (#7512) Despite its name, this test function didn't actually invoke the planner. Now it does, and this fixes up some tests that now fail (and changes the behavior of the planner in one case where the test failure arguably indicated some planner misbehavior). The specific planner change: Previously, if we added an NTP zone to a sled, we considered that sled ineligible for any other zones (consistent with the sled-agent behavior of refusing to start zones if time isn't sync'd yet). This PR relaxes that slightly: if we're adding an NTP zone to a sled and that sled already has other zones that needed time to be sync'd, we do consider it eligible. This avoids having to make multiple planner iterations to repopulate a sled that had a subset of disks/zones expunged, while maintaining the existing behavior for new sleds being added. I'm not totally convinced that the existing behavior for new sleds is necessary; since we're only waiting for the presence of an NTP zone, not an inventory report that time is actually sync'd, I'm not sure there's a meaningful difference to requiring two planning iterations instead of one to place extra zones. But I don't have a reason to propose changing it or testing it other than "seems a little over-cautious", so it seems fine to leave it. --- .../planning/src/blueprint_builder/builder.rs | 59 ++---- nexus/reconfigurator/planning/src/planner.rs | 191 ++++++++++++------ nexus/types/src/deployment/zone_type.rs | 5 + 3 files changed, 150 insertions(+), 105 deletions(-) diff --git a/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs b/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs index b62750a6509..bc7544b0ba8 100644 --- a/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs +++ b/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs @@ -2057,8 +2057,8 @@ pub mod test { use crate::example::example; use crate::example::ExampleSystemBuilder; use crate::example::SimRngState; + use crate::planner::test::assert_planning_makes_no_changes; use crate::system::SledBuilder; - use nexus_inventory::CollectionBuilder; use nexus_reconfigurator_blippy::Blippy; use nexus_reconfigurator_blippy::BlippyReportSortKey; use nexus_types::deployment::BlueprintDatasetDisposition; @@ -2087,34 +2087,6 @@ pub mod test { } } - #[track_caller] - pub fn assert_planning_makes_no_changes( - log: &Logger, - blueprint: &Blueprint, - input: &PlanningInput, - test_name: &'static str, - ) { - let collection = CollectionBuilder::new("test").build(); - let builder = BlueprintBuilder::new_based_on( - &log, - &blueprint, - &input, - &collection, - test_name, - ) - .expect("failed to create builder"); - let child_blueprint = builder.build(); - verify_blueprint(&child_blueprint); - let diff = child_blueprint.diff_since_blueprint(&blueprint); - println!( - "diff between blueprints (expected no changes):\n{}", - diff.display() - ); - assert_eq!(diff.sleds_added.len(), 0); - assert_eq!(diff.sleds_removed.len(), 0); - assert_eq!(diff.sleds_modified.len(), 0); - } - #[test] fn test_basic() { static TEST_NAME: &str = "blueprint_builder_test_basic"; @@ -2267,6 +2239,7 @@ pub mod test { &logctx.log, &blueprint3, &input, + &example.collection, TEST_NAME, ); @@ -2388,14 +2361,6 @@ pub mod test { Some(SledState::Decommissioned), ); - // Test a no-op planning iteration. - assert_planning_makes_no_changes( - &logctx.log, - &blueprint4, - &input, - TEST_NAME, - ); - logctx.cleanup_successful(); } @@ -2840,14 +2805,25 @@ pub mod test { static TEST_NAME: &str = "blueprint_builder_test_ensure_cockroachdb"; let logctx = test_setup_log(TEST_NAME); - // Start with an empty system (sleds with no zones). + // Start with an example system (no CRDB zones). let (example, parent) = - ExampleSystemBuilder::new(&logctx.log, TEST_NAME) - .create_zones(false) - .build(); + ExampleSystemBuilder::new(&logctx.log, TEST_NAME).build(); let collection = example.collection; let input = example.input; + // Ensure no CRDB zones (currently `ExampleSystemBuilder` never + // provisions CRDB; this check makes sure we update our use of it if + // that changes). + for (_, z) in + parent.all_omicron_zones(BlueprintZoneFilter::ShouldBeRunning) + { + assert!( + !z.zone_type.is_cockroach(), + "unexpected cockroach zone \ + (update use of ExampleSystemBuilder?): {z:?}" + ); + } + // Pick an arbitrary sled. let (target_sled_id, sled_resources) = input .all_sled_resources(SledFilter::InService) @@ -2895,6 +2871,7 @@ pub mod test { &logctx.log, &blueprint, &input, + &collection, TEST_NAME, ); diff --git a/nexus/reconfigurator/planning/src/planner.rs b/nexus/reconfigurator/planning/src/planner.rs index 3068d777c18..5fb0bf49c9f 100644 --- a/nexus/reconfigurator/planning/src/planner.rs +++ b/nexus/reconfigurator/planning/src/planner.rs @@ -14,6 +14,7 @@ use crate::blueprint_builder::Operation; use crate::blueprint_editor::DisksEditError; use crate::blueprint_editor::SledEditError; use crate::planner::omicron_zone_placement::PlacementError; +use nexus_sled_agent_shared::inventory::OmicronZoneType; use nexus_sled_agent_shared::inventory::ZoneKind; use nexus_types::deployment::Blueprint; use nexus_types::deployment::BlueprintZoneDisposition; @@ -354,11 +355,39 @@ impl<'a> Planner<'a> { sled_id, kind: ZoneKind::BoundaryNtp, }); - // Don't make any other changes to this sled. However, this - // change is compatible with any other changes to other sleds, - // so we can "continue" here rather than "break". - sleds_waiting_for_ntp_zone.insert(sled_id); - continue; + + // If we're setting up a new sled (the typical reason to add a + // new NTP zone), we don't want make any other changes to this + // sled. However, this change is compatible with any other + // changes to other sleds, so we can "continue" here rather than + // "break". + // + // However, we could be _replacing_ an NTP zone (e.g., if the + // disk on which a previous NTP zone was running was expunged). + // If the sled is still running some other control plane + // services (which is evidence it previously had an NTP zone!), + // we can go ahead and consider it eligible for new ones. + if self + .blueprint + .current_sled_zones( + sled_id, + BlueprintZoneFilter::ShouldBeRunning, + ) + .any(|z| { + OmicronZoneType::from(z.zone_type.clone()) + .requires_timesync() + }) + { + info!( + &self.log, + "sled getting NTP zone has other services already; \ + considering it eligible for discretionary zones"; + "sled_id" => %sled_id, + ); + } else { + sleds_waiting_for_ntp_zone.insert(sled_id); + continue; + } } // Now we've established that the current blueprint _says_ there's @@ -790,15 +819,12 @@ pub(crate) enum ZoneExpungeReason { } #[cfg(test)] -mod test { - use super::Planner; - use crate::blueprint_builder::test::assert_planning_makes_no_changes; +pub(crate) mod test { + use super::*; use crate::blueprint_builder::test::verify_blueprint; - use crate::blueprint_builder::BlueprintBuilder; use crate::example::example; use crate::example::ExampleSystemBuilder; use crate::example::SimRngState; - use crate::planner::rng::PlannerRng; use crate::system::SledBuilder; use chrono::NaiveDateTime; use chrono::TimeZone; @@ -806,22 +832,14 @@ mod test { use clickhouse_admin_types::ClickhouseKeeperClusterMembership; use clickhouse_admin_types::KeeperId; use expectorate::assert_contents; - use nexus_sled_agent_shared::inventory::ZoneKind; use nexus_types::deployment::blueprint_zone_type; use nexus_types::deployment::BlueprintDatasetDisposition; use nexus_types::deployment::BlueprintDiffSummary; - use nexus_types::deployment::BlueprintZoneDisposition; - use nexus_types::deployment::BlueprintZoneFilter; use nexus_types::deployment::BlueprintZoneType; use nexus_types::deployment::ClickhouseMode; use nexus_types::deployment::ClickhousePolicy; - use nexus_types::deployment::CockroachDbClusterVersion; - use nexus_types::deployment::CockroachDbPreserveDowngrade; - use nexus_types::deployment::CockroachDbSettings; use nexus_types::deployment::SledDisk; - use nexus_types::external_api::views::PhysicalDiskPolicy; use nexus_types::external_api::views::PhysicalDiskState; - use nexus_types::external_api::views::SledPolicy; use nexus_types::external_api::views::SledProvisionPolicy; use nexus_types::external_api::views::SledState; use omicron_common::api::external::Generation; @@ -830,10 +848,9 @@ mod test { use omicron_common::policy::CRUCIBLE_PANTRY_REDUNDANCY; use omicron_test_utils::dev::test_setup_log; use omicron_uuid_kinds::PhysicalDiskUuid; - use omicron_uuid_kinds::SledUuid; use omicron_uuid_kinds::ZpoolUuid; use slog_error_chain::InlineErrorChain; - use std::collections::BTreeSet; + use std::collections::BTreeMap; use std::collections::HashMap; use std::net::IpAddr; use typed_rng::TypedUuidRng; @@ -844,6 +861,33 @@ mod test { ClickhousePolicy { version: 0, mode, time_created: Utc::now() } } + pub(crate) fn assert_planning_makes_no_changes( + log: &Logger, + blueprint: &Blueprint, + input: &PlanningInput, + collection: &Collection, + test_name: &'static str, + ) { + let planner = Planner::new_based_on( + log.clone(), + &blueprint, + &input, + test_name, + &collection, + ) + .expect("created planner"); + let child_blueprint = planner.plan().expect("planning succeeded"); + verify_blueprint(&child_blueprint); + let diff = child_blueprint.diff_since_blueprint(&blueprint); + eprintln!( + "diff between blueprints (expected no changes):\n{}", + diff.display() + ); + assert_eq!(diff.sleds_added.len(), 0); + assert_eq!(diff.sleds_removed.len(), 0); + assert_eq!(diff.sleds_modified.len(), 0); + } + /// Runs through a basic sequence of blueprints for adding a sled #[test] fn test_basic_add_sled() { @@ -1030,6 +1074,7 @@ mod test { &logctx.log, &blueprint5, &input, + &collection, TEST_NAME, ); @@ -1126,6 +1171,7 @@ mod test { &logctx.log, &blueprint2, &input, + &collection, TEST_NAME, ); @@ -1216,6 +1262,7 @@ mod test { &logctx.log, &blueprint2, &input, + &collection, TEST_NAME, ); @@ -1347,6 +1394,7 @@ mod test { &logctx.log, &blueprint2, &input, + &collection, TEST_NAME, ); @@ -1446,6 +1494,7 @@ mod test { &logctx.log, &blueprint3, &input, + &collection, TEST_NAME, ); @@ -1616,6 +1665,7 @@ mod test { &logctx.log, &blueprint3, &input, + &collection, TEST_NAME, ); @@ -1717,6 +1767,7 @@ mod test { &logctx.log, &blueprint2, &input, + &collection, TEST_NAME, ); @@ -1941,6 +1992,7 @@ mod test { &logctx.log, &blueprint2, &input, + &collection, TEST_NAME, ); @@ -1980,30 +2032,32 @@ mod test { .expect("No NTP zone pool?"); // This is mostly for test stability across "example system" changes: - // Find how many other zones are using this same zpool. - let zones_using_zpool = blueprint1.blueprint_zones.iter().fold( - 0, - |acc, (_, zones_config)| { - let mut zones_using_zpool = 0; - for zone_config in &zones_config.zones { - if let Some(pool) = &zone_config.filesystem_pool { - if pool == &pool_to_expunge { - zones_using_zpool += 1; - continue; - } - } - if let Some(pool) = zone_config.zone_type.durable_zpool() { - if pool == &pool_to_expunge { - zones_using_zpool += 1; - continue; - } - } + // Find all the zones using this same zpool. + let mut zones_on_pool = BTreeSet::new(); + let mut zone_kinds_on_pool = BTreeMap::<_, usize>::new(); + for (_, zone_config) in + blueprint1.all_omicron_zones(BlueprintZoneFilter::ShouldBeRunning) + { + let mut on_pool = false; + if let Some(pool) = &zone_config.filesystem_pool { + if pool == &pool_to_expunge { + on_pool = true; } - acc + zones_using_zpool - }, - ); + } else if let Some(pool) = zone_config.zone_type.durable_zpool() { + if pool == &pool_to_expunge { + on_pool = true; + } + } + + if on_pool { + zones_on_pool.insert(zone_config.id); + *zone_kinds_on_pool + .entry(zone_config.zone_type.kind()) + .or_default() += 1; + } + } assert!( - zones_using_zpool > 0, + !zones_on_pool.is_empty(), "We should be expunging at least one zone using this zpool" ); @@ -2037,38 +2091,43 @@ mod test { assert_eq!(summary.sleds_removed.len(), 0); assert_eq!(summary.sleds_modified.len(), 1); - // We should be removing all zones using this zpool. Because we're - // removing the NTP zone, we should add a new one. - assert_eq!(summary.total_zones_added(), 1); + // No zones should have been removed from the blueprint entirely. assert_eq!(summary.total_zones_removed(), 0); - assert_eq!(summary.total_zones_modified(), 6); - let (_zone_id, zones_on_a_modified_sled) = - summary.modified_zones_diff.iter().next().unwrap(); - let added_zones = &zones_on_a_modified_sled.zones.added; - assert_eq!(added_zones.len(), 1); - for (_, zone) in added_zones { - assert_eq!(zone.kind(), ZoneKind::InternalNtp); + // We should have expunged all the zones on this pool. + let mut zones_expunged = BTreeSet::new(); + for zones in summary.diff.blueprint_zones.modified_values_diff() { + for (_, z) in zones.zones.modified() { + assert_eq!( + z.after.disposition, + BlueprintZoneDisposition::Expunged, + "Should have expunged this zone" + ); + zones_expunged.insert(z.after.id); + } } - - assert_eq!( - zones_on_a_modified_sled.zones.modified().count(), - zones_using_zpool - ); - for (_, modified_zone) in zones_on_a_modified_sled.zones.modified_diff() - { - assert_eq!( - *modified_zone.disposition.after, - BlueprintZoneDisposition::Expunged, - "Should have expunged this zone" - ); + assert_eq!(zones_on_pool, zones_expunged); + + // We also should have added back a new zone for each kind that was + // removed, except the Crucible zone (which is specific to the disk). + // Remove the Crucible zone from our original count, then check against + // the added zones count. + assert_eq!(zone_kinds_on_pool.remove(&ZoneKind::Crucible), Some(1)); + let mut zone_kinds_added = BTreeMap::new(); + for zones in summary.diff.blueprint_zones.modified_values_diff() { + for (_, z) in zones.zones.added { + *zone_kinds_added.entry(z.zone_type.kind()).or_default() += + 1_usize; + } } + assert_eq!(zone_kinds_on_pool, zone_kinds_added); // Test a no-op planning iteration. assert_planning_makes_no_changes( &logctx.log, &blueprint2, &input, + &collection, TEST_NAME, ); @@ -2489,6 +2548,7 @@ mod test { &logctx.log, &blueprint3, &input, + &collection, TEST_NAME, ); @@ -2535,6 +2595,7 @@ mod test { &logctx.log, &blueprint4, &input, + &collection, TEST_NAME, ); @@ -2733,6 +2794,7 @@ mod test { &logctx.log, &blueprint2, &input, + &collection, TEST_NAME, ); @@ -2802,6 +2864,7 @@ mod test { &logctx.log, &blueprint2, &input, + &collection, TEST_NAME, ); diff --git a/nexus/types/src/deployment/zone_type.rs b/nexus/types/src/deployment/zone_type.rs index 4f73e461f1e..a330007d62e 100644 --- a/nexus/types/src/deployment/zone_type.rs +++ b/nexus/types/src/deployment/zone_type.rs @@ -167,6 +167,11 @@ impl BlueprintZoneType { matches!(self, BlueprintZoneType::ExternalDns(_)) } + /// Identifies whether this a CockroachDB zone + pub fn is_cockroach(&self) -> bool { + matches!(self, BlueprintZoneType::CockroachDb(_)) + } + /// Identifies whether this a Crucible (not Crucible pantry) zone pub fn is_crucible(&self) -> bool { matches!(self, BlueprintZoneType::Crucible(_))