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 diff --git a/Cargo.lock b/Cargo.lock index 602ae6a21fa..5431c497935 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", @@ -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=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=99251f841debbe9aaceb4a407a984190c63dead5#99251f841debbe9aaceb4a407a984190c63dead5" +source = "git+https://github.com/oxidecomputer/propolis?rev=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc#95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc" dependencies = [ "libc", "strum", @@ -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", @@ -1436,8 +1450,8 @@ dependencies = [ "camino", "camino-tempfile", "chrono", + "daft", "derive_more", - "diffus", "expectorate", "itertools 0.13.0", "omicron-common", @@ -1866,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=d2d8f8ad449df7e2befb7ee2723a442dd74b9b72#d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" dependencies = [ "anyhow", "chrono", @@ -1882,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=d2d8f8ad449df7e2befb7ee2723a442dd74b9b72#d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" dependencies = [ "base64 0.22.1", "crucible-workspace-hack", @@ -1895,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=d2d8f8ad449df7e2befb7ee2723a442dd74b9b72#d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" dependencies = [ "anyhow", "atty", @@ -1925,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=d2d8f8ad449df7e2befb7ee2723a442dd74b9b72#d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" dependencies = [ "anyhow", "chrono", @@ -1942,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=d2d8f8ad449df7e2befb7ee2723a442dd74b9b72#d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" dependencies = [ "crucible-workspace-hack", "libc", @@ -2054,6 +2068,30 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "daft" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a75caf1eeef382d47bf5d3012b5ec521311cd876a1304ac8807ec86d4df42a7" +dependencies = [ + "daft-derive", + "newtype-uuid", + "oxnet", + "paste", + "uuid", +] + +[[package]] +name = "daft-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a851e4efac7afda4a5e1a11fea1d65ef528dbdcff08177d7087e4bb6225e60a9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "darling" version = "0.20.10" @@ -2147,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", @@ -2347,9 +2385,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", @@ -2411,28 +2449,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" @@ -2622,6 +2638,7 @@ dependencies = [ "serde_json", "slog", "toml 0.8.19", + "typify 0.3.0", "uuid", ] @@ -3658,13 +3675,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", @@ -3887,9 +3904,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", @@ -3906,9 +3923,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", @@ -3930,9 +3947,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", @@ -3951,9 +3968,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", @@ -4476,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" @@ -4855,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", @@ -4973,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", @@ -5072,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", @@ -5082,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", @@ -5146,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", @@ -5502,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", @@ -6125,8 +6120,8 @@ dependencies = [ "anyhow", "chrono", "clickhouse-admin-types", + "daft", "debug-ignore", - "diffus", "expectorate", "gateway-client", "illumos-utils", @@ -6253,7 +6248,7 @@ dependencies = [ name = "nexus-sled-agent-shared" version = "0.1.0" dependencies = [ - "diffus", + "daft", "illumos-utils", "omicron-common", "omicron-passwords", @@ -6354,9 +6349,9 @@ dependencies = [ "clap", "clickhouse-admin-types", "cookie", + "daft", "derive-where", "derive_more", - "diffus", "dropshot 0.15.1", "futures", "gateway-client", @@ -6793,7 +6788,7 @@ dependencies = [ "camino", "camino-tempfile", "chrono", - "diffus", + "daft", "dropshot 0.15.1", "expectorate", "futures", @@ -6973,7 +6968,7 @@ version = "0.1.0" dependencies = [ "anyhow", "camino", - "cargo_metadata", + "cargo_metadata 0.18.1", "clap", "expectorate", "newtype_derive", @@ -7089,7 +7084,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=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc)", "qorb", "rand", "range-requests", @@ -7208,7 +7203,7 @@ version = "0.1.0" dependencies = [ "anyhow", "camino", - "cargo_metadata", + "cargo_metadata 0.18.1", "clap", "expectorate", "futures", @@ -7262,7 +7257,7 @@ version = "0.1.0" dependencies = [ "anyhow", "camino", - "cargo_metadata", + "cargo_metadata 0.18.1", "fs-err", "omicron-workspace-hack", "serde", @@ -7276,7 +7271,7 @@ dependencies = [ "anyhow", "camino", "camino-tempfile", - "cargo_metadata", + "cargo_metadata 0.18.1", "chrono", "clap", "fs-err", @@ -7376,7 +7371,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=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc)", "propolis-mock-server", "propolis_api_types", "rand", @@ -7470,7 +7465,7 @@ dependencies = [ name = "omicron-uuid-kinds" version = "0.1.0" dependencies = [ - "diffus", + "daft", "newtype-uuid", "paste", "proptest", @@ -7778,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", @@ -7797,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", @@ -7810,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", @@ -7879,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", @@ -8201,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", @@ -8445,9 +8441,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", ] @@ -9161,7 +9157,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=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc#95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc" dependencies = [ "async-trait", "base64 0.21.7", @@ -9206,7 +9202,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=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc#95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc" dependencies = [ "anyhow", "atty", @@ -9248,7 +9244,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=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc#95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc" dependencies = [ "crucible-client-types", "propolis_types", @@ -9262,7 +9258,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=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc#95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc" dependencies = [ "schemars", "serde", @@ -10889,7 +10885,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=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc)", "regress 0.9.1", "reqwest", "schemars", @@ -10915,7 +10911,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=95d6a559890c94e3aa62c8adcd7c4e123ec4c6dc)", "rcgen", "schemars", "serde", @@ -11727,9 +11723,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 +12976,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 +13741,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 7fa49f6298f..34dca94a31a 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" @@ -362,13 +362,14 @@ 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 = "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" +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" } @@ -377,9 +378,8 @@ 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" -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" } @@ -412,15 +412,15 @@ 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" 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" @@ -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" } @@ -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 = "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" @@ -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-controller = { 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/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/clients/dpd-client/Cargo.toml b/clients/dpd-client/Cargo.toml index 04240ea5bb9..19e8a1f7187 100644 --- a/clients/dpd-client/Cargo.toml +++ b/clients/dpd-client/Cargo.toml @@ -8,18 +8,18 @@ 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 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 +29,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..3d10b919019 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 @@ -75,29 +75,30 @@ 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"); + + 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/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/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/common/src/api/external/mod.rs b/common/src/api/external/mod.rs index f4b657a1a59..2ee0fa8c485 100644 --- a/common/src/api/external/mod.rs +++ b/common/src/api/external/mod.rs @@ -13,12 +13,11 @@ 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; use chrono::Utc; -use diffus::{edit, Diffable, Diffus}; +use daft::Diffable; use dropshot::HttpError; pub use dropshot::PaginationOrder; pub use error::*; @@ -226,7 +225,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 @@ -636,7 +635,7 @@ impl JsonSchema for RoleName { Eq, PartialOrd, Ord, - Diffus, + Diffable, )] pub struct ByteCount(u64); @@ -756,14 +755,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, @@ -771,28 +766,16 @@ impl From for i64 { PartialEq, PartialOrd, Serialize, + Diffable, )] +#[daft(leaf)] 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) } @@ -810,15 +793,29 @@ 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", + ) + }) + } +} + impl Display for Generation { fn fmt(&self, f: &mut Formatter<'_>) -> FormatResult { f.write_str(&self.0.to_string()) @@ -828,8 +825,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() } } @@ -847,26 +842,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, @@ -2044,24 +2056,11 @@ impl JsonSchema for L4PortRange { Ord, SerializeDisplay, Hash, + Diffable, )] +#[daft(leaf)] 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), - } - } - } -} - 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 @@ -2225,7 +2224,7 @@ impl JsonSchema for MacAddr { Deserialize, Serialize, JsonSchema, - Diffus, + Diffable, )] pub struct Vni(u32); @@ -3267,6 +3266,7 @@ mod test { use serde::Deserialize; use serde::Serialize; + use super::Generation; use super::RouteDestination; use super::RouteTarget; use super::SemverVersion; @@ -3589,6 +3589,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!( 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..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 diffus::Diffus; +use daft::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,7 +39,8 @@ 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, Diffable)] +#[daft(leaf)] pub struct ZpoolName { id: ZpoolUuid, kind: ZpoolKind, 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/dev-tools/omdb/src/bin/omdb/db.rs b/dev-tools/omdb/src/bin/omdb/db.rs index c5f8a1f26c5..287b9b8b553 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; @@ -77,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; @@ -94,6 +94,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; @@ -144,6 +145,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 +271,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)] @@ -297,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 @@ -307,8 +328,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 +565,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 @@ -827,6 +840,8 @@ enum VolumeCommands { Info(VolumeInfoArgs), /// Summarize current volumes List, + /// What is holding the lock? + LockHolder(VolumeLockHolderArgs), } #[derive(Debug, Args, Clone)] @@ -835,6 +850,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)] @@ -892,14 +913,13 @@ 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 fetch_opts = &self.fetch_opts; + self.db_url_opts.with_datastore(omdb, log, |opctx, datastore| { async move { - match &command { + 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 } @@ -944,14 +964,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, @@ -1131,11 +1143,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) @@ -1147,9 +1162,7 @@ impl DbArgs { } } } - }.await; - datastore.terminate().await; - res + }).await } } @@ -1411,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, @@ -2329,6 +2413,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, @@ -2965,11 +3145,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 replacement {request_id} created"); + 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"); + } Ok(()) } @@ -4345,12 +4533,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!(); @@ -4382,10 +4580,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!(); @@ -5926,35 +6136,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/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/src/bin/omdb/reconfigurator.rs b/dev-tools/omdb/src/bin/omdb/reconfigurator.rs new file mode 100644 index 00000000000..1af0c790b7e --- /dev/null +++ b/dev-tools/omdb/src/bin/omdb/reconfigurator.rs @@ -0,0 +1,194 @@ +// 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::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 +#[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), + /// 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)] +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<()> { + 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 + } +} + +/// 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(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/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 617d159a00e..1672d2ac283 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) --------------------------------------------- @@ -348,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 @@ -624,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 @@ -1115,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 @@ -1348,6 +1357,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 @@ -1373,6 +1388,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 @@ -1426,6 +1453,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 @@ -1451,6 +1484,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 @@ -1525,15 +1570,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: @@ -1561,3 +1606,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..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 { @@ -135,7 +138,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 +163,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 +201,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..44b7d13aed7 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) @@ -111,12 +113,13 @@ 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 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 @@ -162,12 +165,13 @@ 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 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 @@ -822,3 +826,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'. +============================================= 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..de70fa82ea6 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 > @@ -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 @@ -225,9 +386,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 > @@ -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/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/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": { 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/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-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-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/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 8881d7dd0ed..16e29ef5dc7 100644 --- a/nexus/db-model/src/schema.rs +++ b/nexus/db-model/src/schema.rs @@ -1221,6 +1221,7 @@ table! { vpc_router_id -> Uuid, target -> Text, destination -> Text, + vpc_subnet_id -> Nullable, } } @@ -1986,14 +1987,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 852de12f4c5..2b1e870582e 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(125, 0, 0); /// List of all past database schema versions, in *reverse* order /// @@ -29,7 +29,9 @@ 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, "affinity"), + KnownVersion::new(125, "affinity"), + 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"), 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/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, 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/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/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/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/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/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/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_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..0c9217dffdf 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; @@ -34,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) { @@ -65,8 +69,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 @@ -95,7 +99,7 @@ pub(crate) async fn deploy_zones( .await; if errors.is_empty() { - Ok(()) + Ok(DeployZonesDone(())) } else { Err(errors) } @@ -107,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 { @@ -430,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"); @@ -488,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"); @@ -505,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(); @@ -591,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(); @@ -642,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 @@ -652,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"); @@ -698,6 +708,7 @@ mod test { datastore, &fake_resolver, iter::once((any_sled_id, &crdb_zone)), + &deploy_zones_done, ) .await .expect("decommissioned test node"); @@ -729,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"); @@ -757,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; 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 aad29e924e5..bc7544b0ba8 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)" + ) + } } } } @@ -474,24 +501,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 @@ -513,7 +549,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) @@ -544,6 +581,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); } @@ -655,18 +714,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. @@ -812,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}" + )) + })?; - zones_to_expunge.insert(zone_id, reason); + let mut zones_to_expunge = Vec::new(); + + 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 @@ -1987,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; @@ -1996,6 +2066,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; @@ -2015,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"; @@ -2127,10 +2171,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 { @@ -2195,6 +2239,7 @@ pub mod test { &logctx.log, &blueprint3, &input, + &example.collection, TEST_NAME, ); @@ -2202,9 +2247,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 +2294,7 @@ pub mod test { &blueprint1, &input, &collection, - "test_prune_decommissioned_sleds", + "test_decommissioned_sleds", ) .expect("created builder") .build(); @@ -2279,34 +2323,42 @@ 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), ); - // Test a no-op planning iteration. - assert_planning_makes_no_changes( + // 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, - TEST_NAME, + &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), ); logctx.cleanup_successful(); @@ -2753,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) @@ -2808,6 +2871,7 @@ pub mod test { &logctx.log, &blueprint, &input, + &collection, TEST_NAME, ); @@ -2839,4 +2903,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.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 8ba56613692..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; @@ -20,13 +22,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; @@ -59,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")] @@ -227,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, @@ -268,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) } @@ -283,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) } @@ -296,6 +333,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)] @@ -411,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, @@ -439,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( @@ -473,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 @@ -487,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() { @@ -498,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 @@ -514,6 +588,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/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 db818047444..fb504d2e2b6 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( @@ -128,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, @@ -143,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/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 a6965e4d6dd..5fb0bf49c9f 100644 --- a/nexus/reconfigurator/planning/src/planner.rs +++ b/nexus/reconfigurator/planning/src/planner.rs @@ -11,19 +11,23 @@ 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::OmicronZoneType; 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 +181,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 +212,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 @@ -272,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 @@ -697,101 +808,23 @@ 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, } #[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; @@ -799,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::BlueprintDiff; - use nexus_types::deployment::BlueprintZoneDisposition; - use nexus_types::deployment::BlueprintZoneFilter; + use nexus_types::deployment::BlueprintDiffSummary; 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; @@ -823,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; @@ -837,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() { @@ -869,21 +920,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 +957,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 +1001,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. @@ -964,9 +1020,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 = @@ -985,29 +1040,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_eq!(zones_cfg_diff.zones.modified().count(), 0); // 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:?}"); } @@ -1019,6 +1074,7 @@ mod test { &logctx.log, &blueprint5, &input, + &collection, TEST_NAME, ); @@ -1080,28 +1136,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:?}"); } @@ -1112,6 +1171,7 @@ mod test { &logctx.log, &blueprint2, &input, + &collection, TEST_NAME, ); @@ -1158,20 +1218,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_eq!(zones_cfg_diff.zones.modified().count(), 0); + let zones_added = &zones_cfg_diff.zones.added; match zones_added.len() { n @ (3 | 4) => { total_new_nexus_zones += n; @@ -1180,7 +1249,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:?}"); } @@ -1193,6 +1262,7 @@ mod test { &logctx.log, &blueprint2, &input, + &collection, TEST_NAME, ); @@ -1283,38 +1353,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_eq!(zones_diff.modified().count(), 0); + 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); @@ -1323,6 +1394,7 @@ mod test { &logctx.log, &blueprint2, &input, + &collection, TEST_NAME, ); @@ -1422,6 +1494,7 @@ mod test { &logctx.log, &blueprint3, &input, + &collection, TEST_NAME, ); @@ -1592,6 +1665,7 @@ mod test { &logctx.log, &blueprint3, &input, + &collection, TEST_NAME, ); @@ -1669,28 +1743,31 @@ 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( &logctx.log, &blueprint2, &input, + &collection, TEST_NAME, ); @@ -1752,25 +1829,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 +1915,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 +1946,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.modified_datasets_diff { - 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_values_diff() + { + 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.modified_zones_diff.iter().next().unwrap(); + assert_eq!(modified_zones.zones.modified().count(), 1); + let (_, modified_zone) = + &modified_zones.zones.modified_diff().next().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" ); @@ -1908,6 +1992,7 @@ mod test { &logctx.log, &blueprint2, &input, + &collection, TEST_NAME, ); @@ -1947,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" ); @@ -1998,40 +2085,49 @@ 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); - - // 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!(zone.kind(), ZoneKind::InternalNtp); + 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); + + // No zones should have been removed from the blueprint entirely. + assert_eq!(summary.total_zones_removed(), 0); + + // 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); + } } - - 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!( - modified_zone.zone.disposition, - 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, ); @@ -2154,14 +2250,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 +2268,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 +2289,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 +2400,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 +2421,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_values_diff() { 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 +2530,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 ); @@ -2439,6 +2548,7 @@ mod test { &logctx.log, &blueprint3, &input, + &collection, TEST_NAME, ); @@ -2467,16 +2577,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 ); @@ -2485,6 +2595,7 @@ mod test { &logctx.log, &blueprint4, &input, + &collection, TEST_NAME, ); @@ -2683,6 +2794,7 @@ mod test { &logctx.log, &blueprint2, &input, + &collection, TEST_NAME, ); @@ -2752,6 +2864,7 @@ mod test { &logctx.log, &blueprint2, &input, + &collection, TEST_NAME, ); 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_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_decommissions_sleds_bp2.txt b/nexus/reconfigurator/planning/tests/output/planner_decommissions_sleds_bp2.txt index 0fb9e45ef10..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: @@ -114,7 +221,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_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 f070fc076cd..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: @@ -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: --------------------------------------------------------------------------------------------- @@ -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/reconfigurator/planning/tests/output/planner_nonprovisionable_bp2.txt b/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_bp2.txt index 71a5c03184d..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: @@ -175,7 +328,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 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/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/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/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/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/test-utils/src/background.rs b/nexus/test-utils/src/background.rs index b01046543bf..b7a30b88bfe 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 @@ -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() @@ -346,34 +344,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..84c53d4a606 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,12 +31,14 @@ 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; 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; @@ -86,6 +93,121 @@ where .all_items } +pub(crate) async fn wait_for_all_replacements( + datastore: &Arc, + internal_client: &ClientTestContext, +) { + 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. 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. + // + // 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(); + + 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, + ); + + return Err(CondCheckError::<()>::NotYet); + } + + // 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); + } + + Ok(()) + } + }, + &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 +397,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 +417,6 @@ mod region_replacement { ); // Assert there are no more Crucible resources - assert!(self.disk_test.crucible_resources_deleted().await); } @@ -357,27 +479,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 +576,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 +900,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 +950,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 +962,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 +1035,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 +1132,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 +1194,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 +1225,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 +1244,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 +1463,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 +1543,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 +1653,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 +1883,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 +2042,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 +2148,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 +2162,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 @@ -1936,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 = @@ -2013,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, @@ -2023,8 +2273,10 @@ async fn test_region_replacement_triple_sanity_2( .unwrap(); } + info!(log, "waiting for all replacements"); + // 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 { @@ -2041,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, @@ -2051,8 +2305,10 @@ async fn test_region_replacement_triple_sanity_2( .unwrap(); } + info!(log, "waiting for all replacements"); + // 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 +2321,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 cbc041f741a..6e8836ecac7 100644 --- a/nexus/tests/integration_tests/schema.rs +++ b/nexus/tests/integration_tests/schema.rs @@ -1557,6 +1557,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. @@ -1597,6 +1669,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/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/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..d25bf7bdaac 100644 --- a/nexus/types/src/deployment.rs +++ b/nexus/types/src/deployment.rs @@ -18,7 +18,8 @@ use crate::inventory::Collection; pub use crate::inventory::SourceNatConfig; pub use crate::inventory::ZpoolName; use blueprint_diff::ClickhouseClusterConfigDiffTablesForSingleBlueprint; -use diffus::Diffus; +use blueprint_display::BpDatasetsTableSchema; +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 +35,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 +54,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 +62,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 +100,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 +141,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 +189,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 +287,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 @@ -331,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) @@ -456,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("")) )?; @@ -473,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 {}, @@ -482,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 {}, @@ -528,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(), + ) + )?; } } @@ -550,7 +609,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. @@ -563,33 +622,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(), } } @@ -647,7 +703,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 +723,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 +774,7 @@ impl From for OmicronZoneConfig { Deserialize, Serialize, EnumIter, - Diffus, + Diffable, )] #[serde(rename_all = "snake_case")] pub enum BlueprintZoneDisposition { @@ -868,7 +918,7 @@ pub enum BlueprintDatasetFilter { Deserialize, Serialize, EnumIter, - Diffus, + Diffable, )] #[serde(rename_all = "snake_case")] pub enum BlueprintPhysicalDiskDisposition { @@ -901,7 +951,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,13 +964,40 @@ 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, 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; @@ -929,12 +1006,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 { @@ -955,36 +1026,38 @@ 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, Diffus, + Debug, Clone, Eq, PartialEq, JsonSchema, Deserialize, Serialize, Diffable, )] pub struct BlueprintDatasetsConfig { pub generation: Generation, 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(), } } @@ -1014,7 +1087,7 @@ impl IdMappable for BlueprintDatasetConfig { Deserialize, Serialize, EnumIter, - Diffus, + Diffable, )] #[serde(rename_all = "snake_case")] pub enum BlueprintDatasetDisposition { @@ -1042,6 +1115,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, @@ -1053,12 +1137,10 @@ impl BlueprintDatasetDisposition { JsonSchema, Deserialize, Serialize, - Diffus, + 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, @@ -1091,6 +1173,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(), @@ -1130,14 +1213,10 @@ 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)] +#[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, @@ -1156,40 +1235,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 @@ -1225,6 +1270,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, diff --git a/nexus/types/src/deployment/blueprint_diff.rs b/nexus/types/src/deployment/blueprint_diff.rs index 72c08557f45..c43476a353b 100644 --- a/nexus/types/src/deployment/blueprint_diff.rs +++ b/nexus/types/src/deployment/blueprint_diff.rs @@ -11,26 +11,625 @@ 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, + BlueprintDatasetDisposition, 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_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::{ - 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 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, + 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); + + 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. + 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.is_unchanged(sled_id) + && !diff.blueprint_disks.added.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.is_modified(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.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.is_modified(sled_id) + && !diff.blueprint_datasets.removed.contains_key(sled_id) + && !diff.blueprint_datasets.added.contains_key(sled_id) + && !diff.blueprint_datasets.is_modified(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, + modified_zones_diff, + modified_disks_diff, + modified_datasets_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 + .modified_zones_diff + .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 + .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.modified_zones_diff + .values() + .fold(0, |acc, c| acc + c.zones.modified().count()) + } + + /// 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 + .modified_disks_diff + .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 + .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.modified_disks_diff + .values() + .fold(0, |acc, c| acc + c.disks.modified().count()) + } + + /// 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 + .modified_datasets_diff + .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 + .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.modified_datasets_diff + .values() + .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<&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<&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<&BlueprintDatasetsConfigDiff<'a>> { + self.modified_datasets_diff.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.modified_zones_diff.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.modified_zones_diff.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.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, + modified_zones, + )) + } + + /// 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.get_unchanged(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.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), + unchanged_zones, + )) + } + + /// 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.modified_disks_diff.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.modified_disks_diff.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.get_unchanged(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.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), + unchanged_disks, + )) + } + + /// 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.modified_datasets_diff.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.modified_datasets_diff.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.get_unchanged(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.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), + unchanged_datasets, + )) + } + + /// Iterate over all modified datasets on a sled + pub fn modified_datasets( + &'a self, + sled_id: &SledUuid, + ) -> Option<(BpDiffDatasetsModified, BpDiffDatasetErrors)> { + // Check if the sled is modified and there are any modified datasets + 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, + modified_datasets, + )) + } +} /// Diffs for omicron zones on a given sled with a given `BpDiffState` #[derive(Debug)] @@ -40,6 +639,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 +696,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.cloned(), + 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 +756,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 { @@ -166,8 +806,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, @@ -176,8 +816,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 +832,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 +916,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 +960,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 +1017,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 { @@ -576,44 +1058,192 @@ 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 before: BlueprintDatasetConfig, - pub after: BlueprintDatasetConfig, + 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.copied(), + reservation: reservation.before.copied(), + 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.copied(), + quota: quota.after.copied(), + reservation: reservation.after.copied(), + compression: *compression.after, + }, + }) + } else { + Err(BpDiffDatasetError { dataset_id: *id.after, reason }) + } + } } #[derive(Debug)] pub struct BpDiffDatasetsModified { - pub generation_before: Option, - pub generation_after: Option, + pub generation_before: Generation, + pub generation_after: Generation, pub datasets: Vec, } +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: 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(); - - 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); - } + let ModifiableDatasetProperties { + disposition: before_disposition, + quota: before_quota, + reservation: before_reservation, + compression: before_compression, + } = &dataset.prior_properties; - BpTableRow::new(state, columns) + 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(), + ), + ], + ) }) } } @@ -624,144 +1254,34 @@ pub struct BpDiffDatasets { pub removed: BTreeMap, pub modified: BTreeMap, pub unchanged: BTreeMap, + pub errors: BTreeMap, } impl BpDiffDatasets { - pub fn new( - before: BTreeMap, - mut after: BTreeMap, + pub fn from_diff_summary<'a>( + 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, errors)) = summary.modified_datasets(sled_id) + { + diffs.modified.insert(*sled_id, modified); + if !errors.errors.is_empty() { + diffs.errors.insert(*sled_id, errors); + } } } - 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 +1314,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 +1522,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 +1706,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, } 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 +1740,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 +1791,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 +1847,59 @@ 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 + .get_unchanged(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.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.get_unchanged(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 +1918,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 +1931,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 +1944,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 +1957,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 +1970,9 @@ impl fmt::Display for BlueprintDiffDisplay<'_> { } // Write out zone errors. - if !diff.zones.errors.is_empty() { - writeln!(f, "ERRORS:")?; - for (sled_id, errors) in &diff.zones.errors { + if !self.zones.errors.is_empty() { + writeln!(f, "ZONE ERRORS:")?; + for (sled_id, errors) in &self.zones.errors { writeln!(f, "\n sled {sled_id}\n")?; writeln!( f, @@ -1695,7 +1981,25 @@ 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)?; + } + } + } + + // 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)?; } } diff --git a/nexus/types/src/deployment/blueprint_display.rs b/nexus/types/src/deployment/blueprint_display.rs index b1c1e0fa80c..2cf664e0c19 100644 --- a/nexus/types/src/deployment/blueprint_display.rs +++ b/nexus/types/src/deployment/blueprint_display.rs @@ -122,16 +122,21 @@ impl fmt::Display for BpGeneration { } } +#[derive(Debug)] 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 +158,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 +283,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 +308,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}"); @@ -352,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", + ] } } 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..a330007d62e 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 { @@ -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(_)) @@ -331,7 +336,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 +356,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct BoundaryNtp { pub address: SocketAddrV6, @@ -374,7 +379,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct Clickhouse { pub address: SocketAddrV6, @@ -391,7 +396,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct ClickhouseKeeper { pub address: SocketAddrV6, @@ -409,7 +414,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct ClickhouseServer { pub address: SocketAddrV6, @@ -426,7 +431,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct CockroachDb { pub address: SocketAddrV6, @@ -443,7 +448,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct Crucible { pub address: SocketAddrV6, @@ -460,7 +465,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct CruciblePantry { pub address: SocketAddrV6, @@ -476,7 +481,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct ExternalDns { pub dataset: OmicronZoneDataset, @@ -498,7 +503,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct InternalDns { pub dataset: OmicronZoneDataset, @@ -527,7 +532,7 @@ pub mod blueprint_zone_type { JsonSchema, Deserialize, Serialize, - Diffus, + Diffable, )] pub struct InternalNtp { pub address: SocketAddrV6, @@ -543,7 +548,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 +573,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 fe93e4cae60..ce1387330c2 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::{ AffinityPolicy, AllowedSourceIps as ExternalAllowedSourceIps, ByteCount, Digest, Error, FailureDomain, IdentityMetadata, InstanceState, Name, @@ -723,7 +723,7 @@ impl fmt::Display for SledPolicy { PartialEq, Eq, EnumIter, - Diffus, + Diffable, )] #[serde(rename_all = "snake_case")] pub enum SledState { 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/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/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] 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 2afe01b8d7c..f5102a38491 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 = "d2d8f8ad449df7e2befb7ee2723a442dd74b9b72" # 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 = "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 = "86a2ce1f9f13912a5fe652472de765ec5fc22e76" +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 = "70b9423e0851afe9411957cd5ac515add0cd52dbe98a50f31c8c85ac7a43299c" +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 = "86a2ce1f9f13912a5fe652472de765ec5fc22e76" +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 = "580e0ccb93c24835ada62b40a054042ab301fce3e1c26cd6b29611a60829f545" +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 = "99251f841debbe9aaceb4a407a984190c63dead5" +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 = "53721913ee25b2c649cd845c542fb1ebf86d3e61c68af4002fcfad60050c9e54" +source.sha256 = "ea5288f8ae6f3f6039fd3a6b5f7823f6968f273cfc321d7f20ab41c999814217" output.type = "zone" [package.mg-ddm-gz] @@ -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 @@ -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 = "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 = "11bcc3e0f5d28dc7aed150f4df1174844e4dfbef" -source.sha256 = "e1f356866490e8cada9e53c25c4ef9965af0a29632868948edcacb13e248648d" +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 = "11bcc3e0f5d28dc7aed150f4df1174844e4dfbef" -source.sha256 = "6a4b51d71d132f8877c15c5a3882bad715a85d11d4a45c1aec9b5f4cb2ea8a6e" +source.commit = "b37a8fdc335592e24d6afe71995637b2ad36eb7d" +source.sha256 = "2b502172b3877f07026a26054e3a34ac64ba053d6e5861375dcd87dac6ce6c27" output.type = "zone" output.intermediate_only = true 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" diff --git a/schema/crdb/dbinit.sql b/schema/crdb/dbinit.sql index b8e110788d6..9ce210346ee 100644 --- a/schema/crdb/dbinit.sql +++ b/schema/crdb/dbinit.sql @@ -1440,11 +1440,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. @@ -1854,7 +1861,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 ( @@ -1863,6 +1885,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, @@ -4635,8 +4663,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', @@ -4647,14 +4673,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, @@ -4664,10 +4695,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', @@ -4913,7 +4957,7 @@ INSERT INTO omicron.public.db_metadata ( version, target_version ) VALUES - (TRUE, NOW(), NOW(), '123.0.0', NULL) + (TRUE, NOW(), NOW(), '125.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/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..e5be7a33ba1 --- /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.time_deleted IS NULL 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.time_deleted IS NULL 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'; 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/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/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?; diff --git a/sled-agent/src/services.rs b/sled-agent/src/services.rs index 4eba7e13c2e..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::{ @@ -94,6 +95,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 +292,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 +319,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(), ) @@ -375,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 @@ -624,6 +698,7 @@ struct StartZonesResult { } // A running zone and the configuration which started it. +#[derive(Debug)] struct OmicronZone { runtime: RunningZone, config: OmicronZoneConfigLocal, @@ -2680,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( @@ -2843,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( @@ -2895,6 +2952,7 @@ impl ServiceManager { if is_gimlet || asic == &DendriteAsic::SoftNpuPropolisDevice + || asic == &DendriteAsic::TofinoAsic { tfport_config = tfport_config.add_property( "pkt_source", @@ -3491,8 +3549,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 +3568,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 +3598,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, @@ -4394,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( @@ -4497,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 @@ -4697,6 +4764,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 +5869,8 @@ mod illumos_tests { #[cfg(test)] mod test { + use omicron_uuid_kinds::ZpoolUuid; + use super::*; #[test] @@ -5672,4 +5903,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/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(), 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()), } } 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. diff --git a/tools/console_version b/tools/console_version index 8869949321a..b46740bd862 100644 --- a/tools/console_version +++ b/tools/console_version @@ -1,2 +1,2 @@ -COMMIT="288f1c1be15e51eff77cca0d5d6f117401155603" -SHA2="07b51ac8103db11c9b167b8f245fb0991973ce1f8d6eaafa7eeb7b1e1ffe9b25" +COMMIT="7de4b11a043dc026e25a94858d3d89b817622e6d" +SHA2="5a687d1d4607ff13f6060321f8c1526604d92250ef5ddfe2c0f975ae2b942345" diff --git a/tools/dendrite_openapi_version b/tools/dendrite_openapi_version index c28f3631a82..be6aed1fc07 100755 --- a/tools/dendrite_openapi_version +++ b/tools/dendrite_openapi_version @@ -1,2 +1,2 @@ -COMMIT="11bcc3e0f5d28dc7aed150f4df1174844e4dfbef" -SHA2="c381b2ac42fbd68b9230e111cb96beecf90abde10cdc15f02c88d61781c8adb8" +COMMIT="b37a8fdc335592e24d6afe71995637b2ad36eb7d" +SHA2="72b4489e522778ea91979bcba94d9392ab4d5318f19f49aca2388791bb709778" diff --git a/tools/dendrite_stub_checksums b/tools/dendrite_stub_checksums index 171c6b524f3..b53e4866a3d 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="022cf1eddf9a8a4042db95ce03d24c3b703f6552bafde0bde3e10d2c138a1e3f" +CIDL_SHA256_LINUX_DPD="bbc6eebae357df8075c359e04c88842c6d38eff3079984bbbf5b102504495804" +CIDL_SHA256_LINUX_SWADM="d0a792165b6a70700071e36d3ea358f6098300aff8b7bfe2942e324d0dcc9443" 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" 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 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 a27fc43b8e0..0d66b230c84 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 >] { diff --git a/workspace-hack/Cargo.toml b/workspace-hack/Cargo.toml index c53cf44a114..744c3a1f375 100644 --- a/workspace-hack/Cargo.toml +++ b/workspace-hack/Cargo.toml @@ -64,7 +64,7 @@ getrandom = { version = "0.2.15", default-features = false, features = ["js", "r group = { version = "0.13.0", default-features = false, features = ["alloc"] } hashbrown = { version = "0.15.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" } @@ -184,7 +184,7 @@ getrandom = { version = "0.2.15", default-features = false, features = ["js", "r group = { version = "0.13.0", default-features = false, features = ["alloc"] } hashbrown = { version = "0.15.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" }