diff --git a/dev-tools/omdb/tests/successes.out b/dev-tools/omdb/tests/successes.out index 1672d2ac28..bbeeeec024 100644 --- a/dev-tools/omdb/tests/successes.out +++ b/dev-tools/omdb/tests/successes.out @@ -1342,19 +1342,19 @@ parent: sled: ..................... (active) physical disks at generation 2: - --------------------------------------------------- - vendor model serial - --------------------------------------------------- - nexus-tests nexus-test-model nexus-test-disk-10 - nexus-tests nexus-test-model nexus-test-disk-11 - nexus-tests nexus-test-model nexus-test-disk-12 - nexus-tests nexus-test-model nexus-test-disk-13 - nexus-tests nexus-test-model nexus-test-disk-14 - nexus-tests nexus-test-model nexus-test-disk-15 - nexus-tests nexus-test-model nexus-test-disk-16 - nexus-tests nexus-test-model nexus-test-disk-17 - nexus-tests nexus-test-model nexus-test-disk-18 - nexus-tests nexus-test-model nexus-test-disk-19 + ----------------------------------------------------------------- + vendor model serial disposition + ----------------------------------------------------------------- + nexus-tests nexus-test-model nexus-test-disk-10 in service + nexus-tests nexus-test-model nexus-test-disk-11 in service + nexus-tests nexus-test-model nexus-test-disk-12 in service + nexus-tests nexus-test-model nexus-test-disk-13 in service + nexus-tests nexus-test-model nexus-test-disk-14 in service + nexus-tests nexus-test-model nexus-test-disk-15 in service + nexus-tests nexus-test-model nexus-test-disk-16 in service + nexus-tests nexus-test-model nexus-test-disk-17 in service + nexus-tests nexus-test-model nexus-test-disk-18 in service + nexus-tests nexus-test-model nexus-test-disk-19 in service datasets at generation 2: @@ -1373,19 +1373,19 @@ parent: sled: ..................... (active) physical disks at generation 2: - -------------------------------------------------- - vendor model serial - -------------------------------------------------- - nexus-tests nexus-test-model nexus-test-disk-0 - nexus-tests nexus-test-model nexus-test-disk-1 - nexus-tests nexus-test-model nexus-test-disk-2 - nexus-tests nexus-test-model nexus-test-disk-3 - nexus-tests nexus-test-model nexus-test-disk-4 - nexus-tests nexus-test-model nexus-test-disk-5 - nexus-tests nexus-test-model nexus-test-disk-6 - nexus-tests nexus-test-model nexus-test-disk-7 - nexus-tests nexus-test-model nexus-test-disk-8 - nexus-tests nexus-test-model nexus-test-disk-9 + ---------------------------------------------------------------- + vendor model serial disposition + ---------------------------------------------------------------- + nexus-tests nexus-test-model nexus-test-disk-0 in service + nexus-tests nexus-test-model nexus-test-disk-1 in service + nexus-tests nexus-test-model nexus-test-disk-2 in service + nexus-tests nexus-test-model nexus-test-disk-3 in service + nexus-tests nexus-test-model nexus-test-disk-4 in service + nexus-tests nexus-test-model nexus-test-disk-5 in service + nexus-tests nexus-test-model nexus-test-disk-6 in service + nexus-tests nexus-test-model nexus-test-disk-7 in service + nexus-tests nexus-test-model nexus-test-disk-8 in service + nexus-tests nexus-test-model nexus-test-disk-9 in service datasets at generation 2: @@ -1438,19 +1438,19 @@ parent: sled: ..................... (active) physical disks at generation 2: - --------------------------------------------------- - vendor model serial - --------------------------------------------------- - nexus-tests nexus-test-model nexus-test-disk-10 - nexus-tests nexus-test-model nexus-test-disk-11 - nexus-tests nexus-test-model nexus-test-disk-12 - nexus-tests nexus-test-model nexus-test-disk-13 - nexus-tests nexus-test-model nexus-test-disk-14 - nexus-tests nexus-test-model nexus-test-disk-15 - nexus-tests nexus-test-model nexus-test-disk-16 - nexus-tests nexus-test-model nexus-test-disk-17 - nexus-tests nexus-test-model nexus-test-disk-18 - nexus-tests nexus-test-model nexus-test-disk-19 + ----------------------------------------------------------------- + vendor model serial disposition + ----------------------------------------------------------------- + nexus-tests nexus-test-model nexus-test-disk-10 in service + nexus-tests nexus-test-model nexus-test-disk-11 in service + nexus-tests nexus-test-model nexus-test-disk-12 in service + nexus-tests nexus-test-model nexus-test-disk-13 in service + nexus-tests nexus-test-model nexus-test-disk-14 in service + nexus-tests nexus-test-model nexus-test-disk-15 in service + nexus-tests nexus-test-model nexus-test-disk-16 in service + nexus-tests nexus-test-model nexus-test-disk-17 in service + nexus-tests nexus-test-model nexus-test-disk-18 in service + nexus-tests nexus-test-model nexus-test-disk-19 in service datasets at generation 2: @@ -1469,19 +1469,19 @@ parent: sled: ..................... (active) physical disks at generation 2: - -------------------------------------------------- - vendor model serial - -------------------------------------------------- - nexus-tests nexus-test-model nexus-test-disk-0 - nexus-tests nexus-test-model nexus-test-disk-1 - nexus-tests nexus-test-model nexus-test-disk-2 - nexus-tests nexus-test-model nexus-test-disk-3 - nexus-tests nexus-test-model nexus-test-disk-4 - nexus-tests nexus-test-model nexus-test-disk-5 - nexus-tests nexus-test-model nexus-test-disk-6 - nexus-tests nexus-test-model nexus-test-disk-7 - nexus-tests nexus-test-model nexus-test-disk-8 - nexus-tests nexus-test-model nexus-test-disk-9 + ---------------------------------------------------------------- + vendor model serial disposition + ---------------------------------------------------------------- + nexus-tests nexus-test-model nexus-test-disk-0 in service + nexus-tests nexus-test-model nexus-test-disk-1 in service + nexus-tests nexus-test-model nexus-test-disk-2 in service + nexus-tests nexus-test-model nexus-test-disk-3 in service + nexus-tests nexus-test-model nexus-test-disk-4 in service + nexus-tests nexus-test-model nexus-test-disk-5 in service + nexus-tests nexus-test-model nexus-test-disk-6 in service + nexus-tests nexus-test-model nexus-test-disk-7 in service + nexus-tests nexus-test-model nexus-test-disk-8 in service + nexus-tests nexus-test-model nexus-test-disk-9 in service datasets at generation 2: @@ -1536,37 +1536,37 @@ to: blueprint ............. sled ..................... (active): physical disks at generation 2: - --------------------------------------------------- - vendor model serial - --------------------------------------------------- - nexus-tests nexus-test-model nexus-test-disk-10 - nexus-tests nexus-test-model nexus-test-disk-11 - nexus-tests nexus-test-model nexus-test-disk-12 - nexus-tests nexus-test-model nexus-test-disk-13 - nexus-tests nexus-test-model nexus-test-disk-14 - nexus-tests nexus-test-model nexus-test-disk-15 - nexus-tests nexus-test-model nexus-test-disk-16 - nexus-tests nexus-test-model nexus-test-disk-17 - nexus-tests nexus-test-model nexus-test-disk-18 - nexus-tests nexus-test-model nexus-test-disk-19 + ----------------------------------------------------------------- + vendor model serial disposition + ----------------------------------------------------------------- + nexus-tests nexus-test-model nexus-test-disk-10 in service + nexus-tests nexus-test-model nexus-test-disk-11 in service + nexus-tests nexus-test-model nexus-test-disk-12 in service + nexus-tests nexus-test-model nexus-test-disk-13 in service + nexus-tests nexus-test-model nexus-test-disk-14 in service + nexus-tests nexus-test-model nexus-test-disk-15 in service + nexus-tests nexus-test-model nexus-test-disk-16 in service + nexus-tests nexus-test-model nexus-test-disk-17 in service + nexus-tests nexus-test-model nexus-test-disk-18 in service + nexus-tests nexus-test-model nexus-test-disk-19 in service sled ..................... (active): physical disks at generation 2: - -------------------------------------------------- - vendor model serial - -------------------------------------------------- - nexus-tests nexus-test-model nexus-test-disk-0 - nexus-tests nexus-test-model nexus-test-disk-1 - nexus-tests nexus-test-model nexus-test-disk-2 - nexus-tests nexus-test-model nexus-test-disk-3 - nexus-tests nexus-test-model nexus-test-disk-4 - nexus-tests nexus-test-model nexus-test-disk-5 - nexus-tests nexus-test-model nexus-test-disk-6 - nexus-tests nexus-test-model nexus-test-disk-7 - nexus-tests nexus-test-model nexus-test-disk-8 - nexus-tests nexus-test-model nexus-test-disk-9 + ---------------------------------------------------------------- + vendor model serial disposition + ---------------------------------------------------------------- + nexus-tests nexus-test-model nexus-test-disk-0 in service + nexus-tests nexus-test-model nexus-test-disk-1 in service + nexus-tests nexus-test-model nexus-test-disk-2 in service + nexus-tests nexus-test-model nexus-test-disk-3 in service + nexus-tests nexus-test-model nexus-test-disk-4 in service + nexus-tests nexus-test-model nexus-test-disk-5 in service + nexus-tests nexus-test-model nexus-test-disk-6 in service + nexus-tests nexus-test-model nexus-test-disk-7 in service + nexus-tests nexus-test-model nexus-test-disk-8 in service + nexus-tests nexus-test-model nexus-test-disk-9 in service datasets at generation 2: diff --git a/dev-tools/reconfigurator-cli/tests/output/cmd-example-stdout b/dev-tools/reconfigurator-cli/tests/output/cmd-example-stdout index de70fa82ea..b1c2148beb 100644 --- a/dev-tools/reconfigurator-cli/tests/output/cmd-example-stdout +++ b/dev-tools/reconfigurator-cli/tests/output/cmd-example-stdout @@ -69,19 +69,19 @@ parent: 02697f74-b14a-4418-90f0-c28b2a3a6aa9 sled: 2eb69596-f081-4e2d-9425-9994926e0832 (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-088ed702-551e-453b-80d7-57700372a844 - fake-vendor fake-model serial-09e51697-abad-47c0-a193-eaf74bc5d3cd - fake-vendor fake-model serial-3a512d49-edbe-47f3-8d0b-6051bfdc4044 - fake-vendor fake-model serial-40517680-aa77-413c-bcf4-b9041dcf6612 - fake-vendor fake-model serial-78d3cb96-9295-4644-bf78-2e32191c71f9 - fake-vendor fake-model serial-853595e7-77da-404e-bc35-aba77478d55c - fake-vendor fake-model serial-8926e0e7-65d9-4e2e-ac6d-f1298af81ef1 - fake-vendor fake-model serial-9c0b9151-17f3-4857-94cc-b5bfcd402326 - fake-vendor fake-model serial-d61354fa-48d2-47c6-90bf-546e3ed1708b - fake-vendor fake-model serial-d792c8cb-7490-40cb-bb1c-d4917242edf4 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-088ed702-551e-453b-80d7-57700372a844 in service + fake-vendor fake-model serial-09e51697-abad-47c0-a193-eaf74bc5d3cd in service + fake-vendor fake-model serial-3a512d49-edbe-47f3-8d0b-6051bfdc4044 in service + fake-vendor fake-model serial-40517680-aa77-413c-bcf4-b9041dcf6612 in service + fake-vendor fake-model serial-78d3cb96-9295-4644-bf78-2e32191c71f9 in service + fake-vendor fake-model serial-853595e7-77da-404e-bc35-aba77478d55c in service + fake-vendor fake-model serial-8926e0e7-65d9-4e2e-ac6d-f1298af81ef1 in service + fake-vendor fake-model serial-9c0b9151-17f3-4857-94cc-b5bfcd402326 in service + fake-vendor fake-model serial-d61354fa-48d2-47c6-90bf-546e3ed1708b in service + fake-vendor fake-model serial-d792c8cb-7490-40cb-bb1c-d4917242edf4 in service datasets at generation 2: @@ -165,19 +165,19 @@ parent: 02697f74-b14a-4418-90f0-c28b2a3a6aa9 sled: 32d8d836-4d8a-4e54-8fa9-f31d79c42646 (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-128b0f04-229b-48dc-9c5c-555cb5723ed8 - fake-vendor fake-model serial-43ae0f4e-b0cf-4d74-8636-df0567ba01e6 - fake-vendor fake-model serial-4e9806d0-41cd-48c2-86ef-7f815c3ce3b1 - fake-vendor fake-model serial-70bb6d98-111f-4015-9d97-9ef1b2d6dcac - fake-vendor fake-model serial-7ce5029f-703c-4c08-8164-9af9cf1acf23 - fake-vendor fake-model serial-b113c11f-44e6-4fb4-a56e-1d91bd652faf - fake-vendor fake-model serial-bf149c80-2498-481c-9989-6344da914081 - fake-vendor fake-model serial-c69b6237-09f9-45aa-962c-5dbdd1d894be - fake-vendor fake-model serial-ccd5a87b-00ae-42ad-85da-b37d70436cb1 - fake-vendor fake-model serial-d7410a1c-e01d-49a4-be9c-f861f086760a + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-128b0f04-229b-48dc-9c5c-555cb5723ed8 in service + fake-vendor fake-model serial-43ae0f4e-b0cf-4d74-8636-df0567ba01e6 in service + fake-vendor fake-model serial-4e9806d0-41cd-48c2-86ef-7f815c3ce3b1 in service + fake-vendor fake-model serial-70bb6d98-111f-4015-9d97-9ef1b2d6dcac in service + fake-vendor fake-model serial-7ce5029f-703c-4c08-8164-9af9cf1acf23 in service + fake-vendor fake-model serial-b113c11f-44e6-4fb4-a56e-1d91bd652faf in service + fake-vendor fake-model serial-bf149c80-2498-481c-9989-6344da914081 in service + fake-vendor fake-model serial-c69b6237-09f9-45aa-962c-5dbdd1d894be in service + fake-vendor fake-model serial-ccd5a87b-00ae-42ad-85da-b37d70436cb1 in service + fake-vendor fake-model serial-d7410a1c-e01d-49a4-be9c-f861f086760a in service datasets at generation 2: @@ -258,19 +258,19 @@ parent: 02697f74-b14a-4418-90f0-c28b2a3a6aa9 sled: 89d02b1b-478c-401a-8e28-7a26f74fa41b (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-44fa7024-c2bc-4d2c-b478-c4997e4aece8 - fake-vendor fake-model serial-5265edc6-debf-4687-a758-a9746893ebd3 - fake-vendor fake-model serial-532fbd69-b472-4445-86af-4c4c85afb313 - fake-vendor fake-model serial-54fd6fa6-ce3c-4abe-8c9d-7e107e159e84 - fake-vendor fake-model serial-8562317c-4736-4cfc-9292-7dcab96a6fee - fake-vendor fake-model serial-9a1327e4-d11b-4d98-8454-8c41862e9832 - fake-vendor fake-model serial-bf9d6692-64bc-459a-87dd-e7a83080a210 - fake-vendor fake-model serial-ce1c13f3-bef2-4306-b0f2-4e39bd4a18b6 - fake-vendor fake-model serial-f931ec80-a3e3-4adb-a8ba-fa5adbd2294c - fake-vendor fake-model serial-fe1d5b9f-8db7-4e2d-bf17-c4b80e1f897c + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-44fa7024-c2bc-4d2c-b478-c4997e4aece8 in service + fake-vendor fake-model serial-5265edc6-debf-4687-a758-a9746893ebd3 in service + fake-vendor fake-model serial-532fbd69-b472-4445-86af-4c4c85afb313 in service + fake-vendor fake-model serial-54fd6fa6-ce3c-4abe-8c9d-7e107e159e84 in service + fake-vendor fake-model serial-8562317c-4736-4cfc-9292-7dcab96a6fee in service + fake-vendor fake-model serial-9a1327e4-d11b-4d98-8454-8c41862e9832 in service + fake-vendor fake-model serial-bf9d6692-64bc-459a-87dd-e7a83080a210 in service + fake-vendor fake-model serial-ce1c13f3-bef2-4306-b0f2-4e39bd4a18b6 in service + fake-vendor fake-model serial-f931ec80-a3e3-4adb-a8ba-fa5adbd2294c in service + fake-vendor fake-model serial-fe1d5b9f-8db7-4e2d-bf17-c4b80e1f897c in service datasets at generation 2: @@ -413,13 +413,13 @@ parent: 02697f74-b14a-4418-90f0-c28b2a3a6aa9 sled: 89d02b1b-478c-401a-8e28-7a26f74fa41b (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-44fa7024-c2bc-4d2c-b478-c4997e4aece8 - fake-vendor fake-model serial-8562317c-4736-4cfc-9292-7dcab96a6fee - fake-vendor fake-model serial-ce1c13f3-bef2-4306-b0f2-4e39bd4a18b6 - fake-vendor fake-model serial-f931ec80-a3e3-4adb-a8ba-fa5adbd2294c + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-44fa7024-c2bc-4d2c-b478-c4997e4aece8 in service + fake-vendor fake-model serial-8562317c-4736-4cfc-9292-7dcab96a6fee in service + fake-vendor fake-model serial-ce1c13f3-bef2-4306-b0f2-4e39bd4a18b6 in service + fake-vendor fake-model serial-f931ec80-a3e3-4adb-a8ba-fa5adbd2294c in service datasets at generation 2: 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 50f5d4522a..c553aec7bc 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 @@ -13,19 +13,19 @@ parent: 06c88262-f435-410e-ba98-101bed41ec27 sled: 711ac7f8-d19e-4572-bdb9-e9b50f6e362a (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-3b46c403-ad14-435c-a1a8-e8f940bf814f - fake-vendor fake-model serial-3f8c9484-06e8-4662-9a90-aa7e92c43405 - fake-vendor fake-model serial-4a62a827-4bf3-45d5-a7f5-d080f25c61ef - fake-vendor fake-model serial-5f774f00-52b7-41b5-a57f-6f38037196f5 - fake-vendor fake-model serial-68ae41d4-99ed-4612-99e1-fecf795ca694 - fake-vendor fake-model serial-6a66241b-b595-423d-84ef-a81b5d8430e8 - fake-vendor fake-model serial-7c45c3f6-6369-40d9-a73f-2f7ed0afe96b - fake-vendor fake-model serial-a216d334-4a9a-49dd-8b13-20548839306c - fake-vendor fake-model serial-c9ff8eb0-807c-40ad-a5c4-0d534947c9ad - fake-vendor fake-model serial-fb29d469-7d3f-47b9-944c-ce817fc70370 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-3b46c403-ad14-435c-a1a8-e8f940bf814f in service + fake-vendor fake-model serial-3f8c9484-06e8-4662-9a90-aa7e92c43405 in service + fake-vendor fake-model serial-4a62a827-4bf3-45d5-a7f5-d080f25c61ef in service + fake-vendor fake-model serial-5f774f00-52b7-41b5-a57f-6f38037196f5 in service + fake-vendor fake-model serial-68ae41d4-99ed-4612-99e1-fecf795ca694 in service + fake-vendor fake-model serial-6a66241b-b595-423d-84ef-a81b5d8430e8 in service + fake-vendor fake-model serial-7c45c3f6-6369-40d9-a73f-2f7ed0afe96b in service + fake-vendor fake-model serial-a216d334-4a9a-49dd-8b13-20548839306c in service + fake-vendor fake-model serial-c9ff8eb0-807c-40ad-a5c4-0d534947c9ad in service + fake-vendor fake-model serial-fb29d469-7d3f-47b9-944c-ce817fc70370 in service datasets at generation 2: @@ -109,19 +109,19 @@ parent: 06c88262-f435-410e-ba98-101bed41ec27 sled: 9dc50690-f9bf-4520-bf80-051d0f465c2c (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-1f9589d8-0a68-47e8-b977-d0fb17bd3fdb - fake-vendor fake-model serial-44882b6c-5e19-418b-b6c3-065f2af5a557 - fake-vendor fake-model serial-6de47efc-8a6d-4108-bf82-0146eab3be06 - fake-vendor fake-model serial-80e2c62f-052c-4580-8252-7af238fbbe9c - fake-vendor fake-model serial-81d326ae-5f8a-4ffd-9d5e-a9e8246ac014 - fake-vendor fake-model serial-878af5a0-7810-43e5-bdd5-a3215242459a - fake-vendor fake-model serial-af59fef5-8258-4852-be1d-ce55ae7dc822 - fake-vendor fake-model serial-b16aa11f-6e49-44c1-abcb-2e7584bffa12 - fake-vendor fake-model serial-f173c79b-a3b4-4f4a-a983-bc94b6b1a616 - fake-vendor fake-model serial-f1a041cc-85c7-4d14-8fc0-8d0e417f7e24 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-1f9589d8-0a68-47e8-b977-d0fb17bd3fdb in service + fake-vendor fake-model serial-44882b6c-5e19-418b-b6c3-065f2af5a557 in service + fake-vendor fake-model serial-6de47efc-8a6d-4108-bf82-0146eab3be06 in service + fake-vendor fake-model serial-80e2c62f-052c-4580-8252-7af238fbbe9c in service + fake-vendor fake-model serial-81d326ae-5f8a-4ffd-9d5e-a9e8246ac014 in service + fake-vendor fake-model serial-878af5a0-7810-43e5-bdd5-a3215242459a in service + fake-vendor fake-model serial-af59fef5-8258-4852-be1d-ce55ae7dc822 in service + fake-vendor fake-model serial-b16aa11f-6e49-44c1-abcb-2e7584bffa12 in service + fake-vendor fake-model serial-f173c79b-a3b4-4f4a-a983-bc94b6b1a616 in service + fake-vendor fake-model serial-f1a041cc-85c7-4d14-8fc0-8d0e417f7e24 in service datasets at generation 2: @@ -202,19 +202,19 @@ parent: 06c88262-f435-410e-ba98-101bed41ec27 sled: a88790de-5962-4871-8686-61c1fd5b7094 (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-2f26e76b-6c91-4ee9-87b3-f424b942091b - fake-vendor fake-model serial-6f8fa855-4f34-42db-a6e4-9d0090d6c828 - fake-vendor fake-model serial-71450d62-791e-4068-9882-8a206a465fd9 - fake-vendor fake-model serial-7b4ad242-8330-4c08-9588-c66782742678 - fake-vendor fake-model serial-9bf23b52-565e-4439-9728-edb603fa6c4e - fake-vendor fake-model serial-c9476e3d-7745-4fa9-b336-b54ac5b08f56 - fake-vendor fake-model serial-d2cd1e65-b63d-4748-895f-aafecc81e440 - fake-vendor fake-model serial-d4ad3cc1-956a-4444-81a6-da6a025f6df2 - fake-vendor fake-model serial-e1298a43-fa1a-4e6f-bcfa-b26996f69c50 - fake-vendor fake-model serial-fa9ce87c-fa7c-4854-95bd-69b8f01c46f9 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-2f26e76b-6c91-4ee9-87b3-f424b942091b in service + fake-vendor fake-model serial-6f8fa855-4f34-42db-a6e4-9d0090d6c828 in service + fake-vendor fake-model serial-71450d62-791e-4068-9882-8a206a465fd9 in service + fake-vendor fake-model serial-7b4ad242-8330-4c08-9588-c66782742678 in service + fake-vendor fake-model serial-9bf23b52-565e-4439-9728-edb603fa6c4e in service + fake-vendor fake-model serial-c9476e3d-7745-4fa9-b336-b54ac5b08f56 in service + fake-vendor fake-model serial-d2cd1e65-b63d-4748-895f-aafecc81e440 in service + fake-vendor fake-model serial-d4ad3cc1-956a-4444-81a6-da6a025f6df2 in service + fake-vendor fake-model serial-e1298a43-fa1a-4e6f-bcfa-b26996f69c50 in service + fake-vendor fake-model serial-fa9ce87c-fa7c-4854-95bd-69b8f01c46f9 in service datasets at generation 2: @@ -316,19 +316,19 @@ parent: 3f00b694-1b16-4aaa-8f78-e6b3a527b434 sled: 711ac7f8-d19e-4572-bdb9-e9b50f6e362a (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-3b46c403-ad14-435c-a1a8-e8f940bf814f - fake-vendor fake-model serial-3f8c9484-06e8-4662-9a90-aa7e92c43405 - fake-vendor fake-model serial-4a62a827-4bf3-45d5-a7f5-d080f25c61ef - fake-vendor fake-model serial-5f774f00-52b7-41b5-a57f-6f38037196f5 - fake-vendor fake-model serial-68ae41d4-99ed-4612-99e1-fecf795ca694 - fake-vendor fake-model serial-6a66241b-b595-423d-84ef-a81b5d8430e8 - fake-vendor fake-model serial-7c45c3f6-6369-40d9-a73f-2f7ed0afe96b - fake-vendor fake-model serial-a216d334-4a9a-49dd-8b13-20548839306c - fake-vendor fake-model serial-c9ff8eb0-807c-40ad-a5c4-0d534947c9ad - fake-vendor fake-model serial-fb29d469-7d3f-47b9-944c-ce817fc70370 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-3b46c403-ad14-435c-a1a8-e8f940bf814f in service + fake-vendor fake-model serial-3f8c9484-06e8-4662-9a90-aa7e92c43405 in service + fake-vendor fake-model serial-4a62a827-4bf3-45d5-a7f5-d080f25c61ef in service + fake-vendor fake-model serial-5f774f00-52b7-41b5-a57f-6f38037196f5 in service + fake-vendor fake-model serial-68ae41d4-99ed-4612-99e1-fecf795ca694 in service + fake-vendor fake-model serial-6a66241b-b595-423d-84ef-a81b5d8430e8 in service + fake-vendor fake-model serial-7c45c3f6-6369-40d9-a73f-2f7ed0afe96b in service + fake-vendor fake-model serial-a216d334-4a9a-49dd-8b13-20548839306c in service + fake-vendor fake-model serial-c9ff8eb0-807c-40ad-a5c4-0d534947c9ad in service + fake-vendor fake-model serial-fb29d469-7d3f-47b9-944c-ce817fc70370 in service datasets at generation 2: @@ -412,19 +412,19 @@ parent: 3f00b694-1b16-4aaa-8f78-e6b3a527b434 sled: 9dc50690-f9bf-4520-bf80-051d0f465c2c (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-1f9589d8-0a68-47e8-b977-d0fb17bd3fdb - fake-vendor fake-model serial-44882b6c-5e19-418b-b6c3-065f2af5a557 - fake-vendor fake-model serial-6de47efc-8a6d-4108-bf82-0146eab3be06 - fake-vendor fake-model serial-80e2c62f-052c-4580-8252-7af238fbbe9c - fake-vendor fake-model serial-81d326ae-5f8a-4ffd-9d5e-a9e8246ac014 - fake-vendor fake-model serial-878af5a0-7810-43e5-bdd5-a3215242459a - fake-vendor fake-model serial-af59fef5-8258-4852-be1d-ce55ae7dc822 - fake-vendor fake-model serial-b16aa11f-6e49-44c1-abcb-2e7584bffa12 - fake-vendor fake-model serial-f173c79b-a3b4-4f4a-a983-bc94b6b1a616 - fake-vendor fake-model serial-f1a041cc-85c7-4d14-8fc0-8d0e417f7e24 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-1f9589d8-0a68-47e8-b977-d0fb17bd3fdb in service + fake-vendor fake-model serial-44882b6c-5e19-418b-b6c3-065f2af5a557 in service + fake-vendor fake-model serial-6de47efc-8a6d-4108-bf82-0146eab3be06 in service + fake-vendor fake-model serial-80e2c62f-052c-4580-8252-7af238fbbe9c in service + fake-vendor fake-model serial-81d326ae-5f8a-4ffd-9d5e-a9e8246ac014 in service + fake-vendor fake-model serial-878af5a0-7810-43e5-bdd5-a3215242459a in service + fake-vendor fake-model serial-af59fef5-8258-4852-be1d-ce55ae7dc822 in service + fake-vendor fake-model serial-b16aa11f-6e49-44c1-abcb-2e7584bffa12 in service + fake-vendor fake-model serial-f173c79b-a3b4-4f4a-a983-bc94b6b1a616 in service + fake-vendor fake-model serial-f1a041cc-85c7-4d14-8fc0-8d0e417f7e24 in service datasets at generation 2: @@ -505,19 +505,19 @@ parent: 3f00b694-1b16-4aaa-8f78-e6b3a527b434 sled: a88790de-5962-4871-8686-61c1fd5b7094 (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-2f26e76b-6c91-4ee9-87b3-f424b942091b - fake-vendor fake-model serial-6f8fa855-4f34-42db-a6e4-9d0090d6c828 - fake-vendor fake-model serial-71450d62-791e-4068-9882-8a206a465fd9 - fake-vendor fake-model serial-7b4ad242-8330-4c08-9588-c66782742678 - fake-vendor fake-model serial-9bf23b52-565e-4439-9728-edb603fa6c4e - fake-vendor fake-model serial-c9476e3d-7745-4fa9-b336-b54ac5b08f56 - fake-vendor fake-model serial-d2cd1e65-b63d-4748-895f-aafecc81e440 - fake-vendor fake-model serial-d4ad3cc1-956a-4444-81a6-da6a025f6df2 - fake-vendor fake-model serial-e1298a43-fa1a-4e6f-bcfa-b26996f69c50 - fake-vendor fake-model serial-fa9ce87c-fa7c-4854-95bd-69b8f01c46f9 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-2f26e76b-6c91-4ee9-87b3-f424b942091b in service + fake-vendor fake-model serial-6f8fa855-4f34-42db-a6e4-9d0090d6c828 in service + fake-vendor fake-model serial-71450d62-791e-4068-9882-8a206a465fd9 in service + fake-vendor fake-model serial-7b4ad242-8330-4c08-9588-c66782742678 in service + fake-vendor fake-model serial-9bf23b52-565e-4439-9728-edb603fa6c4e in service + fake-vendor fake-model serial-c9476e3d-7745-4fa9-b336-b54ac5b08f56 in service + fake-vendor fake-model serial-d2cd1e65-b63d-4748-895f-aafecc81e440 in service + fake-vendor fake-model serial-d4ad3cc1-956a-4444-81a6-da6a025f6df2 in service + fake-vendor fake-model serial-e1298a43-fa1a-4e6f-bcfa-b26996f69c50 in service + fake-vendor fake-model serial-fa9ce87c-fa7c-4854-95bd-69b8f01c46f9 in service datasets at generation 3: @@ -630,19 +630,19 @@ parent: 366b0b68-d80e-4bc1-abd3-dc69837847e0 sled: 711ac7f8-d19e-4572-bdb9-e9b50f6e362a (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-3b46c403-ad14-435c-a1a8-e8f940bf814f - fake-vendor fake-model serial-3f8c9484-06e8-4662-9a90-aa7e92c43405 - fake-vendor fake-model serial-4a62a827-4bf3-45d5-a7f5-d080f25c61ef - fake-vendor fake-model serial-5f774f00-52b7-41b5-a57f-6f38037196f5 - fake-vendor fake-model serial-68ae41d4-99ed-4612-99e1-fecf795ca694 - fake-vendor fake-model serial-6a66241b-b595-423d-84ef-a81b5d8430e8 - fake-vendor fake-model serial-7c45c3f6-6369-40d9-a73f-2f7ed0afe96b - fake-vendor fake-model serial-a216d334-4a9a-49dd-8b13-20548839306c - fake-vendor fake-model serial-c9ff8eb0-807c-40ad-a5c4-0d534947c9ad - fake-vendor fake-model serial-fb29d469-7d3f-47b9-944c-ce817fc70370 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-3b46c403-ad14-435c-a1a8-e8f940bf814f in service + fake-vendor fake-model serial-3f8c9484-06e8-4662-9a90-aa7e92c43405 in service + fake-vendor fake-model serial-4a62a827-4bf3-45d5-a7f5-d080f25c61ef in service + fake-vendor fake-model serial-5f774f00-52b7-41b5-a57f-6f38037196f5 in service + fake-vendor fake-model serial-68ae41d4-99ed-4612-99e1-fecf795ca694 in service + fake-vendor fake-model serial-6a66241b-b595-423d-84ef-a81b5d8430e8 in service + fake-vendor fake-model serial-7c45c3f6-6369-40d9-a73f-2f7ed0afe96b in service + fake-vendor fake-model serial-a216d334-4a9a-49dd-8b13-20548839306c in service + fake-vendor fake-model serial-c9ff8eb0-807c-40ad-a5c4-0d534947c9ad in service + fake-vendor fake-model serial-fb29d469-7d3f-47b9-944c-ce817fc70370 in service datasets at generation 2: @@ -726,19 +726,19 @@ parent: 366b0b68-d80e-4bc1-abd3-dc69837847e0 sled: 9dc50690-f9bf-4520-bf80-051d0f465c2c (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-1f9589d8-0a68-47e8-b977-d0fb17bd3fdb - fake-vendor fake-model serial-44882b6c-5e19-418b-b6c3-065f2af5a557 - fake-vendor fake-model serial-6de47efc-8a6d-4108-bf82-0146eab3be06 - fake-vendor fake-model serial-80e2c62f-052c-4580-8252-7af238fbbe9c - fake-vendor fake-model serial-81d326ae-5f8a-4ffd-9d5e-a9e8246ac014 - fake-vendor fake-model serial-878af5a0-7810-43e5-bdd5-a3215242459a - fake-vendor fake-model serial-af59fef5-8258-4852-be1d-ce55ae7dc822 - fake-vendor fake-model serial-b16aa11f-6e49-44c1-abcb-2e7584bffa12 - fake-vendor fake-model serial-f173c79b-a3b4-4f4a-a983-bc94b6b1a616 - fake-vendor fake-model serial-f1a041cc-85c7-4d14-8fc0-8d0e417f7e24 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-1f9589d8-0a68-47e8-b977-d0fb17bd3fdb in service + fake-vendor fake-model serial-44882b6c-5e19-418b-b6c3-065f2af5a557 in service + fake-vendor fake-model serial-6de47efc-8a6d-4108-bf82-0146eab3be06 in service + fake-vendor fake-model serial-80e2c62f-052c-4580-8252-7af238fbbe9c in service + fake-vendor fake-model serial-81d326ae-5f8a-4ffd-9d5e-a9e8246ac014 in service + fake-vendor fake-model serial-878af5a0-7810-43e5-bdd5-a3215242459a in service + fake-vendor fake-model serial-af59fef5-8258-4852-be1d-ce55ae7dc822 in service + fake-vendor fake-model serial-b16aa11f-6e49-44c1-abcb-2e7584bffa12 in service + fake-vendor fake-model serial-f173c79b-a3b4-4f4a-a983-bc94b6b1a616 in service + fake-vendor fake-model serial-f1a041cc-85c7-4d14-8fc0-8d0e417f7e24 in service datasets at generation 2: @@ -819,19 +819,19 @@ parent: 366b0b68-d80e-4bc1-abd3-dc69837847e0 sled: a88790de-5962-4871-8686-61c1fd5b7094 (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-2f26e76b-6c91-4ee9-87b3-f424b942091b - fake-vendor fake-model serial-6f8fa855-4f34-42db-a6e4-9d0090d6c828 - fake-vendor fake-model serial-71450d62-791e-4068-9882-8a206a465fd9 - fake-vendor fake-model serial-7b4ad242-8330-4c08-9588-c66782742678 - fake-vendor fake-model serial-9bf23b52-565e-4439-9728-edb603fa6c4e - fake-vendor fake-model serial-c9476e3d-7745-4fa9-b336-b54ac5b08f56 - fake-vendor fake-model serial-d2cd1e65-b63d-4748-895f-aafecc81e440 - fake-vendor fake-model serial-d4ad3cc1-956a-4444-81a6-da6a025f6df2 - fake-vendor fake-model serial-e1298a43-fa1a-4e6f-bcfa-b26996f69c50 - fake-vendor fake-model serial-fa9ce87c-fa7c-4854-95bd-69b8f01c46f9 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-2f26e76b-6c91-4ee9-87b3-f424b942091b in service + fake-vendor fake-model serial-6f8fa855-4f34-42db-a6e4-9d0090d6c828 in service + fake-vendor fake-model serial-71450d62-791e-4068-9882-8a206a465fd9 in service + fake-vendor fake-model serial-7b4ad242-8330-4c08-9588-c66782742678 in service + fake-vendor fake-model serial-9bf23b52-565e-4439-9728-edb603fa6c4e in service + fake-vendor fake-model serial-c9476e3d-7745-4fa9-b336-b54ac5b08f56 in service + fake-vendor fake-model serial-d2cd1e65-b63d-4748-895f-aafecc81e440 in service + fake-vendor fake-model serial-d4ad3cc1-956a-4444-81a6-da6a025f6df2 in service + fake-vendor fake-model serial-e1298a43-fa1a-4e6f-bcfa-b26996f69c50 in service + fake-vendor fake-model serial-fa9ce87c-fa7c-4854-95bd-69b8f01c46f9 in service datasets at generation 4: diff --git a/nexus/db-model/src/deployment.rs b/nexus/db-model/src/deployment.rs index 367e3c4fd5..4cfd930ab7 100644 --- a/nexus/db-model/src/deployment.rs +++ b/nexus/db-model/src/deployment.rs @@ -167,30 +167,66 @@ impl_enum_type!( Expunged => b"expunged" ); -/// Converts a [`BlueprintPhysicalDiskDisposition`] to a version that can be inserted -/// into a database. -pub fn to_db_bp_physical_disk_disposition( - disposition: BlueprintPhysicalDiskDisposition, -) -> DbBpPhysicalDiskDisposition { - match disposition { - BlueprintPhysicalDiskDisposition::InService => { - DbBpPhysicalDiskDisposition::InService - } - BlueprintPhysicalDiskDisposition::Expunged => { - DbBpPhysicalDiskDisposition::Expunged +struct DbBpPhysicalDiskDispositionColumns { + disposition: DbBpPhysicalDiskDisposition, + expunged_as_of_generation: Option, + expunged_ready_for_cleanup: bool, +} + +impl From + for DbBpPhysicalDiskDispositionColumns +{ + fn from(value: BlueprintPhysicalDiskDisposition) -> Self { + let ( + disposition, + disposition_expunged_as_of_generation, + disposition_expunged_ready_for_cleanup, + ) = match value { + BlueprintPhysicalDiskDisposition::InService => { + (DbBpPhysicalDiskDisposition::InService, None, false) + } + BlueprintPhysicalDiskDisposition::Expunged { + as_of_generation, + ready_for_cleanup, + } => ( + DbBpPhysicalDiskDisposition::Expunged, + Some(Generation(as_of_generation)), + ready_for_cleanup, + ), + }; + Self { + disposition, + expunged_as_of_generation: disposition_expunged_as_of_generation, + expunged_ready_for_cleanup: disposition_expunged_ready_for_cleanup, } } } -impl From for BlueprintPhysicalDiskDisposition { - fn from(disposition: DbBpPhysicalDiskDisposition) -> Self { - match disposition { - DbBpPhysicalDiskDisposition::InService => { - BlueprintPhysicalDiskDisposition::InService +impl TryFrom + for BlueprintPhysicalDiskDisposition +{ + type Error = anyhow::Error; + + fn try_from( + value: DbBpPhysicalDiskDispositionColumns, + ) -> Result { + match (value.disposition, value.expunged_as_of_generation) { + (DbBpPhysicalDiskDisposition::InService, None) => { + Ok(Self::InService) } - DbBpPhysicalDiskDisposition::Expunged => { - BlueprintPhysicalDiskDisposition::Expunged + (DbBpPhysicalDiskDisposition::Expunged, Some(as_of_generation)) => { + Ok(Self::Expunged { + as_of_generation: *as_of_generation, + ready_for_cleanup: value.expunged_ready_for_cleanup, + }) } + (DbBpPhysicalDiskDisposition::InService, Some(_)) + | (DbBpPhysicalDiskDisposition::Expunged, None) => Err(anyhow!( + "illegal database state (CHECK constraint broken?!): \ + disposition {:?}, disposition_expunged_as_of_generation {:?}", + value.disposition, + value.expunged_as_of_generation, + )), } } } @@ -232,7 +268,9 @@ pub struct BpOmicronPhysicalDisk { pub id: DbTypedUuid, pub pool_id: Uuid, - pub disposition: DbBpPhysicalDiskDisposition, + disposition: DbBpPhysicalDiskDisposition, + disposition_expunged_as_of_generation: Option, + disposition_expunged_ready_for_cleanup: bool, } impl BpOmicronPhysicalDisk { @@ -241,6 +279,11 @@ impl BpOmicronPhysicalDisk { sled_id: SledUuid, disk_config: &BlueprintPhysicalDiskConfig, ) -> Self { + let DbBpPhysicalDiskDispositionColumns { + disposition, + expunged_as_of_generation: disposition_expunged_as_of_generation, + expunged_ready_for_cleanup: disposition_expunged_ready_for_cleanup, + } = disk_config.disposition.into(); Self { blueprint_id: blueprint_id.into(), sled_id: sled_id.into(), @@ -249,17 +292,27 @@ impl BpOmicronPhysicalDisk { model: disk_config.identity.model.clone(), id: disk_config.id.into(), pool_id: disk_config.pool_id.into_untyped_uuid(), - disposition: to_db_bp_physical_disk_disposition( - disk_config.disposition, - ), + disposition, + disposition_expunged_as_of_generation, + disposition_expunged_ready_for_cleanup, } } } -impl From for BlueprintPhysicalDiskConfig { - fn from(disk: BpOmicronPhysicalDisk) -> Self { - Self { - disposition: disk.disposition.into(), +impl TryFrom for BlueprintPhysicalDiskConfig { + type Error = anyhow::Error; + + fn try_from(disk: BpOmicronPhysicalDisk) -> Result { + let disposition_cols = DbBpPhysicalDiskDispositionColumns { + disposition: disk.disposition, + expunged_as_of_generation: disk + .disposition_expunged_as_of_generation, + expunged_ready_for_cleanup: disk + .disposition_expunged_ready_for_cleanup, + }; + + Ok(Self { + disposition: disposition_cols.try_into()?, identity: DiskIdentity { vendor: disk.vendor, serial: disk.serial, @@ -267,7 +320,7 @@ impl From for BlueprintPhysicalDiskConfig { }, id: disk.id.into(), pool_id: ZpoolUuid::from_untyped_uuid(disk.pool_id), - } + }) } } diff --git a/nexus/db-model/src/schema.rs b/nexus/db-model/src/schema.rs index 151e3c2db8..c8fadc55dd 100644 --- a/nexus/db-model/src/schema.rs +++ b/nexus/db-model/src/schema.rs @@ -1729,6 +1729,8 @@ table! { pool_id -> Uuid, disposition -> crate::DbBpPhysicalDiskDispositionEnum, + disposition_expunged_as_of_generation -> Nullable, + disposition_expunged_ready_for_cleanup -> Bool, } } diff --git a/nexus/db-model/src/schema_versions.rs b/nexus/db-model/src/schema_versions.rs index 67a0fce3ca..7905c00838 100644 --- a/nexus/db-model/src/schema_versions.rs +++ b/nexus/db-model/src/schema_versions.rs @@ -16,7 +16,7 @@ use std::{collections::BTreeMap, sync::LazyLock}; /// /// 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: Version = Version::new(126, 0, 0); +pub const SCHEMA_VERSION: Version = Version::new(127, 0, 0); /// List of all past database schema versions, in *reverse* order /// @@ -28,6 +28,7 @@ static KNOWN_VERSIONS: LazyLock> = LazyLock::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(127, "bp-disk-disposition-expunged-cleanup"), KnownVersion::new(126, "affinity"), KnownVersion::new(125, "blueprint-disposition-expunged-cleanup"), KnownVersion::new(124, "support-read-only-region-replacement"), diff --git a/nexus/db-queries/src/db/datastore/deployment.rs b/nexus/db-queries/src/db/datastore/deployment.rs index cc3a92214d..345fb16414 100644 --- a/nexus/db-queries/src/db/datastore/deployment.rs +++ b/nexus/db-queries/src/db/datastore/deployment.rs @@ -838,7 +838,13 @@ impl DataStore { d.id, d.sled_id )) })?; - sled_disks.disks.insert(d.into()); + let disk_id = d.id; + sled_disks.disks.insert(d.try_into().map_err(|e| { + Error::internal_error(&format!( + "Cannot convert BpOmicronPhysicalDisk {}: {e}", + disk_id + )) + })?); } } } @@ -2344,12 +2350,12 @@ mod tests { assert_eq!( EnsureMultiple::from( builder - .sled_ensure_disks( + .sled_add_disks( new_sled_id, &planning_input .sled_lookup(SledFilter::Commissioned, new_sled_id) .unwrap() - .resources, + .resources ) .unwrap() .disks diff --git a/nexus/db-queries/src/db/datastore/physical_disk.rs b/nexus/db-queries/src/db/datastore/physical_disk.rs index 1d1c6286a6..796ee27ca9 100644 --- a/nexus/db-queries/src/db/datastore/physical_disk.rs +++ b/nexus/db-queries/src/db/datastore/physical_disk.rs @@ -154,12 +154,13 @@ impl DataStore { ) -> Result<(), Error> { opctx.authorize(authz::Action::Read, &authz::FLEET).await?; use db::schema::physical_disk::dsl; + let now = Utc::now(); diesel::update( dsl::physical_disk.filter(dsl::id.eq(to_db_typed_uuid(id))), ) .filter(dsl::time_deleted.is_null()) - .set(dsl::disk_policy.eq(policy)) + .set((dsl::disk_policy.eq(policy), dsl::time_modified.eq(now))) .execute_async(&*self.pool_connection_authorized(&opctx).await?) .await .map_err(|err| public_error_from_diesel(err, ErrorHandler::Server))?; @@ -174,12 +175,13 @@ impl DataStore { ) -> Result<(), Error> { opctx.authorize(authz::Action::Read, &authz::FLEET).await?; use db::schema::physical_disk::dsl; + let now = Utc::now(); diesel::update( dsl::physical_disk.filter(dsl::id.eq(to_db_typed_uuid(id))), ) .filter(dsl::time_deleted.is_null()) - .set(dsl::disk_state.eq(state)) + .set((dsl::disk_state.eq(state), dsl::time_modified.eq(now))) .execute_async(&*self.pool_connection_authorized(&opctx).await?) .await .map_err(|err| public_error_from_diesel(err, ErrorHandler::Server))?; @@ -281,19 +283,27 @@ impl DataStore { .map_err(|e| public_error_from_diesel(e, ErrorHandler::Server)) } - /// Decommissions all expunged disks. - pub async fn physical_disk_decommission_all_expunged( + /// Decommissions a single expunged disk. + /// + /// This is a no-op if the disk is already decommissioned. + pub async fn physical_disk_decommission( &self, opctx: &OpContext, + id: PhysicalDiskUuid, ) -> Result<(), Error> { opctx.authorize(authz::Action::Modify, &authz::FLEET).await?; use db::schema::physical_disk::dsl; - + let now = Utc::now(); let conn = &*self.pool_connection_authorized(&opctx).await?; diesel::update(dsl::physical_disk) + .filter(dsl::id.eq(to_db_typed_uuid(id))) .filter(dsl::time_deleted.is_null()) - .physical_disk_filter(DiskFilter::ExpungedButActive) - .set(dsl::disk_state.eq(PhysicalDiskState::Decommissioned)) + .filter(dsl::disk_policy.eq(PhysicalDiskPolicy::Expunged)) + .filter(dsl::disk_state.ne(PhysicalDiskState::Decommissioned)) + .set(( + dsl::disk_state.eq(PhysicalDiskState::Decommissioned), + dsl::time_modified.eq(now), + )) .execute_async(conn) .await .map_err(|e| public_error_from_diesel(e, ErrorHandler::Server))?; diff --git a/nexus/db-queries/src/db/datastore/vpc.rs b/nexus/db-queries/src/db/datastore/vpc.rs index dbccde8c50..ba34f2d9ad 100644 --- a/nexus/db-queries/src/db/datastore/vpc.rs +++ b/nexus/db-queries/src/db/datastore/vpc.rs @@ -3234,7 +3234,7 @@ mod tests { .expect("created blueprint builder"); for &sled_id in &sled_ids { builder - .sled_ensure_disks( + .sled_add_disks( sled_id, &planning_input .sled_lookup(SledFilter::InService, sled_id) diff --git a/nexus/reconfigurator/blippy/src/checks.rs b/nexus/reconfigurator/blippy/src/checks.rs index 2c56fce1d2..e3211e8a5e 100644 --- a/nexus/reconfigurator/blippy/src/checks.rs +++ b/nexus/reconfigurator/blippy/src/checks.rs @@ -10,6 +10,7 @@ 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::BlueprintPhysicalDiskDisposition; use nexus_types::deployment::BlueprintZoneConfig; use nexus_types::deployment::BlueprintZoneDisposition; use nexus_types::deployment::BlueprintZoneType; @@ -461,11 +462,13 @@ fn check_datasets(blippy: &mut Blippy<'_>) { let mut expected_datasets = BTreeSet::new(); // All disks should have debug and zone root datasets. - // - // TODO-correctness We currently only include in-service disks in the - // blueprint; once we include expunged or decommissioned disks too, we - // should filter here to only in-service. - for (&sled_id, disk_config) in &blippy.blueprint().blueprint_disks { + for (sled_id, disk) in blippy + .blueprint() + .all_omicron_disks(BlueprintPhysicalDiskDisposition::is_in_service) + { + // Note: This may be called multiple times per `sled_id`, + // which is somewhat inefficient. However it will still only report + // one error note per `sled_id`. let Some(sled_datasets) = datasets.get_sled_or_note_missing( blippy, sled_id, @@ -474,41 +477,37 @@ fn check_datasets(blippy: &mut Blippy<'_>) { continue; }; - for disk in &disk_config.disks { - let sled_datasets = sled_datasets.get(&disk.pool_id); + let sled_datasets = sled_datasets.get(&disk.pool_id); - match sled_datasets - .and_then(|by_zpool| by_zpool.get(&DatasetKind::Debug)) - { - Some(dataset) => { - expected_datasets.insert(dataset.id); - } - None => { - blippy.push_sled_note( - sled_id, - Severity::Fatal, - SledKind::ZpoolMissingDebugDataset { - zpool: disk.pool_id, - }, - ); - } + match sled_datasets + .and_then(|by_zpool| by_zpool.get(&DatasetKind::Debug)) + { + Some(dataset) => { + expected_datasets.insert(dataset.id); + } + None => { + blippy.push_sled_note( + sled_id, + Severity::Fatal, + SledKind::ZpoolMissingDebugDataset { zpool: disk.pool_id }, + ); } + } - match sled_datasets.and_then(|by_zpool| { - by_zpool.get(&DatasetKind::TransientZoneRoot) - }) { - Some(dataset) => { - expected_datasets.insert(dataset.id); - } - None => { - blippy.push_sled_note( - sled_id, - Severity::Fatal, - SledKind::ZpoolMissingZoneRootDataset { - zpool: disk.pool_id, - }, - ); - } + match sled_datasets + .and_then(|by_zpool| by_zpool.get(&DatasetKind::TransientZoneRoot)) + { + Some(dataset) => { + expected_datasets.insert(dataset.id); + } + None => { + blippy.push_sled_note( + sled_id, + Severity::Fatal, + SledKind::ZpoolMissingZoneRootDataset { + zpool: disk.pool_id, + }, + ); } } } diff --git a/nexus/reconfigurator/execution/src/lib.rs b/nexus/reconfigurator/execution/src/lib.rs index 79116b58f3..73c517542e 100644 --- a/nexus/reconfigurator/execution/src/lib.rs +++ b/nexus/reconfigurator/execution/src/lib.rs @@ -12,11 +12,11 @@ use nexus_db_queries::context::OpContext; use nexus_db_queries::db::DataStore; use nexus_types::deployment::execution::*; use nexus_types::deployment::Blueprint; +use nexus_types::deployment::BlueprintPhysicalDiskDisposition; use nexus_types::deployment::BlueprintZoneDisposition; use nexus_types::deployment::SledFilter; use nexus_types::external_api::views::SledState; use nexus_types::identity::Asset; -use omicron_physical_disks::DeployDisksDone; use omicron_uuid_kinds::GenericUuid; use omicron_uuid_kinds::OmicronZoneUuid; use omicron_uuid_kinds::SledUuid; @@ -27,6 +27,7 @@ use std::collections::BTreeMap; use std::sync::Arc; use tokio::sync::mpsc; use update_engine::merge_anyhow_list; +use update_engine::StepSuccess; use update_engine::StepWarning; mod clickhouse; @@ -110,7 +111,7 @@ pub async fn realize_blueprint_with_overrides( ) .into_shared(); - let deploy_disks_done = register_deploy_disks_step( + register_deploy_disks_step( &engine.for_component(ExecutionComponent::PhysicalDisks), &opctx, blueprint, @@ -163,11 +164,11 @@ pub async fn realize_blueprint_with_overrides( blueprint, ); - register_decommission_expunged_disks_step( + register_decommission_disks_step( &engine.for_component(ExecutionComponent::PhysicalDisks), &opctx, datastore, - deploy_disks_done, + blueprint, ); register_deploy_clickhouse_cluster_nodes_step( @@ -219,6 +220,23 @@ pub async fn realize_blueprint_with_overrides( Ok(output.into_value(result.token()).await) } +// Convert a `Result<(), anyhow::Error>` nto a `StepResult` containing either a +// `StepSuccess` or `StepWarning` and wrap it in `Result::Ok`. +// +// This is necessary because we never want to return an error from execution. +// Doing so stops execution at the errored step and prevents other independent +// steps after the errored step from executing. +fn result_to_step_result( + res: Result<(), anyhow::Error>, +) -> Result, anyhow::Error> { + match res { + Ok(_) => Ok(StepSuccess::new(()).build()), + Err(e) => Ok(StepWarning::new((), e.to_string()).build()), + } +} + +/// We explicitly don't continue with execution after this step. It only talks +/// to CRDB, and if nexus cannot talk to CRDB, we probably shouldn't continue. fn register_zone_external_networking_step<'a>( registrar: &ComponentRegistrar<'_, 'a>, opctx: &'a OpContext, @@ -308,25 +326,24 @@ fn register_deploy_disks_step<'a>( opctx: &'a OpContext, blueprint: &'a Blueprint, sleds: SharedStepHandle>>, -) -> StepHandle { +) { registrar .new_step( ExecutionStepId::Ensure, "Deploy physical disks", move |cx| async move { let sleds_by_id = sleds.into_value(cx.token()).await; - let done = omicron_physical_disks::deploy_disks( + let res = omicron_physical_disks::deploy_disks( &opctx, &sleds_by_id, &blueprint.blueprint_disks, ) .await - .map_err(merge_anyhow_list)?; - - StepSuccess::new(done).into() + .map_err(merge_anyhow_list); + result_to_step_result(res) }, ) - .register() + .register(); } fn register_deploy_datasets_step<'a>( @@ -341,15 +358,14 @@ fn register_deploy_datasets_step<'a>( "Deploy datasets", move |cx| async move { let sleds_by_id = sleds.into_value(cx.token()).await; - datasets::deploy_datasets( + let res = datasets::deploy_datasets( &opctx, &sleds_by_id, &blueprint.blueprint_datasets, ) .await - .map_err(merge_anyhow_list)?; - - StepSuccess::new(()).into() + .map_err(merge_anyhow_list); + result_to_step_result(res) }, ) .register(); @@ -398,7 +414,7 @@ fn register_plumb_firewall_rules_step<'a>( ExecutionStepId::Ensure, "Plumb service firewall rules", move |_cx| async move { - nexus_networking::plumb_service_firewall_rules( + let res = nexus_networking::plumb_service_firewall_rules( datastore, &opctx, &[], @@ -406,9 +422,8 @@ fn register_plumb_firewall_rules_step<'a>( &opctx.log, ) .await - .context("failed to plumb service firewall rules to sleds")?; - - StepSuccess::new(()).into() + .context("failed to plumb service firewall rules to sleds"); + result_to_step_result(res) }, ) .register(); @@ -430,7 +445,7 @@ fn register_dns_records_step<'a>( move |cx| async move { let sleds_by_id = sleds.into_value(cx.token()).await; - dns::deploy_dns( + let res = dns::deploy_dns( &opctx, datastore, nexus_id.to_string(), @@ -439,9 +454,8 @@ fn register_dns_records_step<'a>( overrides, ) .await - .map_err(|e| anyhow!("{}", InlineErrorChain::new(&e)))?; - - StepSuccess::new(()).into() + .map_err(|e| anyhow!("{}", InlineErrorChain::new(&e))); + result_to_step_result(res) }, ) .register(); @@ -494,7 +508,7 @@ fn register_decommission_sleds_step<'a>( ExecutionStepId::Remove, "Decommission sleds", move |_cx| async move { - sled_state::decommission_sleds( + let res = sled_state::decommission_sleds( &opctx, datastore, blueprint @@ -506,36 +520,34 @@ fn register_decommission_sleds_step<'a>( .map(|(&sled_id, _)| sled_id), ) .await - .map_err(merge_anyhow_list)?; - - StepSuccess::new(()).into() + .map_err(merge_anyhow_list); + result_to_step_result(res) }, ) .register(); } -fn register_decommission_expunged_disks_step<'a>( +fn register_decommission_disks_step<'a>( registrar: &ComponentRegistrar<'_, 'a>, opctx: &'a OpContext, datastore: &'a DataStore, - deploy_disks_done: StepHandle, + blueprint: &'a Blueprint, ) { - // This depends on the "deploy_disks" call earlier -- disk expungement is a - // statement of policy, but we need to be assured that the Sled Agent has - // stopped using that disk before we can mark its state as decommissioned. registrar .new_step( ExecutionStepId::Remove, "Decommission expunged disks", - move |cx| async move { - let done = deploy_disks_done.into_value(cx.token()).await; - omicron_physical_disks::decommission_expunged_disks( - &opctx, datastore, done, + move |_cx| async move { + let res = omicron_physical_disks::decommission_expunged_disks( + &opctx, + datastore, + blueprint + .all_omicron_disks(BlueprintPhysicalDiskDisposition::is_ready_for_cleanup) + .map(|(sled_id, config)| (sled_id, config.id)), ) .await - .map_err(merge_anyhow_list)?; - - StepSuccess::new(()).into() + .map_err(merge_anyhow_list); + result_to_step_result(res) }, ) .register(); @@ -554,13 +566,14 @@ fn register_deploy_clickhouse_cluster_nodes_step<'a>( if let Some(clickhouse_cluster_config) = &blueprint.clickhouse_cluster_config { - clickhouse::deploy_nodes( + let res = clickhouse::deploy_nodes( &opctx, &blueprint.blueprint_zones, &clickhouse_cluster_config, ) .await - .map_err(merge_anyhow_list)?; + .map_err(merge_anyhow_list); + return result_to_step_result(res); } StepSuccess::new(()).into() @@ -579,16 +592,12 @@ fn register_deploy_clickhouse_single_node_step<'a>( ExecutionStepId::Ensure, "Deploy single-node clickhouse cluster", move |_cx| async move { - if let Err(e) = clickhouse::deploy_single_node( + let res = clickhouse::deploy_single_node( &opctx, &blueprint.blueprint_zones, ) - .await - { - StepWarning::new((), e.to_string()).into() - } else { - StepSuccess::new(()).into() - } + .await; + result_to_step_result(res) }, ) .register(); diff --git a/nexus/reconfigurator/execution/src/omicron_physical_disks.rs b/nexus/reconfigurator/execution/src/omicron_physical_disks.rs index 6655eeb8b6..8bd065ad08 100644 --- a/nexus/reconfigurator/execution/src/omicron_physical_disks.rs +++ b/nexus/reconfigurator/execution/src/omicron_physical_disks.rs @@ -13,6 +13,7 @@ use nexus_db_queries::context::OpContext; use nexus_db_queries::db::DataStore; use nexus_types::deployment::BlueprintPhysicalDisksConfig; use omicron_uuid_kinds::GenericUuid; +use omicron_uuid_kinds::PhysicalDiskUuid; use omicron_uuid_kinds::SledUuid; use slog::info; use slog::o; @@ -25,7 +26,7 @@ pub(crate) async fn deploy_disks( opctx: &OpContext, sleds_by_id: &BTreeMap, sled_configs: &BTreeMap, -) -> Result> { +) -> Result<(), Vec> { let errors: Vec<_> = stream::iter(sled_configs) .filter_map(|(sled_id, config)| async move { let log = opctx.log.new(o!( @@ -96,38 +97,55 @@ pub(crate) async fn deploy_disks( .await; if errors.is_empty() { - Ok(DeployDisksDone {}) + Ok(()) } else { Err(errors) } } -/// Typestate indicating that the deploy disks step was performed. -#[derive(Debug)] -#[must_use = "this should be passed into decommission_expunged_disks"] -pub(crate) struct DeployDisksDone {} - /// Decommissions all disks which are currently expunged. pub(crate) async fn decommission_expunged_disks( opctx: &OpContext, datastore: &DataStore, - // This is taken as a parameter to ensure that this depends on a - // "deploy_disks" call made earlier. Disk expungement is a statement of - // policy, but we need to be assured that the Sled Agent has stopped using - // that disk before we can mark its state as decommissioned. - _deploy_disks_done: DeployDisksDone, + expunged_disks: impl Iterator, ) -> Result<(), Vec> { - datastore - .physical_disk_decommission_all_expunged(&opctx) - .await - .map_err(|e| vec![anyhow!(e)])?; - Ok(()) + let errors: Vec = stream::iter(expunged_disks) + .filter_map(|(sled_id, disk_id)| async move { + let log = opctx.log.new(slog::o!( + "sled_id" => sled_id.to_string(), + "disk_id" => disk_id.to_string(), + )); + + match datastore.physical_disk_decommission(&opctx, disk_id).await { + Err(error) => { + warn!( + log, + "failed to decommission expunged disk"; + "error" => #%error + ); + Some(anyhow!(error).context(format!( + "failed to decommission: disk_id = {disk_id}", + ))) + } + Ok(()) => { + info!(log, "successfully decommissioned expunged disk"); + None + } + } + }) + .collect() + .await; + + if errors.is_empty() { + Ok(()) + } else { + Err(errors) + } } #[cfg(test)] mod test { use super::deploy_disks; - use super::DeployDisksDone; use crate::DataStore; use crate::Sled; @@ -238,13 +256,9 @@ mod test { // Get a success result back when the blueprint has an empty set of // disks. let (_, blueprint) = create_blueprint(BTreeMap::new()); - // Use an explicit type here because not doing so can cause errors to - // be ignored (this behavior is genuinely terrible). Instead, ensure - // that the type has the right result. - let _: DeployDisksDone = - deploy_disks(&opctx, &sleds_by_id, &blueprint.blueprint_disks) - .await - .expect("failed to deploy no disks"); + deploy_disks(&opctx, &sleds_by_id, &blueprint.blueprint_disks) + .await + .expect("failed to deploy no disks"); // Disks are updated in a particular order, but each request contains // the full set of disks that must be running. @@ -298,10 +312,9 @@ mod test { } // Execute it. - let _: DeployDisksDone = - deploy_disks(&opctx, &sleds_by_id, &blueprint.blueprint_disks) - .await - .expect("failed to deploy initial disks"); + deploy_disks(&opctx, &sleds_by_id, &blueprint.blueprint_disks) + .await + .expect("failed to deploy initial disks"); s1.verify_and_clear(); s2.verify_and_clear(); @@ -318,10 +331,9 @@ mod test { )), ); } - let _: DeployDisksDone = - deploy_disks(&opctx, &sleds_by_id, &blueprint.blueprint_disks) - .await - .expect("failed to deploy same disks"); + deploy_disks(&opctx, &sleds_by_id, &blueprint.blueprint_disks) + .await + .expect("failed to deploy same disks"); s1.verify_and_clear(); s2.verify_and_clear(); @@ -588,9 +600,7 @@ mod test { super::decommission_expunged_disks( &opctx, &datastore, - // This is an internal test, and we're testing decommissioning in - // isolation, so it's okay to create the typestate here. - DeployDisksDone {}, + [(sled_id, disk_to_decommission)].into_iter(), ) .await .unwrap(); diff --git a/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs b/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs index 15d85744f2..b19fc09b09 100644 --- a/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs +++ b/nexus/reconfigurator/planning/src/blueprint_builder/builder.rs @@ -144,7 +144,8 @@ pub enum EnsureMultiple { expunged: usize, /// An item was removed from the blueprint. /// - /// This usually happens after the work of expungment has completed. + /// This happens after expungement or decommissioning has completed + /// depending upon the resource type. removed: usize, }, @@ -174,7 +175,8 @@ pub struct EditCounts { pub expunged: usize, /// An item was removed from the blueprint. /// - /// This usually happens after the work of expungment has completed. + /// This happens after expungement or decommissioning has completed + /// depending upon the resource type. pub removed: usize, } @@ -635,6 +637,10 @@ impl<'a> BlueprintBuilder<'a> { }) } + pub fn parent_blueprint(&self) -> &Blueprint { + &self.parent_blueprint + } + fn resource_allocator( &mut self, ) -> Result<&mut BlueprintResourceAllocator, Error> { @@ -685,6 +691,20 @@ impl<'a> BlueprintBuilder<'a> { Either::Right(editor.zones(filter)) } + pub fn current_sled_disks( + &self, + sled_id: SledUuid, + filter: F, + ) -> impl Iterator + where + F: FnMut(BlueprintPhysicalDiskDisposition) -> bool, + { + let Some(editor) = self.sled_editors.get(&sled_id) else { + return Either::Left(iter::empty()); + }; + Either::Right(editor.disks(filter)) + } + /// Assemble a final [`Blueprint`] based on the contents of the builder pub fn build(mut self) -> Blueprint { let blueprint_id = self.rng.next_blueprint(); @@ -719,27 +739,12 @@ impl<'a> BlueprintBuilder<'a> { ); } } - // Preserving backwards compatibility, for now: disks should only - // have entries for in-service sleds, and expunged disks should be - // removed entirely. + // Preserving backwards compatibility, for now: datasets should only + // have entries for in-service sleds. let in_service_sled_ids = self .input .all_sled_ids(SledFilter::InService) .collect::>(); - blueprint_disks.retain(|sled_id, disks_config| { - if !in_service_sled_ids.contains(sled_id) { - return false; - } - - disks_config.disks.retain(|config| match config.disposition { - BlueprintPhysicalDiskDisposition::InService => true, - BlueprintPhysicalDiskDisposition::Expunged => false, - }); - - true - }); - // Preserving backwards compatibility, for now: datasets should only - // have entries for in-service sleds. blueprint_datasets .retain(|sled_id, _| in_service_sled_ids.contains(sled_id)); @@ -904,13 +909,10 @@ impl<'a> BlueprintBuilder<'a> { 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 in + editor.disks(BlueprintPhysicalDiskDisposition::is_in_service) + { + disks_to_expunge.push(disk.id); } for disk_id in disks_to_expunge { let details = editor @@ -921,6 +923,13 @@ impl<'a> BlueprintBuilder<'a> { } num_datasets_expunged += details.num_datasets_expunged; num_zones_expunged += details.num_zones_expunged; + + // When we expunge a disk on an expunged sled, we can decommission + // it immediately because the sled is already gone. There is no sled + // agent to notify about the disk expungement. + editor + .decommission_disk(&disk_id) + .map_err(|err| Error::SledEditError { sled_id, err })?; } // Expunging a disk expunges any datasets and zones that depend on it, @@ -1050,35 +1059,23 @@ impl<'a> BlueprintBuilder<'a> { Ok(()) } - /// Ensures that the blueprint contains disks for a sled which already - /// exists in the database. - /// - /// This operation must perform the following: - /// - Ensure that any disks / zpools that exist in the database - /// are propagated into the blueprint. - /// - Ensure that any disks that are expunged from the database are - /// removed from the blueprint. - pub fn sled_ensure_disks( + /// Add any disks to the blueprint + /// Called by the planner in the `do_plan_add()` stage of planning + pub fn sled_add_disks( &mut self, sled_id: SledUuid, - resources: &SledResources, + sled_resources: &SledResources, ) -> Result { - // These are the disks known to our (last?) blueprint let editor = self.sled_editors.get_mut(&sled_id).ok_or_else(|| { Error::Planner(anyhow!( - "tried to ensure disks for unknown sled {sled_id}" + "tried to add disks for unknown sled {sled_id}" )) })?; let initial_counts = editor.edit_counts(); - let blueprint_disk_ids = editor - .disks(DiskFilter::InService) - .map(|config| config.id) - .collect::>(); - // These are the in-service disks as we observed them in the database, // during the planning phase - let database_disks = resources + let database_disks = sled_resources .all_disks(DiskFilter::InService) .map(|(zpool, disk)| (disk.disk_id, (zpool, disk))); let mut database_disk_ids = BTreeSet::new(); @@ -1101,19 +1098,38 @@ impl<'a> BlueprintBuilder<'a> { .map_err(|err| Error::SledEditError { sled_id, err })?; } - // Remove any disks that appear in the blueprint, but not the database - for disk_id in blueprint_disk_ids { - if !database_disk_ids.contains(&disk_id) { - editor - .expunge_disk(&disk_id) - .map_err(|err| Error::SledEditError { sled_id, err })?; - } - } let final_counts = editor.edit_counts(); - Ok(final_counts.difference_since(initial_counts)) } + /// Decommission any expunged disks. + /// + /// Note: This method is called by the planner only for `InService` sleds. + /// `Self::expunge_sled` expunges and decommissions disks immediately since + /// the sled is already gone by that point. + /// + /// Called by the planner in + /// `do_plan_decommission_expunged_disks_for_in_service_sled()`. + pub fn sled_decommission_disks( + &mut self, + sled_id: SledUuid, + disk_ids: Vec, + ) -> Result<(), Error> { + let editor = self.sled_editors.get_mut(&sled_id).ok_or_else(|| { + Error::Planner(anyhow!( + "tried to decommission disks for unknown sled {sled_id}" + )) + })?; + + for disk_id in disk_ids { + editor + .decommission_disk(&disk_id) + .map_err(|err| Error::SledEditError { sled_id, err })?; + } + + Ok(()) + } + /// Ensure that a sled in the blueprint has all the datasets it needs for /// its running zones. /// @@ -1828,7 +1844,7 @@ impl<'a> BlueprintBuilder<'a> { // blueprint and the list of all in-service zpools on this sled per our // planning input, and only pick zpools that are available in both. let current_sled_disks = editor - .disks(DiskFilter::InService) + .disks(BlueprintPhysicalDiskDisposition::is_in_service) .map(|disk_config| disk_config.pool_id) .collect::>(); @@ -2136,7 +2152,7 @@ pub mod test { for (sled_id, sled_resources) in example.input.all_sled_resources(SledFilter::Commissioned) { - builder.sled_ensure_disks(sled_id, sled_resources).unwrap(); + builder.sled_add_disks(sled_id, sled_resources).unwrap(); builder.sled_ensure_zone_ntp(sled_id).unwrap(); for pool_id in sled_resources.zpools.keys() { builder.sled_ensure_zone_crucible(sled_id, *pool_id).unwrap(); @@ -2173,7 +2189,7 @@ pub mod test { .sled_lookup(SledFilter::Commissioned, new_sled_id) .unwrap() .resources; - builder.sled_ensure_disks(new_sled_id, new_sled_resources).unwrap(); + builder.sled_add_disks(new_sled_id, &new_sled_resources).unwrap(); builder.sled_ensure_zone_ntp(new_sled_id).unwrap(); for pool_id in new_sled_resources.zpools.keys() { builder.sled_ensure_zone_crucible(new_sled_id, *pool_id).unwrap(); @@ -2397,7 +2413,7 @@ pub mod test { let logctx = test_setup_log(TEST_NAME); // Start with an empty system (sleds with no zones). However, we leave - // the disks around so that `sled_ensure_disks` can add them. + // the disks around so that `sled_add_disks` can add them. let (example, parent) = ExampleSystemBuilder::new(&logctx.log, TEST_NAME) .create_zones(false) @@ -2424,7 +2440,7 @@ pub mod test { .sled_editors .get(&sled_id) .unwrap() - .disks(DiskFilter::All) + .disks(BlueprintPhysicalDiskDisposition::any) .collect::>(); assert!( disks.is_empty(), @@ -2435,9 +2451,8 @@ pub mod test { for (sled_id, sled_resources) in input.all_sled_resources(SledFilter::InService) { - let edits = builder - .sled_ensure_disks(sled_id, &sled_resources) - .unwrap(); + let edits = + builder.sled_add_disks(sled_id, &sled_resources).unwrap(); assert_eq!( edits.disks, EditCounts { diff --git a/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor.rs b/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor.rs index b20b18d287..c21efb7bea 100644 --- a/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor.rs +++ b/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor.rs @@ -14,12 +14,12 @@ use nexus_types::deployment::BlueprintDatasetConfig; use nexus_types::deployment::BlueprintDatasetFilter; use nexus_types::deployment::BlueprintDatasetsConfig; use nexus_types::deployment::BlueprintPhysicalDiskConfig; +use nexus_types::deployment::BlueprintPhysicalDiskDisposition; use nexus_types::deployment::BlueprintPhysicalDisksConfig; use nexus_types::deployment::BlueprintZoneConfig; use nexus_types::deployment::BlueprintZoneDisposition; 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; @@ -227,10 +227,13 @@ impl SledEditor { .ok_or(SledEditError::OutOfUnderlayIps) } - pub fn disks( + pub fn disks( &self, - filter: DiskFilter, - ) -> impl Iterator { + mut filter: F, + ) -> impl Iterator + where + F: FnMut(BlueprintPhysicalDiskDisposition) -> bool, + { match &self.0 { InnerSledEditor::Active(editor) => { Either::Left(editor.disks(filter)) @@ -240,7 +243,7 @@ impl SledEditor { .disks .disks .iter() - .filter(move |disk| disk.disposition.matches(filter)), + .filter(move |disk| filter(disk.disposition)), ), } } @@ -300,8 +303,7 @@ impl SledEditor { disk: BlueprintPhysicalDiskConfig, rng: &mut SledPlannerRng, ) -> Result<(), SledEditError> { - self.as_active_mut()?.ensure_disk(disk, rng); - Ok(()) + self.as_active_mut()?.ensure_disk(disk, rng) } pub fn expunge_disk( @@ -311,6 +313,14 @@ impl SledEditor { self.as_active_mut()?.expunge_disk(disk_id) } + pub fn decommission_disk( + &mut self, + disk_id: &PhysicalDiskUuid, + ) -> Result<(), SledEditError> { + self.as_active_mut()?.decommission_disk(disk_id)?; + Ok(()) + } + pub fn add_zone( &mut self, zone: BlueprintZoneConfig, @@ -457,10 +467,13 @@ impl ActiveSledEditor { self.underlay_ip_allocator.alloc() } - pub fn disks( + pub fn disks( &self, - filter: DiskFilter, - ) -> impl Iterator { + filter: F, + ) -> impl Iterator + where + F: FnMut(BlueprintPhysicalDiskDisposition) -> bool, + { self.disks.disks(filter) } @@ -485,10 +498,10 @@ impl ActiveSledEditor { &mut self, disk: BlueprintPhysicalDiskConfig, rng: &mut SledPlannerRng, - ) { + ) -> Result<(), SledEditError> { let zpool = ZpoolName::new_external(disk.pool_id); - self.disks.ensure(disk); + self.disks.ensure(disk)?; // Every disk also gets a Debug and Transient Zone Root dataset; ensure // both of those exist as well. @@ -497,6 +510,8 @@ impl ActiveSledEditor { self.datasets.ensure_in_service(debug, rng); self.datasets.ensure_in_service(zone_root, rng); + + Ok(()) } pub fn expunge_disk( @@ -526,6 +541,15 @@ impl ActiveSledEditor { }) } + pub fn decommission_disk( + &mut self, + disk_id: &PhysicalDiskUuid, + ) -> Result<(), SledEditError> { + // TODO: report decommissioning + let _ = self.disks.decommission(disk_id)?; + Ok(()) + } + pub fn add_zone( &mut self, zone: BlueprintZoneConfig, 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 84cce288a7..fb8e3726e8 100644 --- a/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/disks.rs +++ b/nexus/reconfigurator/planning/src/blueprint_editor/sled_editor/disks.rs @@ -6,7 +6,6 @@ use crate::blueprint_builder::EditCounts; use nexus_types::deployment::BlueprintPhysicalDiskConfig; use nexus_types::deployment::BlueprintPhysicalDiskDisposition; use nexus_types::deployment::BlueprintPhysicalDisksConfig; -use nexus_types::deployment::DiskFilter; use omicron_common::api::external::Generation; use omicron_uuid_kinds::PhysicalDiskUuid; use omicron_uuid_kinds::ZpoolUuid; @@ -17,6 +16,12 @@ use std::collections::BTreeMap; pub enum DisksEditError { #[error("tried to expunge nonexistent disk {id}")] ExpungeNonexistentDisk { id: PhysicalDiskUuid }, + #[error("tried to decommission nonexistent disk {id}")] + DecommissionNonexistentDisk { id: PhysicalDiskUuid }, + #[error("tried to mark an expunged disk as in service {id}")] + AddExpungedDisk { id: PhysicalDiskUuid }, + #[error("tried to decommission an in service disk {id}")] + DecommissionInServiceDisk { id: PhysicalDiskUuid }, } #[derive(Debug, thiserror::Error)] @@ -65,32 +70,71 @@ impl DisksEditor { self.counts } - pub fn disks( + pub fn disks( &self, - filter: DiskFilter, - ) -> impl Iterator { - self.disks - .values() - .filter(move |config| config.disposition.matches(filter)) + mut filter: F, + ) -> impl Iterator + where + F: FnMut(BlueprintPhysicalDiskDisposition) -> bool, + { + self.disks.values().filter(move |config| filter(config.disposition)) } pub fn contains_zpool(&self, zpool_id: &ZpoolUuid) -> bool { self.disks.values().any(|disk| disk.pool_id == *zpool_id) } - pub fn ensure(&mut self, disk: BlueprintPhysicalDiskConfig) { + pub fn ensure( + &mut self, + disk: BlueprintPhysicalDiskConfig, + ) -> Result<(), DisksEditError> { match self.disks.entry(disk.id) { Entry::Vacant(slot) => { slot.insert(disk); self.counts.added += 1; } Entry::Occupied(mut slot) => { - if *slot.get() != disk { + let existing = slot.get(); + if *existing != disk { + match (existing.disposition, disk.disposition) { + // All other combinations are valid + ( + BlueprintPhysicalDiskDisposition::Expunged { + .. + }, + BlueprintPhysicalDiskDisposition::InService, + ) => { + return Err(DisksEditError::AddExpungedDisk { + id: disk.id, + }); + } + // All following combinations are valid + ( + BlueprintPhysicalDiskDisposition::Expunged { + .. + }, + BlueprintPhysicalDiskDisposition::Expunged { + .. + }, + ) => (), + ( + BlueprintPhysicalDiskDisposition::InService, + BlueprintPhysicalDiskDisposition::InService, + ) => (), + ( + BlueprintPhysicalDiskDisposition::InService, + BlueprintPhysicalDiskDisposition::Expunged { + .. + }, + ) => (), + } + slot.insert(disk); self.counts.updated += 1; } } } + Ok(()) } pub fn expunge( @@ -104,11 +148,18 @@ impl DisksEditor { let did_expunge: bool; match config.disposition { BlueprintPhysicalDiskDisposition::InService => { - config.disposition = BlueprintPhysicalDiskDisposition::Expunged; + config.disposition = + BlueprintPhysicalDiskDisposition::Expunged { + // We don't update the editor generation until the call + // to `finalize` which occurs later. We bump it here + // to compensate. + as_of_generation: self.generation.next(), + ready_for_cleanup: false, + }; self.counts.expunged += 1; did_expunge = true; } - BlueprintPhysicalDiskDisposition::Expunged => { + BlueprintPhysicalDiskDisposition::Expunged { .. } => { // expunge is idempotent; do nothing did_expunge = false; } @@ -116,6 +167,43 @@ impl DisksEditor { Ok((did_expunge, config.pool_id)) } + + pub fn decommission( + &mut self, + disk_id: &PhysicalDiskUuid, + ) -> Result { + let config = self.disks.get_mut(disk_id).ok_or_else(|| { + DisksEditError::DecommissionNonexistentDisk { id: *disk_id } + })?; + + match config.disposition { + BlueprintPhysicalDiskDisposition::InService => { + return Err(DisksEditError::DecommissionInServiceDisk { + id: *disk_id, + }); + } + BlueprintPhysicalDiskDisposition::Expunged { + ready_for_cleanup: false, + as_of_generation, + } => { + config.disposition = + BlueprintPhysicalDiskDisposition::Expunged { + ready_for_cleanup: true, + as_of_generation, + }; + let did_decommission = true; + Ok(did_decommission) + } + // We've already decommissioned this disk + BlueprintPhysicalDiskDisposition::Expunged { + ready_for_cleanup: true, + .. + } => { + let did_decommision = false; + Ok(did_decommision) + } + } + } } impl TryFrom for DisksEditor { diff --git a/nexus/reconfigurator/planning/src/example.rs b/nexus/reconfigurator/planning/src/example.rs index 535b3f7ee6..fdc1680fc1 100644 --- a/nexus/reconfigurator/planning/src/example.rs +++ b/nexus/reconfigurator/planning/src/example.rs @@ -418,12 +418,13 @@ impl ExampleSystemBuilder { ); } - for (i, (sled_id, sled_resources)) in - base_input.all_sled_resources(SledFilter::Commissioned).enumerate() + for (i, (sled_id, sled_details)) in + base_input.all_sleds(SledFilter::Commissioned).enumerate() { if self.create_disks_in_blueprint { - let _ = - builder.sled_ensure_disks(sled_id, sled_resources).unwrap(); + let _ = builder + .sled_add_disks(sled_id, &sled_details.resources) + .unwrap(); } if self.create_zones { let _ = builder.sled_ensure_zone_ntp(sled_id).unwrap(); @@ -446,7 +447,7 @@ impl ExampleSystemBuilder { } } if self.create_zones { - for pool_name in sled_resources.zpools.keys() { + for pool_name in sled_details.resources.zpools.keys() { let _ = builder .sled_ensure_zone_crucible(sled_id, *pool_name) .unwrap(); diff --git a/nexus/reconfigurator/planning/src/planner.rs b/nexus/reconfigurator/planning/src/planner.rs index f293a62635..b7c126ae77 100644 --- a/nexus/reconfigurator/planning/src/planner.rs +++ b/nexus/reconfigurator/planning/src/planner.rs @@ -17,6 +17,7 @@ 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::BlueprintPhysicalDiskDisposition; use nexus_types::deployment::BlueprintZoneDisposition; use nexus_types::deployment::CockroachDbClusterVersion; use nexus_types::deployment::CockroachDbPreserveDowngrade; @@ -30,6 +31,7 @@ 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; +use omicron_uuid_kinds::PhysicalDiskUuid; use omicron_uuid_kinds::SledUuid; use slog::error; use slog::{info, warn, Logger}; @@ -124,13 +126,25 @@ impl<'a> Planner<'a> { // 4. All disks associated with the sled have been marked expunged. This // happens implicitly when a sled is expunged, so is covered by our // first check. + // + // Note that we must check both the planning input, and the parent + // blueprint to tell if a sled is decommissioned because we carry + // decommissioned sleds forward and do not prune them from the blueprint + // right away. for (sled_id, sled_details) in self.input.all_sleds(SledFilter::Commissioned) { // Check 1: look for sleds that are expunged. match (sled_details.policy, sled_details.state) { // If the sled is still in service, don't decommission it. - (SledPolicy::InService { .. }, _) => continue, + // + // We do still want to decommission any expunged disks if + // possible though. For example, we can expunge disks on active + // sleds if they are faulty. + (SledPolicy::InService { .. }, _) => { + self.do_plan_decommission_expunged_disks_for_in_service_sled(sled_id)?; + continue; + } // If the sled is already decommissioned it... why is it showing // up when we ask for commissioned sleds? Warn, but don't try to // decommission it again. @@ -148,6 +162,15 @@ impl<'a> Planner<'a> { (SledPolicy::Expunged, SledState::Active) => (), } + // Check that the sled isn't already decommissioned in the parent blueprint, if it exists. + if let Some(sled_state) = + self.blueprint.parent_blueprint().sled_state.get(&sled_id) + { + if *sled_state == SledState::Decommissioned { + continue; + } + } + // Check 2: have all this sled's zones been expunged? It's possible // we ourselves have made this change, which is fine. let all_zones_expunged = self @@ -173,6 +196,51 @@ impl<'a> Planner<'a> { Ok(()) } + fn do_plan_decommission_expunged_disks_for_in_service_sled( + &mut self, + sled_id: SledUuid, + ) -> Result<(), Error> { + // The sled is not expunged. We have to see if the inventory + // reflects the parent blueprint disk generation. If it does + // then we mark any expunged disks decommissioned. + let Some(seen_generation) = self + .inventory + .sled_agents + .get(&sled_id) + .map(|sa| sa.omicron_physical_disks_generation) + else { + // There is no current inventory for the sled agent, so we cannot + // decommission any disks. + return Ok(()); + }; + + let disks_to_decommission: Vec = self + .blueprint + .current_sled_disks(sled_id, |disposition| match disposition { + BlueprintPhysicalDiskDisposition::Expunged { + ready_for_cleanup, + .. + } => !ready_for_cleanup, + BlueprintPhysicalDiskDisposition::InService => false, + }) + .filter_map(|disk| { + // Has the sled agent seen this disk's expungement yet as + // reflected in inventory? + // + // SAFETY: We filtered to only have expunged disks above + if seen_generation + >= disk.disposition.expunged_as_of_generation().unwrap() + { + Some(disk.id) + } else { + None + } + }) + .collect(); + + self.blueprint.sled_decommission_disks(sled_id, disks_to_decommission) + } + fn do_plan_expunge(&mut self) -> Result<(), Error> { let mut commissioned_sled_ids = BTreeSet::new(); @@ -320,7 +388,8 @@ impl<'a> Planner<'a> { // First, we need to ensure that sleds are using their expected // disks. This is necessary before we can allocate any zones. let sled_edits = - self.blueprint.sled_ensure_disks(sled_id, &sled_resources)?; + self.blueprint.sled_add_disks(sled_id, &sled_resources)?; + if let EnsureMultiple::Changed { added, updated, @@ -840,6 +909,8 @@ pub(crate) mod test { use nexus_types::deployment::blueprint_zone_type; use nexus_types::deployment::BlueprintDatasetDisposition; use nexus_types::deployment::BlueprintDiffSummary; + use nexus_types::deployment::BlueprintPhysicalDiskDisposition; + use nexus_types::deployment::BlueprintZoneDisposition; use nexus_types::deployment::BlueprintZoneType; use nexus_types::deployment::ClickhouseMode; use nexus_types::deployment::ClickhousePolicy; @@ -1421,10 +1492,10 @@ pub(crate) mod test { // IP no longer being associated with a running zone, and a new Nexus // zone being added to one of the two remaining sleds. let mut builder = input.into_builder(); - let (sled_id, details) = + let (sled_id, _) = builder.sleds_mut().iter_mut().next().expect("no sleds"); let sled_id = *sled_id; - details.policy = SledPolicy::Expunged; + builder.expunge_sled(&sled_id).unwrap(); let input = builder.build(); let blueprint2 = Planner::new_based_on( logctx.log.clone(), @@ -1624,11 +1695,7 @@ pub(crate) mod test { // external DNS zones; two external DNS zones should then be added to // the remaining sleds. let mut input_builder = input.into_builder(); - input_builder - .sleds_mut() - .get_mut(&sled_1) - .expect("found sled 1 again") - .policy = SledPolicy::Expunged; + input_builder.expunge_sled(&sled_1).expect("found sled 1 again"); let input = input_builder.build(); let blueprint3 = Planner::new_based_on( logctx.log.clone(), @@ -1871,6 +1938,215 @@ pub(crate) mod test { logctx.cleanup_successful(); } + #[test] + fn test_disk_add_expunge_decommission() { + static TEST_NAME: &str = "planner_disk_add_expunge_decommission"; + let logctx = test_setup_log(TEST_NAME); + + // Create an example system with a single sled + let (example, blueprint1) = + ExampleSystemBuilder::new(&logctx.log, TEST_NAME).nsleds(1).build(); + let mut collection = example.collection; + let input = example.input; + + // The initial collection configuration has generation 1 for disks + // The initial blueprint configuration has generation 2 for disks + let (sled_id, disks_config) = + blueprint1.blueprint_disks.first_key_value().unwrap(); + assert_eq!(disks_config.generation, Generation::from_u32(2)); + assert_eq!( + collection + .sled_agents + .get(&sled_id) + .unwrap() + .omicron_physical_disks_generation, + Generation::new() + ); + + // All disks should have an `InService` disposition and `Active` state + for disk in &disks_config.disks { + assert_eq!( + disk.disposition, + BlueprintPhysicalDiskDisposition::InService + ); + } + + let mut builder = input.into_builder(); + + // Let's expunge a disk. Its disposition should change to `Expunged` + // but its state should remain active. + let expunged_disk_id = { + let expunged_disk = &mut builder + .sleds_mut() + .get_mut(&sled_id) + .unwrap() + .resources + .zpools + .iter_mut() + .next() + .unwrap() + .1; + expunged_disk.policy = PhysicalDiskPolicy::Expunged; + expunged_disk.disk_id + }; + + let input = builder.build(); + + let blueprint2 = Planner::new_based_on( + logctx.log.clone(), + &blueprint1, + &input, + "test: expunge a disk", + &collection, + ) + .expect("failed to create planner") + .with_rng(PlannerRng::from_seed((TEST_NAME, "bp2"))) + .plan() + .expect("failed to plan"); + + let diff = blueprint2.diff_since_blueprint(&blueprint1); + println!("1 -> 2 (expunge a disk):\n{}", diff.display()); + + let (_, disks_config) = + blueprint2.blueprint_disks.first_key_value().unwrap(); + + // The disks generation goes from 2 -> 3 + assert_eq!(disks_config.generation, Generation::from_u32(3)); + // One disk should have it's disposition set to + // `Expunged{ready_for_cleanup: false, ..}`. + for disk in &disks_config.disks { + if disk.id == expunged_disk_id { + assert!(matches!( + disk.disposition, + BlueprintPhysicalDiskDisposition::Expunged { + ready_for_cleanup: false, + .. + } + )); + } else { + assert_eq!( + disk.disposition, + BlueprintPhysicalDiskDisposition::InService + ); + } + println!("{disk:?}"); + } + + // We haven't updated the inventory, so no changes should be made + assert_planning_makes_no_changes( + &logctx.log, + &blueprint2, + &input, + &collection, + TEST_NAME, + ); + + // Let's update the inventory to reflect that the sled-agent + // has learned about the expungement. + collection + .sled_agents + .get_mut(&sled_id) + .unwrap() + .omicron_physical_disks_generation = Generation::from_u32(3); + + let blueprint3 = Planner::new_based_on( + logctx.log.clone(), + &blueprint2, + &input, + "test: decommission a disk", + &collection, + ) + .expect("failed to create planner") + .with_rng(PlannerRng::from_seed((TEST_NAME, "bp3"))) + .plan() + .expect("failed to plan"); + + let diff = blueprint3.diff_since_blueprint(&blueprint2); + println!("2 -> 3 (decommission a disk):\n{}", diff.display()); + + let (_, disks_config) = + blueprint3.blueprint_disks.first_key_value().unwrap(); + + // The disks generation does not change, as decommissioning doesn't bump + // the generation. + // + // The reason for this is because the generation is there primarily to + // inform the sled-agent that it has work to do, but decommissioning + // doesn't trigger any sled-agent changes. + assert_eq!(disks_config.generation, Generation::from_u32(3)); + // One disk should have its disposition set to + // `Expunged{ready_for_cleanup: true, ..}`. + for disk in &disks_config.disks { + if disk.id == expunged_disk_id { + assert!(matches!( + disk.disposition, + BlueprintPhysicalDiskDisposition::Expunged { + ready_for_cleanup: true, + .. + } + )); + } else { + assert_eq!( + disk.disposition, + BlueprintPhysicalDiskDisposition::InService + ); + } + println!("{disk:?}"); + } + + // Now let's expunge a sled via the planning input. All disks should get + // expunged and decommissioned in the same planning round. We also have + // to manually expunge all the disks via policy, which would happen in a + // database transaction when an operator expunges a sled. + // + // We don't rely on the sled-agents learning about expungement to + // decommission because by definition expunging a sled means it's + // already gone. + let mut builder = input.into_builder(); + builder.expunge_sled(sled_id).unwrap(); + let input = builder.build(); + + let blueprint4 = Planner::new_based_on( + logctx.log.clone(), + &blueprint3, + &input, + "test: expunge and decommission all disks", + &collection, + ) + .expect("failed to create planner") + .with_rng(PlannerRng::from_seed((TEST_NAME, "bp4"))) + .plan() + .expect("failed to plan"); + + let diff = blueprint3.diff_since_blueprint(&blueprint2); + println!( + "3 -> 4 (expunge and decommission all disks):\n{}", + diff.display() + ); + + let (_, disks_config) = + blueprint4.blueprint_disks.first_key_value().unwrap(); + + // The disks generation goes from 3 -> 4 + assert_eq!(disks_config.generation, Generation::from_u32(4)); + // We should still have 10 disks + assert_eq!(disks_config.disks.len(), 10); + // All disks should have their disposition set to + // `Expunged{ready_for_cleanup: true, ..}`. + for disk in &disks_config.disks { + assert!(matches!( + disk.disposition, + BlueprintPhysicalDiskDisposition::Expunged { + ready_for_cleanup: true, + .. + } + )); + println!("{disk:?}"); + } + + logctx.cleanup_successful(); + } + #[test] fn test_disk_expungement_removes_zones_durable_zpool() { static TEST_NAME: &str = @@ -1945,7 +2221,7 @@ pub(crate) mod test { 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_disks_removed(), 0); 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. @@ -2204,8 +2480,10 @@ pub(crate) mod test { }; println!("1 -> 2: marked non-provisionable {nonprovisionable_sled_id}"); let expunged_sled_id = { - let (sled_id, details) = sleds_iter.next().expect("no sleds"); - details.policy = SledPolicy::Expunged; + let (sled_id, _) = sleds_iter.next().expect("no sleds"); + // We need to call builder.expunge_sled(), but can't while + // iterating; we defer that work until after we're done with + // `sleds_iter`. *sled_id }; println!("1 -> 2: expunged {expunged_sled_id}"); @@ -2213,12 +2491,19 @@ pub(crate) mod test { let (sled_id, details) = sleds_iter.next().expect("no sleds"); details.state = SledState::Decommissioned; + // Drop the mutable borrow on the builder so we can call + // `builder.expunge_sled()` + let sled_id = *sled_id; + // Let's also properly expunge the sled and its disks. We can't have + // a decommissioned sled that is not expunged also. + builder.expunge_sled(&sled_id).unwrap(); + // Decommissioned sleds can only occur if their zones have been // expunged, so lie and pretend like that already happened // (otherwise the planner will rightfully fail to generate a new // blueprint, because we're feeding it invalid inputs). for mut zone in - &mut blueprint1.blueprint_zones.get_mut(sled_id).unwrap().zones + &mut blueprint1.blueprint_zones.get_mut(&sled_id).unwrap().zones { zone.disposition = BlueprintZoneDisposition::Expunged { as_of_generation: Generation::new(), @@ -2232,12 +2517,14 @@ pub(crate) mod test { // that's an invalid state that the planner will reject. *blueprint1 .sled_state - .get_mut(sled_id) + .get_mut(&sled_id) .expect("found state in parent blueprint") = SledState::Decommissioned; - *sled_id + sled_id }; + // Actually expunge the sled (the work that was deferred during iteration above) + builder.expunge_sled(&expunged_sled_id).unwrap(); println!("1 -> 2: decommissioned {decommissioned_sled_id}"); // Now run the planner with a high number of target Nexus zones. The @@ -2492,15 +2779,18 @@ pub(crate) mod test { let (collection, input, blueprint1) = example(&logctx.log, TEST_NAME); // Expunge one of the sleds. + // + // We expunge a sled via planning input using the builder so that disks + // are properly taken into account. let mut builder = input.into_builder(); let expunged_sled_id = { let mut iter = builder.sleds_mut().iter_mut(); - let (sled_id, details) = iter.next().expect("at least one sled"); - details.policy = SledPolicy::Expunged; + let (sled_id, _) = iter.next().expect("at least one sled"); *sled_id }; - + builder.expunge_sled(&expunged_sled_id).expect("sled is expungable"); let input = builder.build(); + let mut blueprint2 = Planner::new_based_on( logctx.log.clone(), &blueprint1, @@ -3367,8 +3657,7 @@ pub(crate) mod test { // Expunge a keeper zone let mut builder = input.into_builder(); - builder.sleds_mut().get_mut(&sled_id).unwrap().policy = - SledPolicy::Expunged; + builder.expunge_sled(&sled_id).unwrap(); let input = builder.build(); let blueprint4 = Planner::new_based_on( 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 b607a92241..d2495da053 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 @@ -4,19 +4,19 @@ parent: e35b2fdd-354d-48d9-acb5-703b2c269a54 sled: 0dbf1e39-e265-4071-a8df-6d1225b46694 (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-2b9c7004-fa39-4cf0-ae41-c299d3191f26 - fake-vendor fake-model serial-3ad934d9-90ee-4805-881c-20108827773f - fake-vendor fake-model serial-69db5dd6-795e-4e04-bfb3-f51962c49853 - fake-vendor fake-model serial-8557a3fb-cc12-497f-86d2-9f1a463b3685 - fake-vendor fake-model serial-9bd3cc34-4891-4c28-a4de-c4fcf01b6215 - fake-vendor fake-model serial-9dafffa2-31b7-43c0-b673-0c946be799f0 - fake-vendor fake-model serial-9e626a52-b5f1-4776-9cb8-271848b9c651 - fake-vendor fake-model serial-a645a1ac-4c49-4c7e-ba53-3dc60b737f06 - fake-vendor fake-model serial-b5ae209c-9226-44a0-8a6b-03b44f93d456 - fake-vendor fake-model serial-cd783b74-e400-41e0-9bb7-1d1d2f8958ce + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-2b9c7004-fa39-4cf0-ae41-c299d3191f26 in service + fake-vendor fake-model serial-3ad934d9-90ee-4805-881c-20108827773f in service + fake-vendor fake-model serial-69db5dd6-795e-4e04-bfb3-f51962c49853 in service + fake-vendor fake-model serial-8557a3fb-cc12-497f-86d2-9f1a463b3685 in service + fake-vendor fake-model serial-9bd3cc34-4891-4c28-a4de-c4fcf01b6215 in service + fake-vendor fake-model serial-9dafffa2-31b7-43c0-b673-0c946be799f0 in service + fake-vendor fake-model serial-9e626a52-b5f1-4776-9cb8-271848b9c651 in service + fake-vendor fake-model serial-a645a1ac-4c49-4c7e-ba53-3dc60b737f06 in service + fake-vendor fake-model serial-b5ae209c-9226-44a0-8a6b-03b44f93d456 in service + fake-vendor fake-model serial-cd783b74-e400-41e0-9bb7-1d1d2f8958ce in service datasets at generation 2: @@ -105,19 +105,19 @@ parent: e35b2fdd-354d-48d9-acb5-703b2c269a54 sled: 15cf73a6-445b-4d36-9232-5ed364019bc6 (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-3cba16f1-1a3d-44e5-ba1d-e68cd2188615 - fake-vendor fake-model serial-3fc3ec87-1c39-4df8-99bf-30ca97ec5fac - fake-vendor fake-model serial-4c18c1af-dc1c-4de5-92a1-1b2923ea6a87 - fake-vendor fake-model serial-6f3a85db-de97-40d9-bf66-e6643ac1c114 - fake-vendor fake-model serial-96f39cf4-b2ac-413d-8f94-ba66b127cddd - fake-vendor fake-model serial-99c392f3-77b8-4f60-9efa-4efae0c92721 - fake-vendor fake-model serial-bc3195df-61ca-4111-863b-08b5cc243eab - fake-vendor fake-model serial-c787b52c-2cb8-4da2-a17a-128feb5eea0c - fake-vendor fake-model serial-d59d419e-c4d3-41ef-ab6d-0df3620dc84b - fake-vendor fake-model serial-dfaae221-11a9-4db0-b861-41fe5648f185 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-3cba16f1-1a3d-44e5-ba1d-e68cd2188615 in service + fake-vendor fake-model serial-3fc3ec87-1c39-4df8-99bf-30ca97ec5fac in service + fake-vendor fake-model serial-4c18c1af-dc1c-4de5-92a1-1b2923ea6a87 in service + fake-vendor fake-model serial-6f3a85db-de97-40d9-bf66-e6643ac1c114 in service + fake-vendor fake-model serial-96f39cf4-b2ac-413d-8f94-ba66b127cddd in service + fake-vendor fake-model serial-99c392f3-77b8-4f60-9efa-4efae0c92721 in service + fake-vendor fake-model serial-bc3195df-61ca-4111-863b-08b5cc243eab in service + fake-vendor fake-model serial-c787b52c-2cb8-4da2-a17a-128feb5eea0c in service + fake-vendor fake-model serial-d59d419e-c4d3-41ef-ab6d-0df3620dc84b in service + fake-vendor fake-model serial-dfaae221-11a9-4db0-b861-41fe5648f185 in service datasets at generation 2: @@ -201,19 +201,19 @@ parent: e35b2fdd-354d-48d9-acb5-703b2c269a54 sled: 50e6c1c0-43b2-4abc-9041-41165597f639 (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-00fb9aa9-0bbf-49ab-a712-6e8feaf719e2 - fake-vendor fake-model serial-37f466d7-510b-40e4-b9a4-c5c092a6a5f6 - fake-vendor fake-model serial-734b7b3a-86af-48a7-bd00-8d79fa2690c3 - fake-vendor fake-model serial-747d2504-36a4-4acc-ad73-22291b5bbedb - fake-vendor fake-model serial-7dd422ab-4839-4a7a-8109-ba1941357c70 - fake-vendor fake-model serial-8b020037-bc77-48b2-9280-a622f571908b - fake-vendor fake-model serial-96753d7f-de6b-4ce6-a9dc-004f6a0ba0cf - fake-vendor fake-model serial-a0bd8e79-1113-4c40-8705-ed00e66f0c35 - fake-vendor fake-model serial-b30e150e-c83e-4c1e-b3bf-91a330d42135 - fake-vendor fake-model serial-ff911b9b-57a8-4318-a253-e2363b70083d + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-00fb9aa9-0bbf-49ab-a712-6e8feaf719e2 in service + fake-vendor fake-model serial-37f466d7-510b-40e4-b9a4-c5c092a6a5f6 in service + fake-vendor fake-model serial-734b7b3a-86af-48a7-bd00-8d79fa2690c3 in service + fake-vendor fake-model serial-747d2504-36a4-4acc-ad73-22291b5bbedb in service + fake-vendor fake-model serial-7dd422ab-4839-4a7a-8109-ba1941357c70 in service + fake-vendor fake-model serial-8b020037-bc77-48b2-9280-a622f571908b in service + fake-vendor fake-model serial-96753d7f-de6b-4ce6-a9dc-004f6a0ba0cf in service + fake-vendor fake-model serial-a0bd8e79-1113-4c40-8705-ed00e66f0c35 in service + fake-vendor fake-model serial-b30e150e-c83e-4c1e-b3bf-91a330d42135 in service + fake-vendor fake-model serial-ff911b9b-57a8-4318-a253-e2363b70083d in service datasets at generation 2: @@ -294,19 +294,19 @@ parent: e35b2fdd-354d-48d9-acb5-703b2c269a54 sled: 969ff976-df34-402c-a362-53db03a6b97f (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-07444848-952b-4333-aa72-401c7bf5d724 - fake-vendor fake-model serial-242f8f98-fdc2-4ea9-ab69-e57b993df0df - fake-vendor fake-model serial-26cc7ce1-dc59-4398-8083-a4e1db957a46 - fake-vendor fake-model serial-3b757772-8c62-4543-a276-7c0051280687 - fake-vendor fake-model serial-981430ec-a43e-4418-bd2c-28db344c8b06 - fake-vendor fake-model serial-9dbfe441-887c-45d0-a3ed-7d8e1a63327f - fake-vendor fake-model serial-b37f5663-bedb-42a3-9b1a-5e417ee6c3d2 - fake-vendor fake-model serial-b48a178d-f7fd-4b50-811d-f7d195752710 - fake-vendor fake-model serial-be1784b0-017a-436f-8a6a-1884cddc5fa1 - fake-vendor fake-model serial-f9415bcf-5757-442a-a400-5a9ccfb5d80a + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-07444848-952b-4333-aa72-401c7bf5d724 in service + fake-vendor fake-model serial-242f8f98-fdc2-4ea9-ab69-e57b993df0df in service + fake-vendor fake-model serial-26cc7ce1-dc59-4398-8083-a4e1db957a46 in service + fake-vendor fake-model serial-3b757772-8c62-4543-a276-7c0051280687 in service + fake-vendor fake-model serial-981430ec-a43e-4418-bd2c-28db344c8b06 in service + fake-vendor fake-model serial-9dbfe441-887c-45d0-a3ed-7d8e1a63327f in service + fake-vendor fake-model serial-b37f5663-bedb-42a3-9b1a-5e417ee6c3d2 in service + fake-vendor fake-model serial-b48a178d-f7fd-4b50-811d-f7d195752710 in service + fake-vendor fake-model serial-be1784b0-017a-436f-8a6a-1884cddc5fa1 in service + fake-vendor fake-model serial-f9415bcf-5757-442a-a400-5a9ccfb5d80a in service datasets at generation 2: @@ -387,19 +387,19 @@ parent: e35b2fdd-354d-48d9-acb5-703b2c269a54 sled: ec5c0b37-b651-4c45-ac1c-24541ef9c44b (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-148436fe-d3e9-4371-8d2e-ec950cc8a84c - fake-vendor fake-model serial-7dd076f1-9d62-49a8-bc0c-5ff5d045c917 - fake-vendor fake-model serial-a50f4bb9-d19a-4be8-ad49-b9a552a21062 - fake-vendor fake-model serial-b4ee33bb-03f1-4085-9830-9da92002a969 - fake-vendor fake-model serial-b50bec8b-a8d3-4ba6-ba3d-12c2a0da911c - fake-vendor fake-model serial-b64f79f6-188f-4e98-9eac-d8111673a130 - fake-vendor fake-model serial-c144a26e-f859-42a0-adca-00d9091d98e4 - fake-vendor fake-model serial-c45c08e4-aade-4333-9dad-935ccf4e8352 - fake-vendor fake-model serial-df62d5da-7da0-468b-b328-0fefbf57568b - fake-vendor fake-model serial-e6433ded-7c90-46a9-8bda-648bcc9fbf07 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-148436fe-d3e9-4371-8d2e-ec950cc8a84c in service + fake-vendor fake-model serial-7dd076f1-9d62-49a8-bc0c-5ff5d045c917 in service + fake-vendor fake-model serial-a50f4bb9-d19a-4be8-ad49-b9a552a21062 in service + fake-vendor fake-model serial-b4ee33bb-03f1-4085-9830-9da92002a969 in service + fake-vendor fake-model serial-b50bec8b-a8d3-4ba6-ba3d-12c2a0da911c in service + fake-vendor fake-model serial-b64f79f6-188f-4e98-9eac-d8111673a130 in service + fake-vendor fake-model serial-c144a26e-f859-42a0-adca-00d9091d98e4 in service + fake-vendor fake-model serial-c45c08e4-aade-4333-9dad-935ccf4e8352 in service + fake-vendor fake-model serial-df62d5da-7da0-468b-b328-0fefbf57568b in service + fake-vendor fake-model serial-e6433ded-7c90-46a9-8bda-648bcc9fbf07 in service datasets at generation 2: diff --git a/nexus/reconfigurator/planning/tests/output/planner_basic_add_sled_2_3.txt b/nexus/reconfigurator/planning/tests/output/planner_basic_add_sled_2_3.txt index 8a578be17e..7ff32c12b4 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 @@ -6,19 +6,19 @@ to: blueprint 4171ad05-89dd-474b-846b-b007e4346366 sled 41f45d9f-766e-4ca6-a881-61ee45c80f57 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-014eb1e9-04fe-4f36-8339-0a090b053ada - fake-vendor fake-model serial-31a3bc64-7a3b-496d-b644-785dc44b6e37 - fake-vendor fake-model serial-7bb40bd6-9c43-4b63-8337-18313c72aea2 - fake-vendor fake-model serial-988aa8c2-cb5e-406b-9289-425dc2e5bc3a - fake-vendor fake-model serial-ad574c09-2ae0-4534-a2a4-f923ce20ae87 - fake-vendor fake-model serial-ad91e238-4901-4ff4-a91b-75233c936426 - fake-vendor fake-model serial-ce58d463-d442-4c97-a6b4-f7d98c3fd902 - fake-vendor fake-model serial-f18f7689-0059-4b79-880e-34faf7a0fe0e - fake-vendor fake-model serial-f1d6cea4-640f-415e-89fe-2b1784ce3db8 - fake-vendor fake-model serial-f4a96860-bdeb-4435-bdf5-2a10beb3d44a + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-014eb1e9-04fe-4f36-8339-0a090b053ada in service + fake-vendor fake-model serial-31a3bc64-7a3b-496d-b644-785dc44b6e37 in service + fake-vendor fake-model serial-7bb40bd6-9c43-4b63-8337-18313c72aea2 in service + fake-vendor fake-model serial-988aa8c2-cb5e-406b-9289-425dc2e5bc3a in service + fake-vendor fake-model serial-ad574c09-2ae0-4534-a2a4-f923ce20ae87 in service + fake-vendor fake-model serial-ad91e238-4901-4ff4-a91b-75233c936426 in service + fake-vendor fake-model serial-ce58d463-d442-4c97-a6b4-f7d98c3fd902 in service + fake-vendor fake-model serial-f18f7689-0059-4b79-880e-34faf7a0fe0e in service + fake-vendor fake-model serial-f1d6cea4-640f-415e-89fe-2b1784ce3db8 in service + fake-vendor fake-model serial-f4a96860-bdeb-4435-bdf5-2a10beb3d44a in service datasets at generation 2: @@ -98,19 +98,19 @@ to: blueprint 4171ad05-89dd-474b-846b-b007e4346366 sled 43677374-8d2f-4deb-8a41-eeea506db8e0 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-12057b4a-0b06-4f70-ba22-336de2385bfe - fake-vendor fake-model serial-29758363-6c77-40c3-8740-9c0c64f6e14a - fake-vendor fake-model serial-3f331c10-7882-48ab-85d9-05108490b55b - fake-vendor fake-model serial-5152d1aa-9045-4e06-9ef6-6eadac3696e4 - fake-vendor fake-model serial-5c0dd424-d905-4fc5-a73c-36254fdd470c - fake-vendor fake-model serial-794df76f-bca0-4635-9eb6-773ad0108f7e - fake-vendor fake-model serial-9024d350-38a7-459b-8550-3b2c4a88b5c1 - fake-vendor fake-model serial-95e86080-e162-4980-a589-db6bb1a95ca7 - fake-vendor fake-model serial-d55d36d7-df92-4615-944d-440a1f8b5001 - fake-vendor fake-model serial-db6686c8-2dd9-4032-8444-2a06b43baa68 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-12057b4a-0b06-4f70-ba22-336de2385bfe in service + fake-vendor fake-model serial-29758363-6c77-40c3-8740-9c0c64f6e14a in service + fake-vendor fake-model serial-3f331c10-7882-48ab-85d9-05108490b55b in service + fake-vendor fake-model serial-5152d1aa-9045-4e06-9ef6-6eadac3696e4 in service + fake-vendor fake-model serial-5c0dd424-d905-4fc5-a73c-36254fdd470c in service + fake-vendor fake-model serial-794df76f-bca0-4635-9eb6-773ad0108f7e in service + fake-vendor fake-model serial-9024d350-38a7-459b-8550-3b2c4a88b5c1 in service + fake-vendor fake-model serial-95e86080-e162-4980-a589-db6bb1a95ca7 in service + fake-vendor fake-model serial-d55d36d7-df92-4615-944d-440a1f8b5001 in service + fake-vendor fake-model serial-db6686c8-2dd9-4032-8444-2a06b43baa68 in service datasets at generation 2: @@ -187,19 +187,19 @@ to: blueprint 4171ad05-89dd-474b-846b-b007e4346366 sled 590e3034-d946-4166-b0e5-2d0034197a07 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-2a94863d-16e2-4535-973b-e98dd47fd18d - fake-vendor fake-model serial-32456d15-f5b6-4efc-90c8-dbba979b69cb - fake-vendor fake-model serial-416fe9f9-5161-4b0f-9e11-c9d81563ded5 - fake-vendor fake-model serial-4c68800e-23f8-485b-b251-628fd151e445 - fake-vendor fake-model serial-9dd87c4d-5fb4-475a-86fa-c0da81a3e00a - fake-vendor fake-model serial-be93a517-445e-46c2-aa21-3dc526d4a413 - fake-vendor fake-model serial-d9344e2b-84d2-4392-84ab-41b86ed02237 - fake-vendor fake-model serial-eab188d0-b34a-4673-b254-12e705597654 - fake-vendor fake-model serial-f1e0386f-11b6-4cdf-8250-826d256db6b5 - fake-vendor fake-model serial-f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-2a94863d-16e2-4535-973b-e98dd47fd18d in service + fake-vendor fake-model serial-32456d15-f5b6-4efc-90c8-dbba979b69cb in service + fake-vendor fake-model serial-416fe9f9-5161-4b0f-9e11-c9d81563ded5 in service + fake-vendor fake-model serial-4c68800e-23f8-485b-b251-628fd151e445 in service + fake-vendor fake-model serial-9dd87c4d-5fb4-475a-86fa-c0da81a3e00a in service + fake-vendor fake-model serial-be93a517-445e-46c2-aa21-3dc526d4a413 in service + fake-vendor fake-model serial-d9344e2b-84d2-4392-84ab-41b86ed02237 in service + fake-vendor fake-model serial-eab188d0-b34a-4673-b254-12e705597654 in service + fake-vendor fake-model serial-f1e0386f-11b6-4cdf-8250-826d256db6b5 in service + fake-vendor fake-model serial-f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b in service datasets at generation 2: @@ -278,19 +278,19 @@ to: blueprint 4171ad05-89dd-474b-846b-b007e4346366 sled ec61eded-c34f-443d-a580-dadf757529c4 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- -+ fake-vendor fake-model serial-28699448-c5d9-49ea-bf7e-627800efe783 -+ fake-vendor fake-model serial-2c490e96-27f2-4a7f-b440-04d4bfd1e4f6 -+ fake-vendor fake-model serial-4c3bb1c7-55b6-49b8-b212-516b8f2c26c2 -+ fake-vendor fake-model serial-5db07562-31a8-43e3-b99e-7c7cb89754b7 -+ fake-vendor fake-model serial-9451a5d5-b358-4719-b6c1-a0d187da217c -+ fake-vendor fake-model serial-bb2e2869-9481-483a-bc49-2bdd62f515f5 -+ fake-vendor fake-model serial-d5a36c66-4b2f-46e6-96f4-b82debee1a4a -+ fake-vendor fake-model serial-f99ec996-ec08-4ccf-9a6e-6c5cab440fb4 -+ fake-vendor fake-model serial-faccbb39-d686-42a1-a50a-0eb59ba74a87 -+ fake-vendor fake-model serial-fdfd067b-1d86-444d-a21f-ed33709f3e4d + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ ++ fake-vendor fake-model serial-28699448-c5d9-49ea-bf7e-627800efe783 in service ++ fake-vendor fake-model serial-2c490e96-27f2-4a7f-b440-04d4bfd1e4f6 in service ++ fake-vendor fake-model serial-4c3bb1c7-55b6-49b8-b212-516b8f2c26c2 in service ++ fake-vendor fake-model serial-5db07562-31a8-43e3-b99e-7c7cb89754b7 in service ++ fake-vendor fake-model serial-9451a5d5-b358-4719-b6c1-a0d187da217c in service ++ fake-vendor fake-model serial-bb2e2869-9481-483a-bc49-2bdd62f515f5 in service ++ fake-vendor fake-model serial-d5a36c66-4b2f-46e6-96f4-b82debee1a4a in service ++ fake-vendor fake-model serial-f99ec996-ec08-4ccf-9a6e-6c5cab440fb4 in service ++ fake-vendor fake-model serial-faccbb39-d686-42a1-a50a-0eb59ba74a87 in service ++ fake-vendor fake-model serial-fdfd067b-1d86-444d-a21f-ed33709f3e4d in service datasets 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 cafd440f05..70ae7a1c05 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 @@ -6,19 +6,19 @@ to: blueprint f432fcd5-1284-4058-8b4a-9286a3de6163 sled 41f45d9f-766e-4ca6-a881-61ee45c80f57 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-014eb1e9-04fe-4f36-8339-0a090b053ada - fake-vendor fake-model serial-31a3bc64-7a3b-496d-b644-785dc44b6e37 - fake-vendor fake-model serial-7bb40bd6-9c43-4b63-8337-18313c72aea2 - fake-vendor fake-model serial-988aa8c2-cb5e-406b-9289-425dc2e5bc3a - fake-vendor fake-model serial-ad574c09-2ae0-4534-a2a4-f923ce20ae87 - fake-vendor fake-model serial-ad91e238-4901-4ff4-a91b-75233c936426 - fake-vendor fake-model serial-ce58d463-d442-4c97-a6b4-f7d98c3fd902 - fake-vendor fake-model serial-f18f7689-0059-4b79-880e-34faf7a0fe0e - fake-vendor fake-model serial-f1d6cea4-640f-415e-89fe-2b1784ce3db8 - fake-vendor fake-model serial-f4a96860-bdeb-4435-bdf5-2a10beb3d44a + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-014eb1e9-04fe-4f36-8339-0a090b053ada in service + fake-vendor fake-model serial-31a3bc64-7a3b-496d-b644-785dc44b6e37 in service + fake-vendor fake-model serial-7bb40bd6-9c43-4b63-8337-18313c72aea2 in service + fake-vendor fake-model serial-988aa8c2-cb5e-406b-9289-425dc2e5bc3a in service + fake-vendor fake-model serial-ad574c09-2ae0-4534-a2a4-f923ce20ae87 in service + fake-vendor fake-model serial-ad91e238-4901-4ff4-a91b-75233c936426 in service + fake-vendor fake-model serial-ce58d463-d442-4c97-a6b4-f7d98c3fd902 in service + fake-vendor fake-model serial-f18f7689-0059-4b79-880e-34faf7a0fe0e in service + fake-vendor fake-model serial-f1d6cea4-640f-415e-89fe-2b1784ce3db8 in service + fake-vendor fake-model serial-f4a96860-bdeb-4435-bdf5-2a10beb3d44a in service datasets at generation 2: @@ -98,19 +98,19 @@ to: blueprint f432fcd5-1284-4058-8b4a-9286a3de6163 sled 43677374-8d2f-4deb-8a41-eeea506db8e0 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-12057b4a-0b06-4f70-ba22-336de2385bfe - fake-vendor fake-model serial-29758363-6c77-40c3-8740-9c0c64f6e14a - fake-vendor fake-model serial-3f331c10-7882-48ab-85d9-05108490b55b - fake-vendor fake-model serial-5152d1aa-9045-4e06-9ef6-6eadac3696e4 - fake-vendor fake-model serial-5c0dd424-d905-4fc5-a73c-36254fdd470c - fake-vendor fake-model serial-794df76f-bca0-4635-9eb6-773ad0108f7e - fake-vendor fake-model serial-9024d350-38a7-459b-8550-3b2c4a88b5c1 - fake-vendor fake-model serial-95e86080-e162-4980-a589-db6bb1a95ca7 - fake-vendor fake-model serial-d55d36d7-df92-4615-944d-440a1f8b5001 - fake-vendor fake-model serial-db6686c8-2dd9-4032-8444-2a06b43baa68 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-12057b4a-0b06-4f70-ba22-336de2385bfe in service + fake-vendor fake-model serial-29758363-6c77-40c3-8740-9c0c64f6e14a in service + fake-vendor fake-model serial-3f331c10-7882-48ab-85d9-05108490b55b in service + fake-vendor fake-model serial-5152d1aa-9045-4e06-9ef6-6eadac3696e4 in service + fake-vendor fake-model serial-5c0dd424-d905-4fc5-a73c-36254fdd470c in service + fake-vendor fake-model serial-794df76f-bca0-4635-9eb6-773ad0108f7e in service + fake-vendor fake-model serial-9024d350-38a7-459b-8550-3b2c4a88b5c1 in service + fake-vendor fake-model serial-95e86080-e162-4980-a589-db6bb1a95ca7 in service + fake-vendor fake-model serial-d55d36d7-df92-4615-944d-440a1f8b5001 in service + fake-vendor fake-model serial-db6686c8-2dd9-4032-8444-2a06b43baa68 in service datasets at generation 2: @@ -187,19 +187,19 @@ to: blueprint f432fcd5-1284-4058-8b4a-9286a3de6163 sled 590e3034-d946-4166-b0e5-2d0034197a07 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-2a94863d-16e2-4535-973b-e98dd47fd18d - fake-vendor fake-model serial-32456d15-f5b6-4efc-90c8-dbba979b69cb - fake-vendor fake-model serial-416fe9f9-5161-4b0f-9e11-c9d81563ded5 - fake-vendor fake-model serial-4c68800e-23f8-485b-b251-628fd151e445 - fake-vendor fake-model serial-9dd87c4d-5fb4-475a-86fa-c0da81a3e00a - fake-vendor fake-model serial-be93a517-445e-46c2-aa21-3dc526d4a413 - fake-vendor fake-model serial-d9344e2b-84d2-4392-84ab-41b86ed02237 - fake-vendor fake-model serial-eab188d0-b34a-4673-b254-12e705597654 - fake-vendor fake-model serial-f1e0386f-11b6-4cdf-8250-826d256db6b5 - fake-vendor fake-model serial-f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-2a94863d-16e2-4535-973b-e98dd47fd18d in service + fake-vendor fake-model serial-32456d15-f5b6-4efc-90c8-dbba979b69cb in service + fake-vendor fake-model serial-416fe9f9-5161-4b0f-9e11-c9d81563ded5 in service + fake-vendor fake-model serial-4c68800e-23f8-485b-b251-628fd151e445 in service + fake-vendor fake-model serial-9dd87c4d-5fb4-475a-86fa-c0da81a3e00a in service + fake-vendor fake-model serial-be93a517-445e-46c2-aa21-3dc526d4a413 in service + fake-vendor fake-model serial-d9344e2b-84d2-4392-84ab-41b86ed02237 in service + fake-vendor fake-model serial-eab188d0-b34a-4673-b254-12e705597654 in service + fake-vendor fake-model serial-f1e0386f-11b6-4cdf-8250-826d256db6b5 in service + fake-vendor fake-model serial-f8c9c9a9-d73e-4cdf-a9af-03cfbbbce12b in service datasets at generation 2: @@ -278,19 +278,19 @@ to: blueprint f432fcd5-1284-4058-8b4a-9286a3de6163 sled ec61eded-c34f-443d-a580-dadf757529c4 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-28699448-c5d9-49ea-bf7e-627800efe783 - fake-vendor fake-model serial-2c490e96-27f2-4a7f-b440-04d4bfd1e4f6 - fake-vendor fake-model serial-4c3bb1c7-55b6-49b8-b212-516b8f2c26c2 - fake-vendor fake-model serial-5db07562-31a8-43e3-b99e-7c7cb89754b7 - fake-vendor fake-model serial-9451a5d5-b358-4719-b6c1-a0d187da217c - fake-vendor fake-model serial-bb2e2869-9481-483a-bc49-2bdd62f515f5 - fake-vendor fake-model serial-d5a36c66-4b2f-46e6-96f4-b82debee1a4a - fake-vendor fake-model serial-f99ec996-ec08-4ccf-9a6e-6c5cab440fb4 - fake-vendor fake-model serial-faccbb39-d686-42a1-a50a-0eb59ba74a87 - fake-vendor fake-model serial-fdfd067b-1d86-444d-a21f-ed33709f3e4d + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-28699448-c5d9-49ea-bf7e-627800efe783 in service + fake-vendor fake-model serial-2c490e96-27f2-4a7f-b440-04d4bfd1e4f6 in service + fake-vendor fake-model serial-4c3bb1c7-55b6-49b8-b212-516b8f2c26c2 in service + fake-vendor fake-model serial-5db07562-31a8-43e3-b99e-7c7cb89754b7 in service + fake-vendor fake-model serial-9451a5d5-b358-4719-b6c1-a0d187da217c in service + fake-vendor fake-model serial-bb2e2869-9481-483a-bc49-2bdd62f515f5 in service + fake-vendor fake-model serial-d5a36c66-4b2f-46e6-96f4-b82debee1a4a in service + fake-vendor fake-model serial-f99ec996-ec08-4ccf-9a6e-6c5cab440fb4 in service + fake-vendor fake-model serial-faccbb39-d686-42a1-a50a-0eb59ba74a87 in service + fake-vendor fake-model serial-fdfd067b-1d86-444d-a21f-ed33709f3e4d in service datasets 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 956abf486b..4ba528af5c 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 @@ -6,19 +6,19 @@ to: blueprint fe13be30-94c2-4fa6-aad5-ae3c5028f6bb sled c52410de-5fea-4e77-b162-756d103523b3 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-3b6e2ade-57fc-4f9d-85c3-38fca27f1df6 - fake-vendor fake-model serial-5192ef62-5a12-4a0c-829d-a409da87909c - fake-vendor fake-model serial-8778bcc5-dddf-4345-9fdf-5c46a36497b0 - fake-vendor fake-model serial-9134de8d-9ba8-4ddc-9e84-eb00ec616b53 - fake-vendor fake-model serial-96569b61-9e0c-4ee7-bd11-a5e0c541ca99 - fake-vendor fake-model serial-ba90170e-7399-4260-910a-376254a8a9bf - fake-vendor fake-model serial-bc649720-926b-48f2-a62a-efdcff96b49e - fake-vendor fake-model serial-d55da288-4f35-4e92-97b0-29a5e6009109 - fake-vendor fake-model serial-f83302fc-785c-4ab3-bcca-0d040b3c3062 - fake-vendor fake-model serial-f843fb62-0f04-4c7d-a56f-62531104dc77 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-3b6e2ade-57fc-4f9d-85c3-38fca27f1df6 in service + fake-vendor fake-model serial-5192ef62-5a12-4a0c-829d-a409da87909c in service + fake-vendor fake-model serial-8778bcc5-dddf-4345-9fdf-5c46a36497b0 in service + fake-vendor fake-model serial-9134de8d-9ba8-4ddc-9e84-eb00ec616b53 in service + fake-vendor fake-model serial-96569b61-9e0c-4ee7-bd11-a5e0c541ca99 in service + fake-vendor fake-model serial-ba90170e-7399-4260-910a-376254a8a9bf in service + fake-vendor fake-model serial-bc649720-926b-48f2-a62a-efdcff96b49e in service + fake-vendor fake-model serial-d55da288-4f35-4e92-97b0-29a5e6009109 in service + fake-vendor fake-model serial-f83302fc-785c-4ab3-bcca-0d040b3c3062 in service + fake-vendor fake-model serial-f843fb62-0f04-4c7d-a56f-62531104dc77 in service datasets generation 2 -> 3: 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 5b07ec5132..a3d941a183 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 @@ -5,20 +5,30 @@ to: blueprint 1ac2d88f-27dd-4506-8585-6b2be832528e sled a1b477db-b629-48eb-911d-1ccdafca75b9 (active -> decommissioned): - physical disks from generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- -- fake-vendor fake-model serial-069446b4-7881-49dc-838a-63a782d4896d -- fake-vendor fake-model serial-20eba316-dffe-4516-9703-af561da19b0b -- fake-vendor fake-model serial-426f4b6d-4a82-4106-bf4b-64ee86a2a5a4 -- fake-vendor fake-model serial-82daeef2-8641-4bf5-ac66-f7b5f62c48b6 -- fake-vendor fake-model serial-8e5feeb2-14f1-440f-a909-3c34aa8e129b -- fake-vendor fake-model serial-942e2123-7c4e-4f6b-9317-1341fe212647 -- fake-vendor fake-model serial-97a5ce17-df5b-47e7-baf8-80ae710ce18e -- fake-vendor fake-model serial-debc9fb6-bd58-4e4f-b8b8-6a9a07fcf25d -- fake-vendor fake-model serial-f63a32a9-0659-43cf-8efc-8f34e7af9d45 -- fake-vendor fake-model serial-ffea118f-7715-4e21-8fc5-bb23cd0f59e8 + physical disks generation 2 -> 3: + --------------------------------------------------------------------------------------- + vendor model serial disposition + --------------------------------------------------------------------------------------- +* fake-vendor fake-model serial-069446b4-7881-49dc-838a-63a782d4896d - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-20eba316-dffe-4516-9703-af561da19b0b - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-426f4b6d-4a82-4106-bf4b-64ee86a2a5a4 - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-82daeef2-8641-4bf5-ac66-f7b5f62c48b6 - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-8e5feeb2-14f1-440f-a909-3c34aa8e129b - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-942e2123-7c4e-4f6b-9317-1341fe212647 - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-97a5ce17-df5b-47e7-baf8-80ae710ce18e - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-debc9fb6-bd58-4e4f-b8b8-6a9a07fcf25d - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-f63a32a9-0659-43cf-8efc-8f34e7af9d45 - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-ffea118f-7715-4e21-8fc5-bb23cd0f59e8 - in service + └─ + expunged ✓ datasets from generation 2: @@ -113,19 +123,19 @@ to: blueprint 1ac2d88f-27dd-4506-8585-6b2be832528e sled d67ce8f0-a691-4010-b414-420d82e80527 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-1e2ec79e-9c11-4133-ac77-e0b994a507d5 - fake-vendor fake-model serial-440ae69d-5e2e-4539-91d0-e2930bdd7203 - fake-vendor fake-model serial-4e91d4a3-bb6c-44bb-bd4e-bf8913c1ba2b - fake-vendor fake-model serial-67de3a80-29cb-4066-b743-e285a2ca1f4e - fake-vendor fake-model serial-9139b70f-c1d3-475d-8f02-7c9acba52b2b - fake-vendor fake-model serial-95fbb110-5272-4646-ab50-21b31b7cde23 - fake-vendor fake-model serial-9bf35cd7-4938-4c34-8189-288b3195cb64 - fake-vendor fake-model serial-9d833141-18a1-4f24-8a34-6076c026aa87 - fake-vendor fake-model serial-a279461f-a7b9-413f-a79f-cb4dab4c3fce - fake-vendor fake-model serial-ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-1e2ec79e-9c11-4133-ac77-e0b994a507d5 in service + fake-vendor fake-model serial-440ae69d-5e2e-4539-91d0-e2930bdd7203 in service + fake-vendor fake-model serial-4e91d4a3-bb6c-44bb-bd4e-bf8913c1ba2b in service + fake-vendor fake-model serial-67de3a80-29cb-4066-b743-e285a2ca1f4e in service + fake-vendor fake-model serial-9139b70f-c1d3-475d-8f02-7c9acba52b2b in service + fake-vendor fake-model serial-95fbb110-5272-4646-ab50-21b31b7cde23 in service + fake-vendor fake-model serial-9bf35cd7-4938-4c34-8189-288b3195cb64 in service + fake-vendor fake-model serial-9d833141-18a1-4f24-8a34-6076c026aa87 in service + fake-vendor fake-model serial-a279461f-a7b9-413f-a79f-cb4dab4c3fce in service + fake-vendor fake-model serial-ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59 in service datasets generation 2 -> 3: @@ -206,19 +216,19 @@ to: blueprint 1ac2d88f-27dd-4506-8585-6b2be832528e sled fefcf4cf-f7e7-46b3-b629-058526ce440e (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-07068f19-1ff2-48da-8e72-874780df2339 - fake-vendor fake-model serial-0f12e6ee-41d2-4eb0-813f-ba5240900ded - fake-vendor fake-model serial-0fdb4a39-3cd5-47a0-9064-e7f3c285af61 - fake-vendor fake-model serial-13572832-83ad-40d6-896a-751f7e53f4f6 - fake-vendor fake-model serial-3602bdd9-f7bb-4490-87a6-8f061f7712f5 - fake-vendor fake-model serial-65707837-95a4-45d7-84e6-8b9a4da215f1 - fake-vendor fake-model serial-7a43b2b0-3846-401c-8317-d555715a00f7 - fake-vendor fake-model serial-855e3ef1-6929-4e21-8451-0e62bd93c7c9 - fake-vendor fake-model serial-8adcf329-4cee-4075-b798-28b5add1edf5 - fake-vendor fake-model serial-99e926d6-bd42-4cde-9f63-5ecc7ea14322 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-07068f19-1ff2-48da-8e72-874780df2339 in service + fake-vendor fake-model serial-0f12e6ee-41d2-4eb0-813f-ba5240900ded in service + fake-vendor fake-model serial-0fdb4a39-3cd5-47a0-9064-e7f3c285af61 in service + fake-vendor fake-model serial-13572832-83ad-40d6-896a-751f7e53f4f6 in service + fake-vendor fake-model serial-3602bdd9-f7bb-4490-87a6-8f061f7712f5 in service + fake-vendor fake-model serial-65707837-95a4-45d7-84e6-8b9a4da215f1 in service + fake-vendor fake-model serial-7a43b2b0-3846-401c-8317-d555715a00f7 in service + fake-vendor fake-model serial-855e3ef1-6929-4e21-8451-0e62bd93c7c9 in service + fake-vendor fake-model serial-8adcf329-4cee-4075-b798-28b5add1edf5 in service + fake-vendor fake-model serial-99e926d6-bd42-4cde-9f63-5ecc7ea14322 in service datasets 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 59c130f643..036aac5a8a 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_decommissions_sleds_bp2.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_decommissions_sleds_bp2.txt @@ -1,22 +1,62 @@ blueprint 1ac2d88f-27dd-4506-8585-6b2be832528e parent: 516e80a3-b362-4fac-bd3c-4559717120dd + sled: a1b477db-b629-48eb-911d-1ccdafca75b9 (decommissioned) + + physical disks at generation 3: + ------------------------------------------------------------------------------------- + vendor model serial disposition + ------------------------------------------------------------------------------------- + fake-vendor fake-model serial-069446b4-7881-49dc-838a-63a782d4896d expunged ✓ + fake-vendor fake-model serial-20eba316-dffe-4516-9703-af561da19b0b expunged ✓ + fake-vendor fake-model serial-426f4b6d-4a82-4106-bf4b-64ee86a2a5a4 expunged ✓ + fake-vendor fake-model serial-82daeef2-8641-4bf5-ac66-f7b5f62c48b6 expunged ✓ + fake-vendor fake-model serial-8e5feeb2-14f1-440f-a909-3c34aa8e129b expunged ✓ + fake-vendor fake-model serial-942e2123-7c4e-4f6b-9317-1341fe212647 expunged ✓ + fake-vendor fake-model serial-97a5ce17-df5b-47e7-baf8-80ae710ce18e expunged ✓ + fake-vendor fake-model serial-debc9fb6-bd58-4e4f-b8b8-6a9a07fcf25d expunged ✓ + fake-vendor fake-model serial-f63a32a9-0659-43cf-8efc-8f34e7af9d45 expunged ✓ + fake-vendor fake-model serial-ffea118f-7715-4e21-8fc5-bb23cd0f59e8 expunged ✓ + + + omicron zones at generation 3: + ---------------------------------------------------------------------------------------------- + zone type zone id disposition underlay IP + ---------------------------------------------------------------------------------------------- + clickhouse 3fd081ea-93f1-417e-bcb1-405854435f28 expunged ⏳ fd00:1122:3344:103::23 + crucible 290e7e97-c4b3-47da-9f40-8d909397fbae expunged ⏳ fd00:1122:3344:103::2e + crucible 29bbe4ad-e6e8-4e05-b188-a811a793ccbb expunged ⏳ fd00:1122:3344:103::2a + crucible 8500a060-a426-4324-ba40-a66dd4b89bc6 expunged ⏳ fd00:1122:3344:103::29 + crucible 92b7abd8-3e34-49dd-9c56-19a314e97d49 expunged ⏳ fd00:1122:3344:103::25 + crucible b320954e-6c66-4540-9bf4-3d976f21ee1b expunged ⏳ fd00:1122:3344:103::26 + crucible bc3e4495-7e51-46b6-9f55-026ea1da39dd expunged ⏳ fd00:1122:3344:103::27 + crucible cfb7595b-280c-40f5-b1aa-6e154adf280b expunged ⏳ fd00:1122:3344:103::28 + crucible d6b6ea5a-3f29-4815-aa42-b1afeb11dfc5 expunged ⏳ fd00:1122:3344:103::2c + crucible d6b77c1f-8c9e-406d-944e-c97a57b3984d expunged ⏳ fd00:1122:3344:103::2b + crucible ecc03801-b315-4495-9b2c-49e0eead1283 expunged ⏳ fd00:1122:3344:103::2d + crucible_pantry ecebab45-11e7-47ab-8bc2-ab9114c6e2bc expunged ⏳ fd00:1122:3344:103::24 + internal_dns 96b7a45b-be74-44e8-b68a-e530cfa81830 expunged ⏳ fd00:1122:3344:1::1 + internal_ntp b3dbc671-0e4d-49ff-9f4f-71b249d21f57 expunged ⏳ fd00:1122:3344:103::21 + nexus bc0f4342-f88d-49cc-bb44-b555d9b8ca12 expunged ⏳ fd00:1122:3344:103::22 + + + sled: d67ce8f0-a691-4010-b414-420d82e80527 (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-1e2ec79e-9c11-4133-ac77-e0b994a507d5 - fake-vendor fake-model serial-440ae69d-5e2e-4539-91d0-e2930bdd7203 - fake-vendor fake-model serial-4e91d4a3-bb6c-44bb-bd4e-bf8913c1ba2b - fake-vendor fake-model serial-67de3a80-29cb-4066-b743-e285a2ca1f4e - fake-vendor fake-model serial-9139b70f-c1d3-475d-8f02-7c9acba52b2b - fake-vendor fake-model serial-95fbb110-5272-4646-ab50-21b31b7cde23 - fake-vendor fake-model serial-9bf35cd7-4938-4c34-8189-288b3195cb64 - fake-vendor fake-model serial-9d833141-18a1-4f24-8a34-6076c026aa87 - fake-vendor fake-model serial-a279461f-a7b9-413f-a79f-cb4dab4c3fce - fake-vendor fake-model serial-ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-1e2ec79e-9c11-4133-ac77-e0b994a507d5 in service + fake-vendor fake-model serial-440ae69d-5e2e-4539-91d0-e2930bdd7203 in service + fake-vendor fake-model serial-4e91d4a3-bb6c-44bb-bd4e-bf8913c1ba2b in service + fake-vendor fake-model serial-67de3a80-29cb-4066-b743-e285a2ca1f4e in service + fake-vendor fake-model serial-9139b70f-c1d3-475d-8f02-7c9acba52b2b in service + fake-vendor fake-model serial-95fbb110-5272-4646-ab50-21b31b7cde23 in service + fake-vendor fake-model serial-9bf35cd7-4938-4c34-8189-288b3195cb64 in service + fake-vendor fake-model serial-9d833141-18a1-4f24-8a34-6076c026aa87 in service + fake-vendor fake-model serial-a279461f-a7b9-413f-a79f-cb4dab4c3fce in service + fake-vendor fake-model serial-ff7e002b-3ad8-4d45-b03a-c46ef0ac8e59 in service datasets at generation 3: @@ -98,19 +138,19 @@ parent: 516e80a3-b362-4fac-bd3c-4559717120dd sled: fefcf4cf-f7e7-46b3-b629-058526ce440e (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-07068f19-1ff2-48da-8e72-874780df2339 - fake-vendor fake-model serial-0f12e6ee-41d2-4eb0-813f-ba5240900ded - fake-vendor fake-model serial-0fdb4a39-3cd5-47a0-9064-e7f3c285af61 - fake-vendor fake-model serial-13572832-83ad-40d6-896a-751f7e53f4f6 - fake-vendor fake-model serial-3602bdd9-f7bb-4490-87a6-8f061f7712f5 - fake-vendor fake-model serial-65707837-95a4-45d7-84e6-8b9a4da215f1 - fake-vendor fake-model serial-7a43b2b0-3846-401c-8317-d555715a00f7 - fake-vendor fake-model serial-855e3ef1-6929-4e21-8451-0e62bd93c7c9 - fake-vendor fake-model serial-8adcf329-4cee-4075-b798-28b5add1edf5 - fake-vendor fake-model serial-99e926d6-bd42-4cde-9f63-5ecc7ea14322 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-07068f19-1ff2-48da-8e72-874780df2339 in service + fake-vendor fake-model serial-0f12e6ee-41d2-4eb0-813f-ba5240900ded in service + fake-vendor fake-model serial-0fdb4a39-3cd5-47a0-9064-e7f3c285af61 in service + fake-vendor fake-model serial-13572832-83ad-40d6-896a-751f7e53f4f6 in service + fake-vendor fake-model serial-3602bdd9-f7bb-4490-87a6-8f061f7712f5 in service + fake-vendor fake-model serial-65707837-95a4-45d7-84e6-8b9a4da215f1 in service + fake-vendor fake-model serial-7a43b2b0-3846-401c-8317-d555715a00f7 in service + fake-vendor fake-model serial-855e3ef1-6929-4e21-8451-0e62bd93c7c9 in service + fake-vendor fake-model serial-8adcf329-4cee-4075-b798-28b5add1edf5 in service + fake-vendor fake-model serial-99e926d6-bd42-4cde-9f63-5ecc7ea14322 in service datasets at generation 3: @@ -190,30 +230,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: - ---------------------------------------------------------------------------------------------- - zone type zone id disposition underlay IP - ---------------------------------------------------------------------------------------------- - clickhouse 3fd081ea-93f1-417e-bcb1-405854435f28 expunged ⏳ fd00:1122:3344:103::23 - crucible 290e7e97-c4b3-47da-9f40-8d909397fbae expunged ⏳ fd00:1122:3344:103::2e - crucible 29bbe4ad-e6e8-4e05-b188-a811a793ccbb expunged ⏳ fd00:1122:3344:103::2a - crucible 8500a060-a426-4324-ba40-a66dd4b89bc6 expunged ⏳ fd00:1122:3344:103::29 - crucible 92b7abd8-3e34-49dd-9c56-19a314e97d49 expunged ⏳ fd00:1122:3344:103::25 - crucible b320954e-6c66-4540-9bf4-3d976f21ee1b expunged ⏳ fd00:1122:3344:103::26 - crucible bc3e4495-7e51-46b6-9f55-026ea1da39dd expunged ⏳ fd00:1122:3344:103::27 - crucible cfb7595b-280c-40f5-b1aa-6e154adf280b expunged ⏳ fd00:1122:3344:103::28 - crucible d6b6ea5a-3f29-4815-aa42-b1afeb11dfc5 expunged ⏳ fd00:1122:3344:103::2c - crucible d6b77c1f-8c9e-406d-944e-c97a57b3984d expunged ⏳ fd00:1122:3344:103::2b - crucible ecc03801-b315-4495-9b2c-49e0eead1283 expunged ⏳ fd00:1122:3344:103::2d - crucible_pantry ecebab45-11e7-47ab-8bc2-ab9114c6e2bc expunged ⏳ fd00:1122:3344:103::24 - internal_dns 96b7a45b-be74-44e8-b68a-e530cfa81830 expunged ⏳ fd00:1122:3344:1::1 - internal_ntp b3dbc671-0e4d-49ff-9f4f-71b249d21f57 expunged ⏳ fd00:1122:3344:103::21 - nexus bc0f4342-f88d-49cc-bb44-b555d9b8ca12 expunged ⏳ fd00:1122:3344:103::22 - - - COCKROACHDB SETTINGS: state fingerprint::::::::::::::::: (none) cluster.preserve_downgrade_option: (do not modify) 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 0bde24adba..5947171489 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 @@ -6,19 +6,19 @@ to: blueprint 31ef2071-2ec9-49d9-8827-fd83b17a0e3d sled 164d275d-a936-4f06-ad53-a32cb3c8d3c8 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-60e6b021-79d6-4a6b-917c-6637e0769558 - fake-vendor fake-model serial-71a07ac0-d24e-446c-a202-1998e7f6ac8c - fake-vendor fake-model serial-736d4cab-c262-485e-89c2-07e6543f0855 - fake-vendor fake-model serial-8ae56ca0-709d-4b8f-9869-51b62b542eef - fake-vendor fake-model serial-8e0bcc4f-0799-450c-a0ad-80c1637f59e3 - fake-vendor fake-model serial-8eeebb8e-6db6-43e8-a429-d26dde99882c - fake-vendor fake-model serial-a3e8de5b-c47a-49c0-b698-4d6955e1327f - fake-vendor fake-model serial-b32fa3da-4dec-4237-9776-e1a57ba15a21 - fake-vendor fake-model serial-e9c238f6-87a3-4087-8ba4-aa594a82d012 - fake-vendor fake-model serial-fbf997ef-52d3-438a-b036-b9117322e569 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-60e6b021-79d6-4a6b-917c-6637e0769558 in service + fake-vendor fake-model serial-71a07ac0-d24e-446c-a202-1998e7f6ac8c in service + fake-vendor fake-model serial-736d4cab-c262-485e-89c2-07e6543f0855 in service + fake-vendor fake-model serial-8ae56ca0-709d-4b8f-9869-51b62b542eef in service + fake-vendor fake-model serial-8e0bcc4f-0799-450c-a0ad-80c1637f59e3 in service + fake-vendor fake-model serial-8eeebb8e-6db6-43e8-a429-d26dde99882c in service + fake-vendor fake-model serial-a3e8de5b-c47a-49c0-b698-4d6955e1327f in service + fake-vendor fake-model serial-b32fa3da-4dec-4237-9776-e1a57ba15a21 in service + fake-vendor fake-model serial-e9c238f6-87a3-4087-8ba4-aa594a82d012 in service + fake-vendor fake-model serial-fbf997ef-52d3-438a-b036-b9117322e569 in service datasets generation 2 -> 3: @@ -101,19 +101,19 @@ to: blueprint 31ef2071-2ec9-49d9-8827-fd83b17a0e3d sled 6a4c45f6-e02f-490c-bbfa-b32fb89e8e86 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-0bf9d028-2b4a-4bff-82a1-6eb5fcefd985 - fake-vendor fake-model serial-19293a1d-fddc-40a7-88a4-ccafdb6f66d3 - fake-vendor fake-model serial-44484c44-477a-4676-8266-b98a00e80d79 - fake-vendor fake-model serial-79787cd4-92da-4de5-bfd8-30a635521e10 - fake-vendor fake-model serial-9ae94c94-baae-477e-912a-60f0c4f3bd13 - fake-vendor fake-model serial-af85eec8-36b3-4b88-966d-a717b9b58fe5 - fake-vendor fake-model serial-ddfaaba3-dafe-4103-b868-e9843d29d346 - fake-vendor fake-model serial-ec458c3e-91ca-40f1-a2a3-3f4292c1f279 - fake-vendor fake-model serial-f2fc7c4c-7966-449d-8ec3-5a70f460501d - fake-vendor fake-model serial-f635c28a-e5ca-4d22-ac94-d8f278a6ea0e + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-0bf9d028-2b4a-4bff-82a1-6eb5fcefd985 in service + fake-vendor fake-model serial-19293a1d-fddc-40a7-88a4-ccafdb6f66d3 in service + fake-vendor fake-model serial-44484c44-477a-4676-8266-b98a00e80d79 in service + fake-vendor fake-model serial-79787cd4-92da-4de5-bfd8-30a635521e10 in service + fake-vendor fake-model serial-9ae94c94-baae-477e-912a-60f0c4f3bd13 in service + fake-vendor fake-model serial-af85eec8-36b3-4b88-966d-a717b9b58fe5 in service + fake-vendor fake-model serial-ddfaaba3-dafe-4103-b868-e9843d29d346 in service + fake-vendor fake-model serial-ec458c3e-91ca-40f1-a2a3-3f4292c1f279 in service + fake-vendor fake-model serial-f2fc7c4c-7966-449d-8ec3-5a70f460501d in service + fake-vendor fake-model serial-f635c28a-e5ca-4d22-ac94-d8f278a6ea0e in service datasets generation 2 -> 3: @@ -196,19 +196,19 @@ to: blueprint 31ef2071-2ec9-49d9-8827-fd83b17a0e3d sled be531a62-9897-430d-acd2-ce14b4632627 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-2a76ab1a-fb16-412d-93f9-b8cd9aa94e85 - fake-vendor fake-model serial-2de2bf7e-c679-4b2b-b373-908e9d3ffbfc - fake-vendor fake-model serial-2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba - fake-vendor fake-model serial-32041dbf-e58d-4f32-840d-923d3d3b68af - fake-vendor fake-model serial-5f88adff-bb50-4dc1-bbfb-5a410c753ed5 - fake-vendor fake-model serial-74d64eb9-bf69-4782-af16-2d3a761ca171 - fake-vendor fake-model serial-b3c231c9-b2a5-4267-b4bf-9651881b91a5 - fake-vendor fake-model serial-bca80b95-8dca-4a3b-b24d-d44b6a9ff71b - fake-vendor fake-model serial-db16345e-427a-4c8e-9032-17270f729308 - fake-vendor fake-model serial-e3b45593-8f0c-47b2-a381-802a7dad1f54 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-2a76ab1a-fb16-412d-93f9-b8cd9aa94e85 in service + fake-vendor fake-model serial-2de2bf7e-c679-4b2b-b373-908e9d3ffbfc in service + fake-vendor fake-model serial-2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba in service + fake-vendor fake-model serial-32041dbf-e58d-4f32-840d-923d3d3b68af in service + fake-vendor fake-model serial-5f88adff-bb50-4dc1-bbfb-5a410c753ed5 in service + fake-vendor fake-model serial-74d64eb9-bf69-4782-af16-2d3a761ca171 in service + fake-vendor fake-model serial-b3c231c9-b2a5-4267-b4bf-9651881b91a5 in service + fake-vendor fake-model serial-bca80b95-8dca-4a3b-b24d-d44b6a9ff71b in service + fake-vendor fake-model serial-db16345e-427a-4c8e-9032-17270f729308 in service + fake-vendor fake-model serial-e3b45593-8f0c-47b2-a381-802a7dad1f54 in service datasets 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 c94a43a79e..003c3e2991 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 @@ -6,19 +6,19 @@ to: blueprint 92fa943c-7dd4-48c3-9447-c9d0665744b6 sled 164d275d-a936-4f06-ad53-a32cb3c8d3c8 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-60e6b021-79d6-4a6b-917c-6637e0769558 - fake-vendor fake-model serial-71a07ac0-d24e-446c-a202-1998e7f6ac8c - fake-vendor fake-model serial-736d4cab-c262-485e-89c2-07e6543f0855 - fake-vendor fake-model serial-8ae56ca0-709d-4b8f-9869-51b62b542eef - fake-vendor fake-model serial-8e0bcc4f-0799-450c-a0ad-80c1637f59e3 - fake-vendor fake-model serial-8eeebb8e-6db6-43e8-a429-d26dde99882c - fake-vendor fake-model serial-a3e8de5b-c47a-49c0-b698-4d6955e1327f - fake-vendor fake-model serial-b32fa3da-4dec-4237-9776-e1a57ba15a21 - fake-vendor fake-model serial-e9c238f6-87a3-4087-8ba4-aa594a82d012 - fake-vendor fake-model serial-fbf997ef-52d3-438a-b036-b9117322e569 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-60e6b021-79d6-4a6b-917c-6637e0769558 in service + fake-vendor fake-model serial-71a07ac0-d24e-446c-a202-1998e7f6ac8c in service + fake-vendor fake-model serial-736d4cab-c262-485e-89c2-07e6543f0855 in service + fake-vendor fake-model serial-8ae56ca0-709d-4b8f-9869-51b62b542eef in service + fake-vendor fake-model serial-8e0bcc4f-0799-450c-a0ad-80c1637f59e3 in service + fake-vendor fake-model serial-8eeebb8e-6db6-43e8-a429-d26dde99882c in service + fake-vendor fake-model serial-a3e8de5b-c47a-49c0-b698-4d6955e1327f in service + fake-vendor fake-model serial-b32fa3da-4dec-4237-9776-e1a57ba15a21 in service + fake-vendor fake-model serial-e9c238f6-87a3-4087-8ba4-aa594a82d012 in service + fake-vendor fake-model serial-fbf997ef-52d3-438a-b036-b9117322e569 in service datasets at generation 3: @@ -101,19 +101,19 @@ to: blueprint 92fa943c-7dd4-48c3-9447-c9d0665744b6 sled 6a4c45f6-e02f-490c-bbfa-b32fb89e8e86 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-0bf9d028-2b4a-4bff-82a1-6eb5fcefd985 - fake-vendor fake-model serial-19293a1d-fddc-40a7-88a4-ccafdb6f66d3 - fake-vendor fake-model serial-44484c44-477a-4676-8266-b98a00e80d79 - fake-vendor fake-model serial-79787cd4-92da-4de5-bfd8-30a635521e10 - fake-vendor fake-model serial-9ae94c94-baae-477e-912a-60f0c4f3bd13 - fake-vendor fake-model serial-af85eec8-36b3-4b88-966d-a717b9b58fe5 - fake-vendor fake-model serial-ddfaaba3-dafe-4103-b868-e9843d29d346 - fake-vendor fake-model serial-ec458c3e-91ca-40f1-a2a3-3f4292c1f279 - fake-vendor fake-model serial-f2fc7c4c-7966-449d-8ec3-5a70f460501d - fake-vendor fake-model serial-f635c28a-e5ca-4d22-ac94-d8f278a6ea0e + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-0bf9d028-2b4a-4bff-82a1-6eb5fcefd985 in service + fake-vendor fake-model serial-19293a1d-fddc-40a7-88a4-ccafdb6f66d3 in service + fake-vendor fake-model serial-44484c44-477a-4676-8266-b98a00e80d79 in service + fake-vendor fake-model serial-79787cd4-92da-4de5-bfd8-30a635521e10 in service + fake-vendor fake-model serial-9ae94c94-baae-477e-912a-60f0c4f3bd13 in service + fake-vendor fake-model serial-af85eec8-36b3-4b88-966d-a717b9b58fe5 in service + fake-vendor fake-model serial-ddfaaba3-dafe-4103-b868-e9843d29d346 in service + fake-vendor fake-model serial-ec458c3e-91ca-40f1-a2a3-3f4292c1f279 in service + fake-vendor fake-model serial-f2fc7c4c-7966-449d-8ec3-5a70f460501d in service + fake-vendor fake-model serial-f635c28a-e5ca-4d22-ac94-d8f278a6ea0e in service datasets at generation 3: @@ -196,19 +196,19 @@ to: blueprint 92fa943c-7dd4-48c3-9447-c9d0665744b6 sled be531a62-9897-430d-acd2-ce14b4632627 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-2a76ab1a-fb16-412d-93f9-b8cd9aa94e85 - fake-vendor fake-model serial-2de2bf7e-c679-4b2b-b373-908e9d3ffbfc - fake-vendor fake-model serial-2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba - fake-vendor fake-model serial-32041dbf-e58d-4f32-840d-923d3d3b68af - fake-vendor fake-model serial-5f88adff-bb50-4dc1-bbfb-5a410c753ed5 - fake-vendor fake-model serial-74d64eb9-bf69-4782-af16-2d3a761ca171 - fake-vendor fake-model serial-b3c231c9-b2a5-4267-b4bf-9651881b91a5 - fake-vendor fake-model serial-bca80b95-8dca-4a3b-b24d-d44b6a9ff71b - fake-vendor fake-model serial-db16345e-427a-4c8e-9032-17270f729308 - fake-vendor fake-model serial-e3b45593-8f0c-47b2-a381-802a7dad1f54 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-2a76ab1a-fb16-412d-93f9-b8cd9aa94e85 in service + fake-vendor fake-model serial-2de2bf7e-c679-4b2b-b373-908e9d3ffbfc in service + fake-vendor fake-model serial-2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba in service + fake-vendor fake-model serial-32041dbf-e58d-4f32-840d-923d3d3b68af in service + fake-vendor fake-model serial-5f88adff-bb50-4dc1-bbfb-5a410c753ed5 in service + fake-vendor fake-model serial-74d64eb9-bf69-4782-af16-2d3a761ca171 in service + fake-vendor fake-model serial-b3c231c9-b2a5-4267-b4bf-9651881b91a5 in service + fake-vendor fake-model serial-bca80b95-8dca-4a3b-b24d-d44b6a9ff71b in service + fake-vendor fake-model serial-db16345e-427a-4c8e-9032-17270f729308 in service + fake-vendor fake-model serial-e3b45593-8f0c-47b2-a381-802a7dad1f54 in service datasets 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 e86629f97a..2c4eb088e1 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 @@ -6,19 +6,19 @@ to: blueprint 2886dab5-61a2-46b4-87af-bc7aeb44cccb sled 164d275d-a936-4f06-ad53-a32cb3c8d3c8 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-60e6b021-79d6-4a6b-917c-6637e0769558 - fake-vendor fake-model serial-71a07ac0-d24e-446c-a202-1998e7f6ac8c - fake-vendor fake-model serial-736d4cab-c262-485e-89c2-07e6543f0855 - fake-vendor fake-model serial-8ae56ca0-709d-4b8f-9869-51b62b542eef - fake-vendor fake-model serial-8e0bcc4f-0799-450c-a0ad-80c1637f59e3 - fake-vendor fake-model serial-8eeebb8e-6db6-43e8-a429-d26dde99882c - fake-vendor fake-model serial-a3e8de5b-c47a-49c0-b698-4d6955e1327f - fake-vendor fake-model serial-b32fa3da-4dec-4237-9776-e1a57ba15a21 - fake-vendor fake-model serial-e9c238f6-87a3-4087-8ba4-aa594a82d012 - fake-vendor fake-model serial-fbf997ef-52d3-438a-b036-b9117322e569 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-60e6b021-79d6-4a6b-917c-6637e0769558 in service + fake-vendor fake-model serial-71a07ac0-d24e-446c-a202-1998e7f6ac8c in service + fake-vendor fake-model serial-736d4cab-c262-485e-89c2-07e6543f0855 in service + fake-vendor fake-model serial-8ae56ca0-709d-4b8f-9869-51b62b542eef in service + fake-vendor fake-model serial-8e0bcc4f-0799-450c-a0ad-80c1637f59e3 in service + fake-vendor fake-model serial-8eeebb8e-6db6-43e8-a429-d26dde99882c in service + fake-vendor fake-model serial-a3e8de5b-c47a-49c0-b698-4d6955e1327f in service + fake-vendor fake-model serial-b32fa3da-4dec-4237-9776-e1a57ba15a21 in service + fake-vendor fake-model serial-e9c238f6-87a3-4087-8ba4-aa594a82d012 in service + fake-vendor fake-model serial-fbf997ef-52d3-438a-b036-b9117322e569 in service datasets at generation 3: @@ -103,19 +103,19 @@ to: blueprint 2886dab5-61a2-46b4-87af-bc7aeb44cccb sled 6a4c45f6-e02f-490c-bbfa-b32fb89e8e86 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-0bf9d028-2b4a-4bff-82a1-6eb5fcefd985 - fake-vendor fake-model serial-19293a1d-fddc-40a7-88a4-ccafdb6f66d3 - fake-vendor fake-model serial-44484c44-477a-4676-8266-b98a00e80d79 - fake-vendor fake-model serial-79787cd4-92da-4de5-bfd8-30a635521e10 - fake-vendor fake-model serial-9ae94c94-baae-477e-912a-60f0c4f3bd13 - fake-vendor fake-model serial-af85eec8-36b3-4b88-966d-a717b9b58fe5 - fake-vendor fake-model serial-ddfaaba3-dafe-4103-b868-e9843d29d346 - fake-vendor fake-model serial-ec458c3e-91ca-40f1-a2a3-3f4292c1f279 - fake-vendor fake-model serial-f2fc7c4c-7966-449d-8ec3-5a70f460501d - fake-vendor fake-model serial-f635c28a-e5ca-4d22-ac94-d8f278a6ea0e + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-0bf9d028-2b4a-4bff-82a1-6eb5fcefd985 in service + fake-vendor fake-model serial-19293a1d-fddc-40a7-88a4-ccafdb6f66d3 in service + fake-vendor fake-model serial-44484c44-477a-4676-8266-b98a00e80d79 in service + fake-vendor fake-model serial-79787cd4-92da-4de5-bfd8-30a635521e10 in service + fake-vendor fake-model serial-9ae94c94-baae-477e-912a-60f0c4f3bd13 in service + fake-vendor fake-model serial-af85eec8-36b3-4b88-966d-a717b9b58fe5 in service + fake-vendor fake-model serial-ddfaaba3-dafe-4103-b868-e9843d29d346 in service + fake-vendor fake-model serial-ec458c3e-91ca-40f1-a2a3-3f4292c1f279 in service + fake-vendor fake-model serial-f2fc7c4c-7966-449d-8ec3-5a70f460501d in service + fake-vendor fake-model serial-f635c28a-e5ca-4d22-ac94-d8f278a6ea0e in service datasets generation 3 -> 4: @@ -201,19 +201,19 @@ to: blueprint 2886dab5-61a2-46b4-87af-bc7aeb44cccb sled be531a62-9897-430d-acd2-ce14b4632627 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-2a76ab1a-fb16-412d-93f9-b8cd9aa94e85 - fake-vendor fake-model serial-2de2bf7e-c679-4b2b-b373-908e9d3ffbfc - fake-vendor fake-model serial-2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba - fake-vendor fake-model serial-32041dbf-e58d-4f32-840d-923d3d3b68af - fake-vendor fake-model serial-5f88adff-bb50-4dc1-bbfb-5a410c753ed5 - fake-vendor fake-model serial-74d64eb9-bf69-4782-af16-2d3a761ca171 - fake-vendor fake-model serial-b3c231c9-b2a5-4267-b4bf-9651881b91a5 - fake-vendor fake-model serial-bca80b95-8dca-4a3b-b24d-d44b6a9ff71b - fake-vendor fake-model serial-db16345e-427a-4c8e-9032-17270f729308 - fake-vendor fake-model serial-e3b45593-8f0c-47b2-a381-802a7dad1f54 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-2a76ab1a-fb16-412d-93f9-b8cd9aa94e85 in service + fake-vendor fake-model serial-2de2bf7e-c679-4b2b-b373-908e9d3ffbfc in service + fake-vendor fake-model serial-2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba in service + fake-vendor fake-model serial-32041dbf-e58d-4f32-840d-923d3d3b68af in service + fake-vendor fake-model serial-5f88adff-bb50-4dc1-bbfb-5a410c753ed5 in service + fake-vendor fake-model serial-74d64eb9-bf69-4782-af16-2d3a761ca171 in service + fake-vendor fake-model serial-b3c231c9-b2a5-4267-b4bf-9651881b91a5 in service + fake-vendor fake-model serial-bca80b95-8dca-4a3b-b24d-d44b6a9ff71b in service + fake-vendor fake-model serial-db16345e-427a-4c8e-9032-17270f729308 in service + fake-vendor fake-model serial-e3b45593-8f0c-47b2-a381-802a7dad1f54 in service datasets 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 c7f2cf502b..6594c146c5 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 @@ -6,19 +6,19 @@ to: blueprint cb39be9d-5476-44fa-9edf-9938376219ef sled 164d275d-a936-4f06-ad53-a32cb3c8d3c8 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-60e6b021-79d6-4a6b-917c-6637e0769558 - fake-vendor fake-model serial-71a07ac0-d24e-446c-a202-1998e7f6ac8c - fake-vendor fake-model serial-736d4cab-c262-485e-89c2-07e6543f0855 - fake-vendor fake-model serial-8ae56ca0-709d-4b8f-9869-51b62b542eef - fake-vendor fake-model serial-8e0bcc4f-0799-450c-a0ad-80c1637f59e3 - fake-vendor fake-model serial-8eeebb8e-6db6-43e8-a429-d26dde99882c - fake-vendor fake-model serial-a3e8de5b-c47a-49c0-b698-4d6955e1327f - fake-vendor fake-model serial-b32fa3da-4dec-4237-9776-e1a57ba15a21 - fake-vendor fake-model serial-e9c238f6-87a3-4087-8ba4-aa594a82d012 - fake-vendor fake-model serial-fbf997ef-52d3-438a-b036-b9117322e569 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-60e6b021-79d6-4a6b-917c-6637e0769558 in service + fake-vendor fake-model serial-71a07ac0-d24e-446c-a202-1998e7f6ac8c in service + fake-vendor fake-model serial-736d4cab-c262-485e-89c2-07e6543f0855 in service + fake-vendor fake-model serial-8ae56ca0-709d-4b8f-9869-51b62b542eef in service + fake-vendor fake-model serial-8e0bcc4f-0799-450c-a0ad-80c1637f59e3 in service + fake-vendor fake-model serial-8eeebb8e-6db6-43e8-a429-d26dde99882c in service + fake-vendor fake-model serial-a3e8de5b-c47a-49c0-b698-4d6955e1327f in service + fake-vendor fake-model serial-b32fa3da-4dec-4237-9776-e1a57ba15a21 in service + fake-vendor fake-model serial-e9c238f6-87a3-4087-8ba4-aa594a82d012 in service + fake-vendor fake-model serial-fbf997ef-52d3-438a-b036-b9117322e569 in service datasets at generation 3: @@ -101,19 +101,19 @@ to: blueprint cb39be9d-5476-44fa-9edf-9938376219ef sled 6a4c45f6-e02f-490c-bbfa-b32fb89e8e86 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-0bf9d028-2b4a-4bff-82a1-6eb5fcefd985 - fake-vendor fake-model serial-19293a1d-fddc-40a7-88a4-ccafdb6f66d3 - fake-vendor fake-model serial-44484c44-477a-4676-8266-b98a00e80d79 - fake-vendor fake-model serial-79787cd4-92da-4de5-bfd8-30a635521e10 - fake-vendor fake-model serial-9ae94c94-baae-477e-912a-60f0c4f3bd13 - fake-vendor fake-model serial-af85eec8-36b3-4b88-966d-a717b9b58fe5 - fake-vendor fake-model serial-ddfaaba3-dafe-4103-b868-e9843d29d346 - fake-vendor fake-model serial-ec458c3e-91ca-40f1-a2a3-3f4292c1f279 - fake-vendor fake-model serial-f2fc7c4c-7966-449d-8ec3-5a70f460501d - fake-vendor fake-model serial-f635c28a-e5ca-4d22-ac94-d8f278a6ea0e + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-0bf9d028-2b4a-4bff-82a1-6eb5fcefd985 in service + fake-vendor fake-model serial-19293a1d-fddc-40a7-88a4-ccafdb6f66d3 in service + fake-vendor fake-model serial-44484c44-477a-4676-8266-b98a00e80d79 in service + fake-vendor fake-model serial-79787cd4-92da-4de5-bfd8-30a635521e10 in service + fake-vendor fake-model serial-9ae94c94-baae-477e-912a-60f0c4f3bd13 in service + fake-vendor fake-model serial-af85eec8-36b3-4b88-966d-a717b9b58fe5 in service + fake-vendor fake-model serial-ddfaaba3-dafe-4103-b868-e9843d29d346 in service + fake-vendor fake-model serial-ec458c3e-91ca-40f1-a2a3-3f4292c1f279 in service + fake-vendor fake-model serial-f2fc7c4c-7966-449d-8ec3-5a70f460501d in service + fake-vendor fake-model serial-f635c28a-e5ca-4d22-ac94-d8f278a6ea0e in service datasets at generation 4: @@ -199,19 +199,19 @@ to: blueprint cb39be9d-5476-44fa-9edf-9938376219ef sled be531a62-9897-430d-acd2-ce14b4632627 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-2a76ab1a-fb16-412d-93f9-b8cd9aa94e85 - fake-vendor fake-model serial-2de2bf7e-c679-4b2b-b373-908e9d3ffbfc - fake-vendor fake-model serial-2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba - fake-vendor fake-model serial-32041dbf-e58d-4f32-840d-923d3d3b68af - fake-vendor fake-model serial-5f88adff-bb50-4dc1-bbfb-5a410c753ed5 - fake-vendor fake-model serial-74d64eb9-bf69-4782-af16-2d3a761ca171 - fake-vendor fake-model serial-b3c231c9-b2a5-4267-b4bf-9651881b91a5 - fake-vendor fake-model serial-bca80b95-8dca-4a3b-b24d-d44b6a9ff71b - fake-vendor fake-model serial-db16345e-427a-4c8e-9032-17270f729308 - fake-vendor fake-model serial-e3b45593-8f0c-47b2-a381-802a7dad1f54 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-2a76ab1a-fb16-412d-93f9-b8cd9aa94e85 in service + fake-vendor fake-model serial-2de2bf7e-c679-4b2b-b373-908e9d3ffbfc in service + fake-vendor fake-model serial-2f02a5c6-fcf5-4b5a-bc7d-7f65369918ba in service + fake-vendor fake-model serial-32041dbf-e58d-4f32-840d-923d3d3b68af in service + fake-vendor fake-model serial-5f88adff-bb50-4dc1-bbfb-5a410c753ed5 in service + fake-vendor fake-model serial-74d64eb9-bf69-4782-af16-2d3a761ca171 in service + fake-vendor fake-model serial-b3c231c9-b2a5-4267-b4bf-9651881b91a5 in service + fake-vendor fake-model serial-bca80b95-8dca-4a3b-b24d-d44b6a9ff71b in service + fake-vendor fake-model serial-db16345e-427a-4c8e-9032-17270f729308 in service + fake-vendor fake-model serial-e3b45593-8f0c-47b2-a381-802a7dad1f54 in service datasets 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 5cb698fa70..3ba361ea3f 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 @@ -5,20 +5,30 @@ to: blueprint 74f2e7fd-687e-4c9e-b5d8-e474a5bb8e7c sled b340c044-bd87-4a3b-aee3-e6ccd9d3ff02 (active -> decommissioned): - physical disks from generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- -- fake-vendor fake-model serial-03a84dd2-e0a4-435d-96de-67bfe2674f4e -- fake-vendor fake-model serial-188c3b95-16fa-45ea-b9f7-e987560b4d62 -- fake-vendor fake-model serial-1f3bbc7c-888f-40fa-b705-fab3f148b147 -- fake-vendor fake-model serial-45a81e70-03bb-4c53-bf49-d598c9fb8d34 -- fake-vendor fake-model serial-56c3f0ef-fac1-473d-9317-0e3668aa7e88 -- fake-vendor fake-model serial-96f1615c-3dda-427f-8132-408b2fad24e0 -- fake-vendor fake-model serial-a9ef71b2-ec22-421c-adc9-bddc4c0641c4 -- fake-vendor fake-model serial-b9f9c626-3293-48eb-a475-1debaaccdf6c -- fake-vendor fake-model serial-d563fd5f-9306-49b4-8511-78a2f64733ce -- fake-vendor fake-model serial-fcca32b6-9629-468f-a282-63d7da992447 + physical disks generation 2 -> 3: + --------------------------------------------------------------------------------------- + vendor model serial disposition + --------------------------------------------------------------------------------------- +* fake-vendor fake-model serial-03a84dd2-e0a4-435d-96de-67bfe2674f4e - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-188c3b95-16fa-45ea-b9f7-e987560b4d62 - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-1f3bbc7c-888f-40fa-b705-fab3f148b147 - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-45a81e70-03bb-4c53-bf49-d598c9fb8d34 - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-56c3f0ef-fac1-473d-9317-0e3668aa7e88 - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-96f1615c-3dda-427f-8132-408b2fad24e0 - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-a9ef71b2-ec22-421c-adc9-bddc4c0641c4 - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-b9f9c626-3293-48eb-a475-1debaaccdf6c - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-d563fd5f-9306-49b4-8511-78a2f64733ce - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-fcca32b6-9629-468f-a282-63d7da992447 - in service + └─ + expunged ✓ datasets from generation 3: @@ -117,19 +127,19 @@ to: blueprint 74f2e7fd-687e-4c9e-b5d8-e474a5bb8e7c sled cdba3bea-3407-4b6e-a029-19bf4a02fca7 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-08616473-ded4-4785-9b53-b6ccc1efb67a - fake-vendor fake-model serial-2d44b756-94df-45ec-a644-50021248682d - fake-vendor fake-model serial-2dce7cf0-3097-485d-aaf6-9fc51f99eae5 - fake-vendor fake-model serial-3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7 - fake-vendor fake-model serial-44342c41-75a7-4708-8004-eb2ca5c5a3c2 - fake-vendor fake-model serial-650b4eff-80a2-430a-97c8-f837248480a1 - fake-vendor fake-model serial-6e418b8c-cadd-4fb8-8370-f351a07e1eed - fake-vendor fake-model serial-6e5772a5-8234-46d1-ba5a-503a83d9d2fb - fake-vendor fake-model serial-c1da692e-7713-43a0-b6bb-5c182084c09d - fake-vendor fake-model serial-e35766ef-789a-4b2f-9a6c-e6626d5ab195 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-08616473-ded4-4785-9b53-b6ccc1efb67a in service + fake-vendor fake-model serial-2d44b756-94df-45ec-a644-50021248682d in service + fake-vendor fake-model serial-2dce7cf0-3097-485d-aaf6-9fc51f99eae5 in service + fake-vendor fake-model serial-3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7 in service + fake-vendor fake-model serial-44342c41-75a7-4708-8004-eb2ca5c5a3c2 in service + fake-vendor fake-model serial-650b4eff-80a2-430a-97c8-f837248480a1 in service + fake-vendor fake-model serial-6e418b8c-cadd-4fb8-8370-f351a07e1eed in service + fake-vendor fake-model serial-6e5772a5-8234-46d1-ba5a-503a83d9d2fb in service + fake-vendor fake-model serial-c1da692e-7713-43a0-b6bb-5c182084c09d in service + fake-vendor fake-model serial-e35766ef-789a-4b2f-9a6c-e6626d5ab195 in service datasets generation 3 -> 4: @@ -218,19 +228,19 @@ to: blueprint 74f2e7fd-687e-4c9e-b5d8-e474a5bb8e7c sled fe7b9b01-e803-41ea-9e39-db240dcd9029 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-21d60319-5fe1-4a3b-a4c0-6aa7465e7bde - fake-vendor fake-model serial-2acfbb84-5ce0-424e-8d73-44c5071d4430 - fake-vendor fake-model serial-2db7f3b4-ed19-4229-b42c-44f49eeb8a91 - fake-vendor fake-model serial-2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a - fake-vendor fake-model serial-355e268c-c932-4f32-841c-f3ec88fe0495 - fake-vendor fake-model serial-427b2ccd-998f-4085-af21-e600604cf21e - fake-vendor fake-model serial-588058f2-f51b-4800-a211-1c5dbb32296b - fake-vendor fake-model serial-736f6f07-2aa2-4658-8b5c-3bf409ea747a - fake-vendor fake-model serial-bcfcdede-7084-4a31-97a8-ac4299c268f9 - fake-vendor fake-model serial-fe379ac6-1938-4cc2-93a9-43b1447229ae + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-21d60319-5fe1-4a3b-a4c0-6aa7465e7bde in service + fake-vendor fake-model serial-2acfbb84-5ce0-424e-8d73-44c5071d4430 in service + fake-vendor fake-model serial-2db7f3b4-ed19-4229-b42c-44f49eeb8a91 in service + fake-vendor fake-model serial-2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a in service + fake-vendor fake-model serial-355e268c-c932-4f32-841c-f3ec88fe0495 in service + fake-vendor fake-model serial-427b2ccd-998f-4085-af21-e600604cf21e in service + fake-vendor fake-model serial-588058f2-f51b-4800-a211-1c5dbb32296b in service + fake-vendor fake-model serial-736f6f07-2aa2-4658-8b5c-3bf409ea747a in service + fake-vendor fake-model serial-bcfcdede-7084-4a31-97a8-ac4299c268f9 in service + fake-vendor fake-model serial-fe379ac6-1938-4cc2-93a9-43b1447229ae in service datasets 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 d26add641d..ac9429d35c 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 @@ -5,6 +5,22 @@ to: blueprint df68d4d4-5af4-4b56-95bb-1654a6957d4f sled b340c044-bd87-4a3b-aee3-e6ccd9d3ff02 (decommissioned): + physical disks at generation 3: + ------------------------------------------------------------------------------------- + vendor model serial disposition + ------------------------------------------------------------------------------------- + fake-vendor fake-model serial-03a84dd2-e0a4-435d-96de-67bfe2674f4e expunged ✓ + fake-vendor fake-model serial-188c3b95-16fa-45ea-b9f7-e987560b4d62 expunged ✓ + fake-vendor fake-model serial-1f3bbc7c-888f-40fa-b705-fab3f148b147 expunged ✓ + fake-vendor fake-model serial-45a81e70-03bb-4c53-bf49-d598c9fb8d34 expunged ✓ + fake-vendor fake-model serial-56c3f0ef-fac1-473d-9317-0e3668aa7e88 expunged ✓ + fake-vendor fake-model serial-96f1615c-3dda-427f-8132-408b2fad24e0 expunged ✓ + fake-vendor fake-model serial-a9ef71b2-ec22-421c-adc9-bddc4c0641c4 expunged ✓ + fake-vendor fake-model serial-b9f9c626-3293-48eb-a475-1debaaccdf6c expunged ✓ + fake-vendor fake-model serial-d563fd5f-9306-49b4-8511-78a2f64733ce expunged ✓ + fake-vendor fake-model serial-fcca32b6-9629-468f-a282-63d7da992447 expunged ✓ + + omicron zones at generation 4: ------------------------------------------------------------------------------------------------ zone type zone id disposition underlay IP @@ -30,19 +46,19 @@ to: blueprint df68d4d4-5af4-4b56-95bb-1654a6957d4f sled cdba3bea-3407-4b6e-a029-19bf4a02fca7 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-08616473-ded4-4785-9b53-b6ccc1efb67a - fake-vendor fake-model serial-2d44b756-94df-45ec-a644-50021248682d - fake-vendor fake-model serial-2dce7cf0-3097-485d-aaf6-9fc51f99eae5 - fake-vendor fake-model serial-3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7 - fake-vendor fake-model serial-44342c41-75a7-4708-8004-eb2ca5c5a3c2 - fake-vendor fake-model serial-650b4eff-80a2-430a-97c8-f837248480a1 - fake-vendor fake-model serial-6e418b8c-cadd-4fb8-8370-f351a07e1eed - fake-vendor fake-model serial-6e5772a5-8234-46d1-ba5a-503a83d9d2fb - fake-vendor fake-model serial-c1da692e-7713-43a0-b6bb-5c182084c09d - fake-vendor fake-model serial-e35766ef-789a-4b2f-9a6c-e6626d5ab195 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-08616473-ded4-4785-9b53-b6ccc1efb67a in service + fake-vendor fake-model serial-2d44b756-94df-45ec-a644-50021248682d in service + fake-vendor fake-model serial-2dce7cf0-3097-485d-aaf6-9fc51f99eae5 in service + fake-vendor fake-model serial-3b9d69e5-aa80-4fc8-9d2e-a2a24bd0f1d7 in service + fake-vendor fake-model serial-44342c41-75a7-4708-8004-eb2ca5c5a3c2 in service + fake-vendor fake-model serial-650b4eff-80a2-430a-97c8-f837248480a1 in service + fake-vendor fake-model serial-6e418b8c-cadd-4fb8-8370-f351a07e1eed in service + fake-vendor fake-model serial-6e5772a5-8234-46d1-ba5a-503a83d9d2fb in service + fake-vendor fake-model serial-c1da692e-7713-43a0-b6bb-5c182084c09d in service + fake-vendor fake-model serial-e35766ef-789a-4b2f-9a6c-e6626d5ab195 in service datasets at generation 4: @@ -131,19 +147,19 @@ to: blueprint df68d4d4-5af4-4b56-95bb-1654a6957d4f sled fe7b9b01-e803-41ea-9e39-db240dcd9029 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-21d60319-5fe1-4a3b-a4c0-6aa7465e7bde - fake-vendor fake-model serial-2acfbb84-5ce0-424e-8d73-44c5071d4430 - fake-vendor fake-model serial-2db7f3b4-ed19-4229-b42c-44f49eeb8a91 - fake-vendor fake-model serial-2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a - fake-vendor fake-model serial-355e268c-c932-4f32-841c-f3ec88fe0495 - fake-vendor fake-model serial-427b2ccd-998f-4085-af21-e600604cf21e - fake-vendor fake-model serial-588058f2-f51b-4800-a211-1c5dbb32296b - fake-vendor fake-model serial-736f6f07-2aa2-4658-8b5c-3bf409ea747a - fake-vendor fake-model serial-bcfcdede-7084-4a31-97a8-ac4299c268f9 - fake-vendor fake-model serial-fe379ac6-1938-4cc2-93a9-43b1447229ae + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-21d60319-5fe1-4a3b-a4c0-6aa7465e7bde in service + fake-vendor fake-model serial-2acfbb84-5ce0-424e-8d73-44c5071d4430 in service + fake-vendor fake-model serial-2db7f3b4-ed19-4229-b42c-44f49eeb8a91 in service + fake-vendor fake-model serial-2fa34d8e-13d9-42d3-b8ba-ca9d74ac496a in service + fake-vendor fake-model serial-355e268c-c932-4f32-841c-f3ec88fe0495 in service + fake-vendor fake-model serial-427b2ccd-998f-4085-af21-e600604cf21e in service + fake-vendor fake-model serial-588058f2-f51b-4800-a211-1c5dbb32296b in service + fake-vendor fake-model serial-736f6f07-2aa2-4658-8b5c-3bf409ea747a in service + fake-vendor fake-model serial-bcfcdede-7084-4a31-97a8-ac4299c268f9 in service + fake-vendor fake-model serial-fe379ac6-1938-4cc2-93a9-43b1447229ae in service datasets 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 2314706024..c4223a9415 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 @@ -6,19 +6,19 @@ to: blueprint d895ef50-9978-454c-bdfb-b8dbe2c9a918 sled 883d9767-021c-4836-81cf-fa02d73fead0 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-41eaf63b-4fa9-443e-8da1-78d1e79aac7d - fake-vendor fake-model serial-5b04e3d3-7a8b-466e-ab63-6ca89a93e100 - fake-vendor fake-model serial-6e8fdb9f-c47a-47b0-b7ee-9a2adc7e4af5 - fake-vendor fake-model serial-8e2c9e92-e35e-494c-8e14-dcf5f5009656 - fake-vendor fake-model serial-a4c575b4-934b-49b9-9c47-9c1241a33607 - fake-vendor fake-model serial-a9a8a692-d2d7-4b3e-a297-d648faf8c7cf - fake-vendor fake-model serial-b65c8376-0084-4d6f-9891-9d6a413d4e56 - fake-vendor fake-model serial-bc61cdae-c96f-4886-b8bd-f9fd69d51e3a - fake-vendor fake-model serial-e9f68306-460a-4b11-b904-f752633bf1fc - fake-vendor fake-model serial-fbc5bdf2-9644-4d0a-b349-f490486da25d + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-41eaf63b-4fa9-443e-8da1-78d1e79aac7d in service + fake-vendor fake-model serial-5b04e3d3-7a8b-466e-ab63-6ca89a93e100 in service + fake-vendor fake-model serial-6e8fdb9f-c47a-47b0-b7ee-9a2adc7e4af5 in service + fake-vendor fake-model serial-8e2c9e92-e35e-494c-8e14-dcf5f5009656 in service + fake-vendor fake-model serial-a4c575b4-934b-49b9-9c47-9c1241a33607 in service + fake-vendor fake-model serial-a9a8a692-d2d7-4b3e-a297-d648faf8c7cf in service + fake-vendor fake-model serial-b65c8376-0084-4d6f-9891-9d6a413d4e56 in service + fake-vendor fake-model serial-bc61cdae-c96f-4886-b8bd-f9fd69d51e3a in service + fake-vendor fake-model serial-e9f68306-460a-4b11-b904-f752633bf1fc in service + fake-vendor fake-model serial-fbc5bdf2-9644-4d0a-b349-f490486da25d in service datasets generation 4 -> 5: @@ -104,19 +104,19 @@ to: blueprint d895ef50-9978-454c-bdfb-b8dbe2c9a918 sled aae6114d-956b-4980-9759-b00b1ed893ee (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-21b01477-48d0-4b65-9089-4a48277af033 - fake-vendor fake-model serial-2704e66b-3d5c-4b64-951c-a051fa15e4a8 - fake-vendor fake-model serial-27a22f7e-754a-43ea-8ec4-e9cbd9b62e08 - fake-vendor fake-model serial-51c788ff-de33-43f7-b9c5-f5f56bf80736 - fake-vendor fake-model serial-5fe54077-c016-49a9-becb-14993f133d43 - fake-vendor fake-model serial-7e2644a1-bec7-433c-8168-8898d7140aab - fake-vendor fake-model serial-9825ff38-f07d-44a1-9efc-55a25e72015b - fake-vendor fake-model serial-cc585a73-ec86-4f8e-a327-901b947a4c69 - fake-vendor fake-model serial-d2801671-bb69-408e-93f7-ac2b05d992f8 - fake-vendor fake-model serial-f52832ea-60d7-443b-9847-df5384bfc8e2 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-21b01477-48d0-4b65-9089-4a48277af033 in service + fake-vendor fake-model serial-2704e66b-3d5c-4b64-951c-a051fa15e4a8 in service + fake-vendor fake-model serial-27a22f7e-754a-43ea-8ec4-e9cbd9b62e08 in service + fake-vendor fake-model serial-51c788ff-de33-43f7-b9c5-f5f56bf80736 in service + fake-vendor fake-model serial-5fe54077-c016-49a9-becb-14993f133d43 in service + fake-vendor fake-model serial-7e2644a1-bec7-433c-8168-8898d7140aab in service + fake-vendor fake-model serial-9825ff38-f07d-44a1-9efc-55a25e72015b in service + fake-vendor fake-model serial-cc585a73-ec86-4f8e-a327-901b947a4c69 in service + fake-vendor fake-model serial-d2801671-bb69-408e-93f7-ac2b05d992f8 in service + fake-vendor fake-model serial-f52832ea-60d7-443b-9847-df5384bfc8e2 in service datasets generation 3 -> 4: @@ -205,19 +205,19 @@ to: blueprint d895ef50-9978-454c-bdfb-b8dbe2c9a918 sled be4a3b25-dde1-40a4-b909-9fa4379a8510 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-288d864c-3a9e-4f21-8c6e-720702c82a29 - fake-vendor fake-model serial-5f877424-eca4-4c5d-af7f-41627382cfd8 - fake-vendor fake-model serial-65ebc532-cbb7-43e1-923b-37c5cb7236d7 - fake-vendor fake-model serial-8277a18f-3187-4893-8ef1-5cbfe2284616 - fake-vendor fake-model serial-83592889-d746-4c5d-98e8-582d9c34a15f - fake-vendor fake-model serial-88e423b5-98c9-4e78-992a-5d01e1c33272 - fake-vendor fake-model serial-a5553017-9991-4ffb-ae37-f9c0e3428562 - fake-vendor fake-model serial-b2c5a75b-9f72-405a-8134-691c0f45a1fd - fake-vendor fake-model serial-d4d665fc-df4d-4a13-b9c2-ad13549c0845 - fake-vendor fake-model serial-facb28ca-94fd-47a0-bf63-ee394d32c43b + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-288d864c-3a9e-4f21-8c6e-720702c82a29 in service + fake-vendor fake-model serial-5f877424-eca4-4c5d-af7f-41627382cfd8 in service + fake-vendor fake-model serial-65ebc532-cbb7-43e1-923b-37c5cb7236d7 in service + fake-vendor fake-model serial-8277a18f-3187-4893-8ef1-5cbfe2284616 in service + fake-vendor fake-model serial-83592889-d746-4c5d-98e8-582d9c34a15f in service + fake-vendor fake-model serial-88e423b5-98c9-4e78-992a-5d01e1c33272 in service + fake-vendor fake-model serial-a5553017-9991-4ffb-ae37-f9c0e3428562 in service + fake-vendor fake-model serial-b2c5a75b-9f72-405a-8134-691c0f45a1fd in service + fake-vendor fake-model serial-d4d665fc-df4d-4a13-b9c2-ad13549c0845 in service + fake-vendor fake-model serial-facb28ca-94fd-47a0-bf63-ee394d32c43b in service datasets 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 bbb183dff8..3965ae2957 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_1_2.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_1_2.txt @@ -6,19 +6,19 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 sled 2d1cb4f2-cf44-40fc-b118-85036eb732a9 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-13e6503b-5300-4ccd-abc4-c1512b435929 - fake-vendor fake-model serial-44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34 - fake-vendor fake-model serial-4de5fc8e-0e41-4ab9-ba12-2dc63882c96a - fake-vendor fake-model serial-51564e7a-d69f-4942-bcfe-330224633ca6 - fake-vendor fake-model serial-5ca23cb3-cc90-41c5-a474-01898cdd0796 - fake-vendor fake-model serial-6a23a532-0712-4a8d-be9b-e8c17e97aa4b - fake-vendor fake-model serial-6f1a330e-e8d4-4c09-97fc-8918b69b2a3c - fake-vendor fake-model serial-7113d104-fb55-4299-bf53-b3c59d258e44 - fake-vendor fake-model serial-8c10be49-3a66-40d4-a082-64d09d916f14 - fake-vendor fake-model serial-d1ebfd7b-3842-4ad7-be31-2b9c031209a9 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-13e6503b-5300-4ccd-abc4-c1512b435929 in service + fake-vendor fake-model serial-44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34 in service + fake-vendor fake-model serial-4de5fc8e-0e41-4ab9-ba12-2dc63882c96a in service + fake-vendor fake-model serial-51564e7a-d69f-4942-bcfe-330224633ca6 in service + fake-vendor fake-model serial-5ca23cb3-cc90-41c5-a474-01898cdd0796 in service + fake-vendor fake-model serial-6a23a532-0712-4a8d-be9b-e8c17e97aa4b in service + fake-vendor fake-model serial-6f1a330e-e8d4-4c09-97fc-8918b69b2a3c in service + fake-vendor fake-model serial-7113d104-fb55-4299-bf53-b3c59d258e44 in service + fake-vendor fake-model serial-8c10be49-3a66-40d4-a082-64d09d916f14 in service + fake-vendor fake-model serial-d1ebfd7b-3842-4ad7-be31-2b9c031209a9 in service datasets at generation 2: @@ -99,20 +99,30 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 sled 48d95fef-bc9f-4f50-9a53-1e075836291d (active -> decommissioned): - physical disks from generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- -- fake-vendor fake-model serial-22930645-144a-415c-bceb-2dbfafb9c29e -- fake-vendor fake-model serial-24155070-8a43-4244-a3ba-853d8c71972d -- fake-vendor fake-model serial-494782c7-3821-4f49-918b-ce42cc4d18ad -- fake-vendor fake-model serial-6ea8a67f-d27d-472b-844c-6c8245b00e2b -- fake-vendor fake-model serial-77565d57-c235-4905-b3c7-32d1c2ca2c44 -- fake-vendor fake-model serial-8746874c-dc3b-4454-93cd-2a8fc13720fe -- fake-vendor fake-model serial-a42c5a67-6e10-4586-a56e-48bb8260e75f -- fake-vendor fake-model serial-ca89b120-7bcd-4eeb-baa7-71031fbd103b -- fake-vendor fake-model serial-ef61aa97-c862-428c-82f3-0a69a50d6155 -- fake-vendor fake-model serial-ef64ff6d-250d-47ac-8686-e696cfb46966 + physical disks generation 2 -> 3: + --------------------------------------------------------------------------------------- + vendor model serial disposition + --------------------------------------------------------------------------------------- +* fake-vendor fake-model serial-22930645-144a-415c-bceb-2dbfafb9c29e - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-24155070-8a43-4244-a3ba-853d8c71972d - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-494782c7-3821-4f49-918b-ce42cc4d18ad - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-6ea8a67f-d27d-472b-844c-6c8245b00e2b - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-77565d57-c235-4905-b3c7-32d1c2ca2c44 - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-8746874c-dc3b-4454-93cd-2a8fc13720fe - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-a42c5a67-6e10-4586-a56e-48bb8260e75f - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-ca89b120-7bcd-4eeb-baa7-71031fbd103b - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-ef61aa97-c862-428c-82f3-0a69a50d6155 - in service + └─ + expunged ✓ +* fake-vendor fake-model serial-ef64ff6d-250d-47ac-8686-e696cfb46966 - in service + └─ + expunged ✓ datasets from generation 2: @@ -202,20 +212,20 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 sled 68d24ac5-f341-49ea-a92a-0381b52ab387 (decommissioned): - physical disks from generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- -- fake-vendor fake-model serial-09a5de95-c15f-486e-b776-fca62bf5e179 -- fake-vendor fake-model serial-11b8eccf-7c78-4bde-8639-b35a83082a95 -- fake-vendor fake-model serial-1931c422-4c6a-4597-8ae7-ecb44718462c -- fake-vendor fake-model serial-21a8a87e-73a4-42d4-a426-f6eec94004e3 -- fake-vendor fake-model serial-222c0b55-2966-46b6-816c-9063a7587806 -- fake-vendor fake-model serial-3676f688-f41c-4f89-936a-6b04c3011b2a -- fake-vendor fake-model serial-5e9e14c4-d60d-4b5c-a11c-bba54eb24c9f -- fake-vendor fake-model serial-74f7b89e-88f5-4336-ba8b-22283a6966c5 -- fake-vendor fake-model serial-a787cac8-b5e3-49e3-aaab-20d8eadd8a63 -- fake-vendor fake-model serial-d56b0c9f-0e57-43d8-a1ac-8b4d2c303c29 + physical disks at generation 2: + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-09a5de95-c15f-486e-b776-fca62bf5e179 in service + fake-vendor fake-model serial-11b8eccf-7c78-4bde-8639-b35a83082a95 in service + fake-vendor fake-model serial-1931c422-4c6a-4597-8ae7-ecb44718462c in service + fake-vendor fake-model serial-21a8a87e-73a4-42d4-a426-f6eec94004e3 in service + fake-vendor fake-model serial-222c0b55-2966-46b6-816c-9063a7587806 in service + fake-vendor fake-model serial-3676f688-f41c-4f89-936a-6b04c3011b2a in service + fake-vendor fake-model serial-5e9e14c4-d60d-4b5c-a11c-bba54eb24c9f in service + fake-vendor fake-model serial-74f7b89e-88f5-4336-ba8b-22283a6966c5 in service + fake-vendor fake-model serial-a787cac8-b5e3-49e3-aaab-20d8eadd8a63 in service + fake-vendor fake-model serial-d56b0c9f-0e57-43d8-a1ac-8b4d2c303c29 in service datasets from generation 2: @@ -292,19 +302,19 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 sled 75bc286f-2b4b-482c-9431-59272af529da (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-4069c804-c51a-4adc-8822-3cbbab56ed3f - fake-vendor fake-model serial-5248a306-4a03-449e-a8a3-6f86d26da755 - fake-vendor fake-model serial-55196665-ed61-4b23-9a74-0711bf2eaf90 - fake-vendor fake-model serial-6b2a719a-35eb-469f-aa54-114a1f21f37d - fake-vendor fake-model serial-7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e - fake-vendor fake-model serial-984e2389-e7fd-4af9-ab02-e3caf77f95b5 - fake-vendor fake-model serial-a5f75431-3795-426c-8f80-176f658281a5 - fake-vendor fake-model serial-cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901 - fake-vendor fake-model serial-e405da11-cb6b-4ebc-bac1-9bc997352e10 - fake-vendor fake-model serial-f4d7f914-ec73-4b65-8696-5068591d9065 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-4069c804-c51a-4adc-8822-3cbbab56ed3f in service + fake-vendor fake-model serial-5248a306-4a03-449e-a8a3-6f86d26da755 in service + fake-vendor fake-model serial-55196665-ed61-4b23-9a74-0711bf2eaf90 in service + fake-vendor fake-model serial-6b2a719a-35eb-469f-aa54-114a1f21f37d in service + fake-vendor fake-model serial-7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e in service + fake-vendor fake-model serial-984e2389-e7fd-4af9-ab02-e3caf77f95b5 in service + fake-vendor fake-model serial-a5f75431-3795-426c-8f80-176f658281a5 in service + fake-vendor fake-model serial-cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901 in service + fake-vendor fake-model serial-e405da11-cb6b-4ebc-bac1-9bc997352e10 in service + fake-vendor fake-model serial-f4d7f914-ec73-4b65-8696-5068591d9065 in service datasets generation 2 -> 3: @@ -382,19 +392,19 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 sled affab35f-600a-4109-8ea0-34a067a4e0bc (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-33d48d85-751e-4982-b738-eae4d9a05f01 - fake-vendor fake-model serial-39ca2e23-4c38-4743-afe0-26b0380b27db - fake-vendor fake-model serial-4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c - fake-vendor fake-model serial-60131a33-1f12-4dbb-9435-bdd368db1f51 - fake-vendor fake-model serial-77e45b5b-869f-4e78-8ce3-28bbe8cf37e9 - fake-vendor fake-model serial-789d607d-d196-428e-a988-f7886a327859 - fake-vendor fake-model serial-b104b94c-2197-4e76-bfbd-6f966bd5af66 - fake-vendor fake-model serial-cd62306a-aedf-47e8-93d5-92a358d64c7b - fake-vendor fake-model serial-f1693454-aac1-4265-b8a0-4e9f3f41c7b3 - fake-vendor fake-model serial-fe4fdfba-3b6d-47d3-8612-1fb2390b650a + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-33d48d85-751e-4982-b738-eae4d9a05f01 in service + fake-vendor fake-model serial-39ca2e23-4c38-4743-afe0-26b0380b27db in service + fake-vendor fake-model serial-4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c in service + fake-vendor fake-model serial-60131a33-1f12-4dbb-9435-bdd368db1f51 in service + fake-vendor fake-model serial-77e45b5b-869f-4e78-8ce3-28bbe8cf37e9 in service + fake-vendor fake-model serial-789d607d-d196-428e-a988-f7886a327859 in service + fake-vendor fake-model serial-b104b94c-2197-4e76-bfbd-6f966bd5af66 in service + fake-vendor fake-model serial-cd62306a-aedf-47e8-93d5-92a358d64c7b in service + fake-vendor fake-model serial-f1693454-aac1-4265-b8a0-4e9f3f41c7b3 in service + fake-vendor fake-model serial-fe4fdfba-3b6d-47d3-8612-1fb2390b650a in service datasets 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 da3ae9e98a..19c8e56dd1 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_2_2a.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_2_2a.txt @@ -6,19 +6,19 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 sled 75bc286f-2b4b-482c-9431-59272af529da (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-4069c804-c51a-4adc-8822-3cbbab56ed3f - fake-vendor fake-model serial-5248a306-4a03-449e-a8a3-6f86d26da755 - fake-vendor fake-model serial-55196665-ed61-4b23-9a74-0711bf2eaf90 - fake-vendor fake-model serial-6b2a719a-35eb-469f-aa54-114a1f21f37d - fake-vendor fake-model serial-7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e - fake-vendor fake-model serial-984e2389-e7fd-4af9-ab02-e3caf77f95b5 - fake-vendor fake-model serial-a5f75431-3795-426c-8f80-176f658281a5 - fake-vendor fake-model serial-cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901 - fake-vendor fake-model serial-e405da11-cb6b-4ebc-bac1-9bc997352e10 - fake-vendor fake-model serial-f4d7f914-ec73-4b65-8696-5068591d9065 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-4069c804-c51a-4adc-8822-3cbbab56ed3f in service + fake-vendor fake-model serial-5248a306-4a03-449e-a8a3-6f86d26da755 in service + fake-vendor fake-model serial-55196665-ed61-4b23-9a74-0711bf2eaf90 in service + fake-vendor fake-model serial-6b2a719a-35eb-469f-aa54-114a1f21f37d in service + fake-vendor fake-model serial-7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e in service + fake-vendor fake-model serial-984e2389-e7fd-4af9-ab02-e3caf77f95b5 in service + fake-vendor fake-model serial-a5f75431-3795-426c-8f80-176f658281a5 in service + fake-vendor fake-model serial-cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901 in service + fake-vendor fake-model serial-e405da11-cb6b-4ebc-bac1-9bc997352e10 in service + fake-vendor fake-model serial-f4d7f914-ec73-4b65-8696-5068591d9065 in service datasets at generation 3: @@ -96,19 +96,19 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 sled affab35f-600a-4109-8ea0-34a067a4e0bc (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-33d48d85-751e-4982-b738-eae4d9a05f01 - fake-vendor fake-model serial-39ca2e23-4c38-4743-afe0-26b0380b27db - fake-vendor fake-model serial-4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c - fake-vendor fake-model serial-60131a33-1f12-4dbb-9435-bdd368db1f51 - fake-vendor fake-model serial-77e45b5b-869f-4e78-8ce3-28bbe8cf37e9 - fake-vendor fake-model serial-789d607d-d196-428e-a988-f7886a327859 - fake-vendor fake-model serial-b104b94c-2197-4e76-bfbd-6f966bd5af66 - fake-vendor fake-model serial-cd62306a-aedf-47e8-93d5-92a358d64c7b - fake-vendor fake-model serial-f1693454-aac1-4265-b8a0-4e9f3f41c7b3 - fake-vendor fake-model serial-fe4fdfba-3b6d-47d3-8612-1fb2390b650a + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-33d48d85-751e-4982-b738-eae4d9a05f01 in service + fake-vendor fake-model serial-39ca2e23-4c38-4743-afe0-26b0380b27db in service + fake-vendor fake-model serial-4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c in service + fake-vendor fake-model serial-60131a33-1f12-4dbb-9435-bdd368db1f51 in service + fake-vendor fake-model serial-77e45b5b-869f-4e78-8ce3-28bbe8cf37e9 in service + fake-vendor fake-model serial-789d607d-d196-428e-a988-f7886a327859 in service + fake-vendor fake-model serial-b104b94c-2197-4e76-bfbd-6f966bd5af66 in service + fake-vendor fake-model serial-cd62306a-aedf-47e8-93d5-92a358d64c7b in service + fake-vendor fake-model serial-f1693454-aac1-4265-b8a0-4e9f3f41c7b3 in service + fake-vendor fake-model serial-fe4fdfba-3b6d-47d3-8612-1fb2390b650a in service datasets at generation 3: @@ -183,48 +183,24 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 nexus cab211e1-3ab1-475f-81fa-984748044d8c in service fd00:1122:3344:101::2d - REMOVED SLEDS: - - sled 68d24ac5-f341-49ea-a92a-0381b52ab387 (was decommissioned): - - omicron zones from generation 2: - ---------------------------------------------------------------------------------------------- - zone type zone id disposition underlay IP - ---------------------------------------------------------------------------------------------- -- crucible 258c5106-ebcd-4651-96e4-d5b0895691f6 expunged ⏳ fd00:1122:3344:102::25 -- crucible 2b046f65-00f5-46da-988c-90c1de32a1dd expunged ⏳ fd00:1122:3344:102::2a -- crucible 30c770a8-625e-4864-8977-d83a11c1c596 expunged ⏳ fd00:1122:3344:102::2d -- crucible 35e3587d-25d3-4234-822f-2d68713b8cbf expunged ⏳ fd00:1122:3344:102::27 -- crucible 46293b15-fd26-48f9-9ccb-122fa0ef41b4 expunged ⏳ fd00:1122:3344:102::28 -- crucible 462c6b8d-1872-4671-b84a-bdcbb69e3baf expunged ⏳ fd00:1122:3344:102::24 -- crucible a046c5f9-25e7-47c3-9c67-43d68fb39c5e expunged ⏳ fd00:1122:3344:102::26 -- crucible a49d4037-506e-4732-8e21-1f8c136a3c17 expunged ⏳ fd00:1122:3344:102::2c -- crucible df94dc9a-74d9-43a9-8879-199740665f29 expunged ⏳ fd00:1122:3344:102::2b -- crucible f1622981-7f0b-4a9f-9a70-6b46ab9d5e86 expunged ⏳ fd00:1122:3344:102::29 -- crucible_pantry b217d3a5-4ebb-45e3-b5be-2ebb2c57d8fa expunged ⏳ fd00:1122:3344:102::23 -- internal_dns 0efed95e-f052-4535-b45a-fac1148c0e6a expunged ⏳ fd00:1122:3344:3::1 -- internal_ntp 61a79cb4-7fcb-432d-bbe9-3f9882452db2 expunged ⏳ fd00:1122:3344:102::21 -- nexus ee146b15-bc59-43a3-9567-bb8596e6188d expunged ⏳ fd00:1122:3344:102::22 - - MODIFIED SLEDS: sled 2d1cb4f2-cf44-40fc-b118-85036eb732a9 (active): physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-13e6503b-5300-4ccd-abc4-c1512b435929 - fake-vendor fake-model serial-44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34 - fake-vendor fake-model serial-4de5fc8e-0e41-4ab9-ba12-2dc63882c96a - fake-vendor fake-model serial-51564e7a-d69f-4942-bcfe-330224633ca6 - fake-vendor fake-model serial-5ca23cb3-cc90-41c5-a474-01898cdd0796 - fake-vendor fake-model serial-6a23a532-0712-4a8d-be9b-e8c17e97aa4b - fake-vendor fake-model serial-6f1a330e-e8d4-4c09-97fc-8918b69b2a3c - fake-vendor fake-model serial-7113d104-fb55-4299-bf53-b3c59d258e44 - fake-vendor fake-model serial-8c10be49-3a66-40d4-a082-64d09d916f14 - fake-vendor fake-model serial-d1ebfd7b-3842-4ad7-be31-2b9c031209a9 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-13e6503b-5300-4ccd-abc4-c1512b435929 in service + fake-vendor fake-model serial-44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34 in service + fake-vendor fake-model serial-4de5fc8e-0e41-4ab9-ba12-2dc63882c96a in service + fake-vendor fake-model serial-51564e7a-d69f-4942-bcfe-330224633ca6 in service + fake-vendor fake-model serial-5ca23cb3-cc90-41c5-a474-01898cdd0796 in service + fake-vendor fake-model serial-6a23a532-0712-4a8d-be9b-e8c17e97aa4b in service + fake-vendor fake-model serial-6f1a330e-e8d4-4c09-97fc-8918b69b2a3c in service + fake-vendor fake-model serial-7113d104-fb55-4299-bf53-b3c59d258e44 in service + fake-vendor fake-model serial-8c10be49-3a66-40d4-a082-64d09d916f14 in service + fake-vendor fake-model serial-d1ebfd7b-3842-4ad7-be31-2b9c031209a9 in service datasets at generation 2: @@ -302,6 +278,22 @@ to: blueprint 9f71f5d3-a272-4382-9154-6ea2e171a6c6 sled 48d95fef-bc9f-4f50-9a53-1e075836291d (decommissioned): + physical disks at generation 3: + ------------------------------------------------------------------------------------- + vendor model serial disposition + ------------------------------------------------------------------------------------- + fake-vendor fake-model serial-22930645-144a-415c-bceb-2dbfafb9c29e expunged ✓ + fake-vendor fake-model serial-24155070-8a43-4244-a3ba-853d8c71972d expunged ✓ + fake-vendor fake-model serial-494782c7-3821-4f49-918b-ce42cc4d18ad expunged ✓ + fake-vendor fake-model serial-6ea8a67f-d27d-472b-844c-6c8245b00e2b expunged ✓ + fake-vendor fake-model serial-77565d57-c235-4905-b3c7-32d1c2ca2c44 expunged ✓ + fake-vendor fake-model serial-8746874c-dc3b-4454-93cd-2a8fc13720fe expunged ✓ + fake-vendor fake-model serial-a42c5a67-6e10-4586-a56e-48bb8260e75f expunged ✓ + fake-vendor fake-model serial-ca89b120-7bcd-4eeb-baa7-71031fbd103b expunged ✓ + fake-vendor fake-model serial-ef61aa97-c862-428c-82f3-0a69a50d6155 expunged ✓ + fake-vendor fake-model serial-ef64ff6d-250d-47ac-8686-e696cfb46966 expunged ✓ + + omicron zones generation 3 -> 4: ---------------------------------------------------------------------------------------------- zone type zone id disposition underlay IP diff --git a/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_bp2.txt b/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_bp2.txt index 9c98f54682..dac3bebeb3 100644 --- a/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_bp2.txt +++ b/nexus/reconfigurator/planning/tests/output/planner_nonprovisionable_bp2.txt @@ -4,19 +4,19 @@ parent: 4d4e6c38-cd95-4c4e-8f45-6af4d686964b sled: 2d1cb4f2-cf44-40fc-b118-85036eb732a9 (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-13e6503b-5300-4ccd-abc4-c1512b435929 - fake-vendor fake-model serial-44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34 - fake-vendor fake-model serial-4de5fc8e-0e41-4ab9-ba12-2dc63882c96a - fake-vendor fake-model serial-51564e7a-d69f-4942-bcfe-330224633ca6 - fake-vendor fake-model serial-5ca23cb3-cc90-41c5-a474-01898cdd0796 - fake-vendor fake-model serial-6a23a532-0712-4a8d-be9b-e8c17e97aa4b - fake-vendor fake-model serial-6f1a330e-e8d4-4c09-97fc-8918b69b2a3c - fake-vendor fake-model serial-7113d104-fb55-4299-bf53-b3c59d258e44 - fake-vendor fake-model serial-8c10be49-3a66-40d4-a082-64d09d916f14 - fake-vendor fake-model serial-d1ebfd7b-3842-4ad7-be31-2b9c031209a9 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-13e6503b-5300-4ccd-abc4-c1512b435929 in service + fake-vendor fake-model serial-44cdb6f2-fa6c-4b69-bab2-3ae4e1ec4b34 in service + fake-vendor fake-model serial-4de5fc8e-0e41-4ab9-ba12-2dc63882c96a in service + fake-vendor fake-model serial-51564e7a-d69f-4942-bcfe-330224633ca6 in service + fake-vendor fake-model serial-5ca23cb3-cc90-41c5-a474-01898cdd0796 in service + fake-vendor fake-model serial-6a23a532-0712-4a8d-be9b-e8c17e97aa4b in service + fake-vendor fake-model serial-6f1a330e-e8d4-4c09-97fc-8918b69b2a3c in service + fake-vendor fake-model serial-7113d104-fb55-4299-bf53-b3c59d258e44 in service + fake-vendor fake-model serial-8c10be49-3a66-40d4-a082-64d09d916f14 in service + fake-vendor fake-model serial-d1ebfd7b-3842-4ad7-be31-2b9c031209a9 in service datasets at generation 2: @@ -94,22 +94,100 @@ parent: 4d4e6c38-cd95-4c4e-8f45-6af4d686964b + sled: 48d95fef-bc9f-4f50-9a53-1e075836291d (decommissioned) + + physical disks at generation 3: + ------------------------------------------------------------------------------------- + vendor model serial disposition + ------------------------------------------------------------------------------------- + fake-vendor fake-model serial-22930645-144a-415c-bceb-2dbfafb9c29e expunged ✓ + fake-vendor fake-model serial-24155070-8a43-4244-a3ba-853d8c71972d expunged ✓ + fake-vendor fake-model serial-494782c7-3821-4f49-918b-ce42cc4d18ad expunged ✓ + fake-vendor fake-model serial-6ea8a67f-d27d-472b-844c-6c8245b00e2b expunged ✓ + fake-vendor fake-model serial-77565d57-c235-4905-b3c7-32d1c2ca2c44 expunged ✓ + fake-vendor fake-model serial-8746874c-dc3b-4454-93cd-2a8fc13720fe expunged ✓ + fake-vendor fake-model serial-a42c5a67-6e10-4586-a56e-48bb8260e75f expunged ✓ + fake-vendor fake-model serial-ca89b120-7bcd-4eeb-baa7-71031fbd103b expunged ✓ + fake-vendor fake-model serial-ef61aa97-c862-428c-82f3-0a69a50d6155 expunged ✓ + fake-vendor fake-model serial-ef64ff6d-250d-47ac-8686-e696cfb46966 expunged ✓ + + + omicron zones at generation 3: + ---------------------------------------------------------------------------------------------- + zone type zone id disposition underlay IP + ---------------------------------------------------------------------------------------------- + crucible 085d10cb-a6f0-46de-86bc-ad2f7f1defcf expunged ⏳ fd00:1122:3344:103::2d + crucible 2bf62dfa-537a-4616-aad5-64447faaec53 expunged ⏳ fd00:1122:3344:103::2b + crucible 50d43a78-e9af-4051-9f5d-85410f44214b expunged ⏳ fd00:1122:3344:103::27 + crucible 6e7b5239-0d2e-42a5-80aa-51a3bc859318 expunged ⏳ fd00:1122:3344:103::2a + crucible 8d87b485-3fb4-480b-97ce-02d066b799d7 expunged ⏳ fd00:1122:3344:103::26 + crucible b3d757b8-033f-4a68-82db-6ff5331b9739 expunged ⏳ fd00:1122:3344:103::25 + crucible bcd98cf5-a798-4aa0-81cc-8972a376073c expunged ⏳ fd00:1122:3344:103::28 + crucible bd12d9d5-bccf-433a-b078-794a69aeb89a expunged ⏳ fd00:1122:3344:103::29 + crucible d283707c-1b8f-4cb9-946d-041b25a83967 expunged ⏳ fd00:1122:3344:103::2c + crucible e362415d-2d54-4574-b823-3f01b9b751de expunged ⏳ fd00:1122:3344:103::24 + crucible_pantry 208c987a-ab33-47a3-a103-6108dd6dc4cb expunged ⏳ fd00:1122:3344:103::23 + internal_dns c428175e-6a1c-40bf-aa36-f608a57431f5 expunged ⏳ fd00:1122:3344:2::1 + internal_ntp a8f1b53a-4231-4f04-9939-29e50a0f0e2c expunged ⏳ fd00:1122:3344:103::21 + nexus 533416e6-d0bd-482d-b592-29346c8a3471 expunged ⏳ fd00:1122:3344:103::22 + + + + sled: 68d24ac5-f341-49ea-a92a-0381b52ab387 (decommissioned) + + physical disks at generation 2: + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-09a5de95-c15f-486e-b776-fca62bf5e179 in service + fake-vendor fake-model serial-11b8eccf-7c78-4bde-8639-b35a83082a95 in service + fake-vendor fake-model serial-1931c422-4c6a-4597-8ae7-ecb44718462c in service + fake-vendor fake-model serial-21a8a87e-73a4-42d4-a426-f6eec94004e3 in service + fake-vendor fake-model serial-222c0b55-2966-46b6-816c-9063a7587806 in service + fake-vendor fake-model serial-3676f688-f41c-4f89-936a-6b04c3011b2a in service + fake-vendor fake-model serial-5e9e14c4-d60d-4b5c-a11c-bba54eb24c9f in service + fake-vendor fake-model serial-74f7b89e-88f5-4336-ba8b-22283a6966c5 in service + fake-vendor fake-model serial-a787cac8-b5e3-49e3-aaab-20d8eadd8a63 in service + fake-vendor fake-model serial-d56b0c9f-0e57-43d8-a1ac-8b4d2c303c29 in service + + + omicron zones at generation 2: + ---------------------------------------------------------------------------------------------- + zone type zone id disposition underlay IP + ---------------------------------------------------------------------------------------------- + crucible 258c5106-ebcd-4651-96e4-d5b0895691f6 expunged ⏳ fd00:1122:3344:102::25 + crucible 2b046f65-00f5-46da-988c-90c1de32a1dd expunged ⏳ fd00:1122:3344:102::2a + crucible 30c770a8-625e-4864-8977-d83a11c1c596 expunged ⏳ fd00:1122:3344:102::2d + crucible 35e3587d-25d3-4234-822f-2d68713b8cbf expunged ⏳ fd00:1122:3344:102::27 + crucible 46293b15-fd26-48f9-9ccb-122fa0ef41b4 expunged ⏳ fd00:1122:3344:102::28 + crucible 462c6b8d-1872-4671-b84a-bdcbb69e3baf expunged ⏳ fd00:1122:3344:102::24 + crucible a046c5f9-25e7-47c3-9c67-43d68fb39c5e expunged ⏳ fd00:1122:3344:102::26 + crucible a49d4037-506e-4732-8e21-1f8c136a3c17 expunged ⏳ fd00:1122:3344:102::2c + crucible df94dc9a-74d9-43a9-8879-199740665f29 expunged ⏳ fd00:1122:3344:102::2b + crucible f1622981-7f0b-4a9f-9a70-6b46ab9d5e86 expunged ⏳ fd00:1122:3344:102::29 + crucible_pantry b217d3a5-4ebb-45e3-b5be-2ebb2c57d8fa expunged ⏳ fd00:1122:3344:102::23 + internal_dns 0efed95e-f052-4535-b45a-fac1148c0e6a expunged ⏳ fd00:1122:3344:3::1 + internal_ntp 61a79cb4-7fcb-432d-bbe9-3f9882452db2 expunged ⏳ fd00:1122:3344:102::21 + nexus ee146b15-bc59-43a3-9567-bb8596e6188d expunged ⏳ fd00:1122:3344:102::22 + + + sled: 75bc286f-2b4b-482c-9431-59272af529da (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-4069c804-c51a-4adc-8822-3cbbab56ed3f - fake-vendor fake-model serial-5248a306-4a03-449e-a8a3-6f86d26da755 - fake-vendor fake-model serial-55196665-ed61-4b23-9a74-0711bf2eaf90 - fake-vendor fake-model serial-6b2a719a-35eb-469f-aa54-114a1f21f37d - fake-vendor fake-model serial-7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e - fake-vendor fake-model serial-984e2389-e7fd-4af9-ab02-e3caf77f95b5 - fake-vendor fake-model serial-a5f75431-3795-426c-8f80-176f658281a5 - fake-vendor fake-model serial-cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901 - fake-vendor fake-model serial-e405da11-cb6b-4ebc-bac1-9bc997352e10 - fake-vendor fake-model serial-f4d7f914-ec73-4b65-8696-5068591d9065 + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-4069c804-c51a-4adc-8822-3cbbab56ed3f in service + fake-vendor fake-model serial-5248a306-4a03-449e-a8a3-6f86d26da755 in service + fake-vendor fake-model serial-55196665-ed61-4b23-9a74-0711bf2eaf90 in service + fake-vendor fake-model serial-6b2a719a-35eb-469f-aa54-114a1f21f37d in service + fake-vendor fake-model serial-7ed4296a-66d1-4fb2-bc56-9b23b8f27d7e in service + fake-vendor fake-model serial-984e2389-e7fd-4af9-ab02-e3caf77f95b5 in service + fake-vendor fake-model serial-a5f75431-3795-426c-8f80-176f658281a5 in service + fake-vendor fake-model serial-cf32a1ce-2c9e-49f5-b1cf-4af7f2a28901 in service + fake-vendor fake-model serial-e405da11-cb6b-4ebc-bac1-9bc997352e10 in service + fake-vendor fake-model serial-f4d7f914-ec73-4b65-8696-5068591d9065 in service datasets at generation 3: @@ -188,19 +266,19 @@ parent: 4d4e6c38-cd95-4c4e-8f45-6af4d686964b sled: affab35f-600a-4109-8ea0-34a067a4e0bc (active) physical disks at generation 2: - ---------------------------------------------------------------------- - vendor model serial - ---------------------------------------------------------------------- - fake-vendor fake-model serial-33d48d85-751e-4982-b738-eae4d9a05f01 - fake-vendor fake-model serial-39ca2e23-4c38-4743-afe0-26b0380b27db - fake-vendor fake-model serial-4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c - fake-vendor fake-model serial-60131a33-1f12-4dbb-9435-bdd368db1f51 - fake-vendor fake-model serial-77e45b5b-869f-4e78-8ce3-28bbe8cf37e9 - fake-vendor fake-model serial-789d607d-d196-428e-a988-f7886a327859 - fake-vendor fake-model serial-b104b94c-2197-4e76-bfbd-6f966bd5af66 - fake-vendor fake-model serial-cd62306a-aedf-47e8-93d5-92a358d64c7b - fake-vendor fake-model serial-f1693454-aac1-4265-b8a0-4e9f3f41c7b3 - fake-vendor fake-model serial-fe4fdfba-3b6d-47d3-8612-1fb2390b650a + ------------------------------------------------------------------------------------ + vendor model serial disposition + ------------------------------------------------------------------------------------ + fake-vendor fake-model serial-33d48d85-751e-4982-b738-eae4d9a05f01 in service + fake-vendor fake-model serial-39ca2e23-4c38-4743-afe0-26b0380b27db in service + fake-vendor fake-model serial-4fbd2fe0-2eac-41b8-8e8d-4fa46c3e8b6c in service + fake-vendor fake-model serial-60131a33-1f12-4dbb-9435-bdd368db1f51 in service + fake-vendor fake-model serial-77e45b5b-869f-4e78-8ce3-28bbe8cf37e9 in service + fake-vendor fake-model serial-789d607d-d196-428e-a988-f7886a327859 in service + fake-vendor fake-model serial-b104b94c-2197-4e76-bfbd-6f966bd5af66 in service + fake-vendor fake-model serial-cd62306a-aedf-47e8-93d5-92a358d64c7b in service + fake-vendor fake-model serial-f1693454-aac1-4265-b8a0-4e9f3f41c7b3 in service + fake-vendor fake-model serial-fe4fdfba-3b6d-47d3-8612-1fb2390b650a in service datasets at generation 3: @@ -275,52 +353,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: - ---------------------------------------------------------------------------------------------- - zone type zone id disposition underlay IP - ---------------------------------------------------------------------------------------------- - crucible 085d10cb-a6f0-46de-86bc-ad2f7f1defcf expunged ⏳ fd00:1122:3344:103::2d - crucible 2bf62dfa-537a-4616-aad5-64447faaec53 expunged ⏳ fd00:1122:3344:103::2b - crucible 50d43a78-e9af-4051-9f5d-85410f44214b expunged ⏳ fd00:1122:3344:103::27 - crucible 6e7b5239-0d2e-42a5-80aa-51a3bc859318 expunged ⏳ fd00:1122:3344:103::2a - crucible 8d87b485-3fb4-480b-97ce-02d066b799d7 expunged ⏳ fd00:1122:3344:103::26 - crucible b3d757b8-033f-4a68-82db-6ff5331b9739 expunged ⏳ fd00:1122:3344:103::25 - crucible bcd98cf5-a798-4aa0-81cc-8972a376073c expunged ⏳ fd00:1122:3344:103::28 - crucible bd12d9d5-bccf-433a-b078-794a69aeb89a expunged ⏳ fd00:1122:3344:103::29 - crucible d283707c-1b8f-4cb9-946d-041b25a83967 expunged ⏳ fd00:1122:3344:103::2c - crucible e362415d-2d54-4574-b823-3f01b9b751de expunged ⏳ fd00:1122:3344:103::24 - crucible_pantry 208c987a-ab33-47a3-a103-6108dd6dc4cb expunged ⏳ fd00:1122:3344:103::23 - internal_dns c428175e-6a1c-40bf-aa36-f608a57431f5 expunged ⏳ fd00:1122:3344:2::1 - internal_ntp a8f1b53a-4231-4f04-9939-29e50a0f0e2c expunged ⏳ fd00:1122:3344:103::21 - nexus 533416e6-d0bd-482d-b592-29346c8a3471 expunged ⏳ fd00:1122:3344:103::22 - - - -!68d24ac5-f341-49ea-a92a-0381b52ab387 -WARNING: Zones exist without physical disks! - omicron zones at generation 2: - ---------------------------------------------------------------------------------------------- - zone type zone id disposition underlay IP - ---------------------------------------------------------------------------------------------- - crucible 258c5106-ebcd-4651-96e4-d5b0895691f6 expunged ⏳ fd00:1122:3344:102::25 - crucible 2b046f65-00f5-46da-988c-90c1de32a1dd expunged ⏳ fd00:1122:3344:102::2a - crucible 30c770a8-625e-4864-8977-d83a11c1c596 expunged ⏳ fd00:1122:3344:102::2d - crucible 35e3587d-25d3-4234-822f-2d68713b8cbf expunged ⏳ fd00:1122:3344:102::27 - crucible 46293b15-fd26-48f9-9ccb-122fa0ef41b4 expunged ⏳ fd00:1122:3344:102::28 - crucible 462c6b8d-1872-4671-b84a-bdcbb69e3baf expunged ⏳ fd00:1122:3344:102::24 - crucible a046c5f9-25e7-47c3-9c67-43d68fb39c5e expunged ⏳ fd00:1122:3344:102::26 - crucible a49d4037-506e-4732-8e21-1f8c136a3c17 expunged ⏳ fd00:1122:3344:102::2c - crucible df94dc9a-74d9-43a9-8879-199740665f29 expunged ⏳ fd00:1122:3344:102::2b - crucible f1622981-7f0b-4a9f-9a70-6b46ab9d5e86 expunged ⏳ fd00:1122:3344:102::29 - crucible_pantry b217d3a5-4ebb-45e3-b5be-2ebb2c57d8fa expunged ⏳ fd00:1122:3344:102::23 - internal_dns 0efed95e-f052-4535-b45a-fac1148c0e6a expunged ⏳ fd00:1122:3344:3::1 - internal_ntp 61a79cb4-7fcb-432d-bbe9-3f9882452db2 expunged ⏳ fd00:1122:3344:102::21 - nexus ee146b15-bc59-43a3-9567-bb8596e6188d expunged ⏳ fd00:1122:3344:102::22 - - - COCKROACHDB SETTINGS: state fingerprint::::::::::::::::: (none) cluster.preserve_downgrade_option: (do not modify) diff --git a/nexus/src/app/background/tasks/decommissioned_disk_cleaner.rs b/nexus/src/app/background/tasks/decommissioned_disk_cleaner.rs index e5e21f5ea9..b940a759a7 100644 --- a/nexus/src/app/background/tasks/decommissioned_disk_cleaner.rs +++ b/nexus/src/app/background/tasks/decommissioned_disk_cleaner.rs @@ -278,6 +278,7 @@ mod tests { zpool_id: ZpoolUuid, dataset_id: DatasetUuid, region_id: RegionUuid, + disk_id: PhysicalDiskUuid, } impl TestFixture { @@ -301,7 +302,7 @@ mod tests { .await .unwrap(); - Self { zpool_id, dataset_id, region_id } + Self { zpool_id, dataset_id, region_id, disk_id } } async fn delete_region(&self, datastore: &DataStore) { @@ -397,7 +398,7 @@ mod tests { let mut task = DecommissionedDiskCleaner::new(datastore.clone(), false); datastore - .physical_disk_decommission_all_expunged(&opctx) + .physical_disk_decommission(&opctx, fixture.disk_id) .await .unwrap(); @@ -431,9 +432,10 @@ mod tests { let mut task = DecommissionedDiskCleaner::new(datastore.clone(), false); datastore - .physical_disk_decommission_all_expunged(&opctx) + .physical_disk_decommission(&opctx, fixture.disk_id) .await .unwrap(); + fixture.delete_region(&datastore).await; // Setup: Disk is decommissioned and has no regions. diff --git a/nexus/types/src/deployment.rs b/nexus/types/src/deployment.rs index 41d0ac9434..b597282f9a 100644 --- a/nexus/types/src/deployment.rs +++ b/nexus/types/src/deployment.rs @@ -256,6 +256,24 @@ impl Blueprint { .filter(move |(_, z)| filter(z.disposition)) } + /// Iterate over the [`BlueprintPhysicalDiskConfig`] instances in the + /// blueprint that match the provided filter, along with the associated + /// sled id. + pub fn all_omicron_disks( + &self, + mut filter: F, + ) -> impl Iterator + where + F: FnMut(BlueprintPhysicalDiskDisposition) -> bool, + { + self.blueprint_disks + .iter() + .flat_map(move |(sled_id, disks)| { + disks.disks.iter().map(|disk| (*sled_id, disk)) + }) + .filter(move |(_, d)| filter(d.disposition)) + } + /// Iterate over the [`BlueprintDatasetsConfig`] instances in the blueprint. pub fn all_omicron_datasets( &self, @@ -298,11 +316,19 @@ impl BpTableData for &BlueprintPhysicalDisksConfig { } fn rows(&self, state: BpDiffState) -> impl Iterator { - let sorted_disk_ids: BTreeSet = - self.disks.iter().map(|d| d.identity.clone()).collect(); + let mut disks: Vec<_> = self.disks.iter().cloned().collect(); + disks.sort_unstable_by_key(|d| d.identity.clone()); - sorted_disk_ids.into_iter().map(move |d| { - BpTableRow::from_strings(state, vec![d.vendor, d.model, d.serial]) + disks.into_iter().map(move |d| { + BpTableRow::from_strings( + state, + vec![ + d.identity.vendor, + d.identity.model, + d.identity.serial, + d.disposition.to_string(), + ], + ) }) } } @@ -869,34 +895,91 @@ pub enum BlueprintDatasetFilter { JsonSchema, Deserialize, Serialize, - EnumIter, Diffable, )] -#[serde(rename_all = "snake_case")] +#[serde(tag = "kind", rename_all = "snake_case")] pub enum BlueprintPhysicalDiskDisposition { /// The physical disk is in-service. InService, /// The physical disk is permanently gone. - Expunged, + Expunged { + /// Generation of the parent config in which this disk became expunged. + as_of_generation: Generation, + + /// True if Reconfiguration knows that this disk has been expunged. + /// + /// In the current implementation, this means either: + /// + /// a) the sled where the disk was residing has been expunged. + /// + /// b) the planner has observed an inventory collection where the + /// disk expungement was seen by the sled agent on the sled where the + /// disk was previously in service. This is indicated by the inventory + /// reporting a disk generation at least as high as `as_of_generation`. + ready_for_cleanup: bool, + }, } impl BlueprintPhysicalDiskDisposition { - /// Returns true if the disk disposition matches this filter. - pub fn matches(self, filter: DiskFilter) -> bool { + /// Always returns true. + /// + /// This is intended for use with methods that take a filtering + /// closure operating on a `BlueprintPhysicalDiskDisposition` (e.g., + /// `Blueprint::all_omicron_disks()`), allowing callers to make it clear + /// they accept any disposition via + /// + /// ```rust,ignore + /// blueprint.all_omicron_disks(BlueprintPhysicalDiskDisposition::any) + /// ``` + pub fn any(self) -> bool { + true + } + + /// Returns true if `self` is `BlueprintZoneDisposition::InService` + pub fn is_in_service(self) -> bool { + matches!(self, Self::InService) + } + + /// Returns true if `self` is `BlueprintPhysicalDiskDisposition::Expunged + /// { .. }`, regardless of the details contained within that variant. + pub fn is_expunged(self) -> bool { + matches!(self, Self::Expunged { .. }) + } + + /// Returns true if `self` is `BlueprintPhysicalDiskDisposition::Expunged + /// {ready_for_cleanup: true, ..}` + pub fn is_ready_for_cleanup(self) -> bool { + matches!(self, Self::Expunged { ready_for_cleanup: true, .. }) + } + + /// Return the generation when a disk was expunged or `None` if the disk + /// was not expunged. + pub fn expunged_as_of_generation(&self) -> Option { match self { - Self::InService => match filter { - DiskFilter::All => true, - DiskFilter::InService => true, - // TODO remove this variant? - DiskFilter::ExpungedButActive => false, - }, - Self::Expunged => match filter { - DiskFilter::All => true, - DiskFilter::InService => false, - // TODO remove this variant? - DiskFilter::ExpungedButActive => true, - }, + BlueprintPhysicalDiskDisposition::Expunged { + as_of_generation, + .. + } => Some(*as_of_generation), + _ => None, + } + } +} + +impl fmt::Display for BlueprintPhysicalDiskDisposition { + 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. + BlueprintPhysicalDiskDisposition::InService => "in service".fmt(f), + BlueprintPhysicalDiskDisposition::Expunged { + ready_for_cleanup: true, + .. + } => "expunged ✓".fmt(f), + BlueprintPhysicalDiskDisposition::Expunged { + ready_for_cleanup: false, + .. + } => "expunged ⏳".fmt(f), } } } @@ -907,6 +990,7 @@ impl BlueprintPhysicalDiskDisposition { )] pub struct BlueprintPhysicalDiskConfig { pub disposition: BlueprintPhysicalDiskDisposition, + #[daft(leaf)] pub identity: DiskIdentity, pub id: PhysicalDiskUuid, pub pool_id: ZpoolUuid, @@ -939,7 +1023,7 @@ impl BlueprintPhysicalDisksConfig { .disks .into_iter() .filter_map(|d| { - if d.disposition.matches(DiskFilter::InService) { + if d.disposition.is_in_service() { Some(d.into()) } else { None diff --git a/nexus/types/src/deployment/blueprint_diff.rs b/nexus/types/src/deployment/blueprint_diff.rs index c43476a353..4a6a919a25 100644 --- a/nexus/types/src/deployment/blueprint_diff.rs +++ b/nexus/types/src/deployment/blueprint_diff.rs @@ -14,16 +14,16 @@ use super::{ unwrap_or_none, zone_sort_key, BlueprintDatasetConfigDiff, BlueprintDatasetDisposition, BlueprintDatasetsConfigDiff, BlueprintDiff, BlueprintMetadata, BlueprintPhysicalDiskConfig, - BlueprintPhysicalDisksConfigDiff, BlueprintZoneConfigDiff, - BlueprintZonesConfigDiff, ClickhouseClusterConfig, + BlueprintPhysicalDiskConfigDiff, BlueprintPhysicalDisksConfigDiff, + BlueprintZoneConfigDiff, BlueprintZonesConfigDiff, ClickhouseClusterConfig, CockroachDbPreserveDowngrade, }; use daft::Diffable; use nexus_sled_agent_shared::inventory::ZoneKind; use omicron_common::api::external::{ByteCount, Generation}; -use omicron_common::disk::{CompressionAlgorithm, DatasetName, DiskIdentity}; +use omicron_common::disk::{CompressionAlgorithm, DatasetName}; use omicron_uuid_kinds::SledUuid; -use omicron_uuid_kinds::{DatasetUuid, OmicronZoneUuid}; +use omicron_uuid_kinds::{DatasetUuid, OmicronZoneUuid, PhysicalDiskUuid}; use std::collections::{BTreeMap, BTreeSet}; use std::fmt::{self, Write as _}; @@ -516,6 +516,26 @@ impl<'a> BlueprintDiffSummary<'a> { )) } + /// Iterate over all modified disks on a sled + pub fn modified_disks( + &'a self, + sled_id: &SledUuid, + ) -> Option<(BpDiffPhysicalDisksModified<'a>, BpDiffPhysicalDiskErrors)> + { + // Check if the sled is modified and there are any modified disks + let disks_cfg_diff = self.modified_disks_diff.get(sled_id)?; + let mut modified_disks = + disks_cfg_diff.disks.modified_values_diff().peekable(); + if modified_disks.peek().is_none() { + return None; + } + Some(BpDiffPhysicalDisksModified::new( + *disks_cfg_diff.generation.before, + *disks_cfg_diff.generation.after, + modified_disks, + )) + } + /// Iterate over all added datasets on a sled pub fn added_datasets( &self, @@ -916,7 +936,7 @@ pub struct DiffPhysicalDisksDetails { pub after_generation: Option, // Disks added, removed, or unmodified - pub disks: Vec, + pub disks: Vec, } impl DiffPhysicalDisksDetails { @@ -925,11 +945,8 @@ impl DiffPhysicalDisksDetails { 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(); + let mut disks: Vec<_> = disks_iter.cloned().collect(); + disks.sort_unstable_by_key(|d| d.identity.clone()); DiffPhysicalDisksDetails { before_generation, after_generation, disks } } } @@ -946,21 +963,160 @@ impl BpTableData for DiffPhysicalDisksDetails { self.disks.iter().map(move |d| { BpTableRow::from_strings( state, - vec![d.vendor.clone(), d.model.clone(), d.serial.clone()], + vec![ + d.identity.vendor.clone(), + d.identity.model.clone(), + d.identity.serial.clone(), + d.disposition.to_string(), + ], + ) + }) + } +} + +/// Errors arising from illegally modified physical disk fields +#[derive(Debug)] +pub struct BpDiffPhysicalDiskErrors { + pub generation_before: Generation, + pub generation_after: Generation, + pub errors: Vec, +} + +#[derive(Debug)] +pub struct BpDiffPhysicalDiskError { + pub disk_id: PhysicalDiskUuid, + pub reason: String, +} + +/// This is just an error parsed diff (Parse don't validate) +/// +/// We still just want the underlying diff representation for printing +#[derive(Debug)] +pub struct ModifiedPhysicalDisk<'a> { + pub diff: BlueprintPhysicalDiskConfigDiff<'a>, +} + +impl<'a> ModifiedPhysicalDisk<'a> { + pub fn from_diff( + diff: BlueprintPhysicalDiskConfigDiff<'a>, + ) -> Result { + // Do we have any errors? If so, create a "reason" string. + let mut reason = String::new(); + + let BlueprintPhysicalDiskConfigDiff { + disposition: _, + identity, + id, + pool_id, + } = diff; + + // If we're a "modified" disk, 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); + + if identity.is_modified() { + writeln!( + &mut reason, + "mismatched identity: before: {:?}, after: {:?}", + identity.before, identity.after + ) + .expect("write to String is infallible"); + } + + if pool_id.is_modified() { + writeln!( + &mut reason, + "mismatched zpool: before: {}, after: {}", + pool_id.before, pool_id.after + ) + .expect("write to String is infallible"); + } + + if reason.is_empty() { + Ok(ModifiedPhysicalDisk { diff }) + } else { + Err(BpDiffPhysicalDiskError { disk_id: *id.before, reason }) + } + } +} + +#[derive(Debug)] +pub struct BpDiffPhysicalDisksModified<'a> { + pub generation_before: Generation, + pub generation_after: Generation, + pub disks: Vec>, +} + +impl<'a> BpDiffPhysicalDisksModified<'a> { + pub fn new( + generation_before: Generation, + generation_after: Generation, + disk_diffs: impl Iterator>, + ) -> (BpDiffPhysicalDisksModified<'a>, BpDiffPhysicalDiskErrors) { + let mut disks = vec![]; + let mut errors = vec![]; + for diff in disk_diffs { + match ModifiedPhysicalDisk::from_diff(diff) { + Ok(modified_disk) => disks.push(modified_disk), + Err(error) => errors.push(error), + } + } + disks.sort_unstable_by_key(|d| d.diff.identity.before.clone()); + ( + BpDiffPhysicalDisksModified { + generation_before, + generation_after, + disks, + }, + BpDiffPhysicalDiskErrors { + generation_before, + generation_after, + errors, + }, + ) + } +} + +impl BpTableData for BpDiffPhysicalDisksModified<'_> { + fn bp_generation(&self) -> BpGeneration { + BpGeneration::Diff { + before: Some(self.generation_before), + after: Some(self.generation_after), + } + } + + fn rows(&self, state: BpDiffState) -> impl Iterator { + self.disks.iter().map(move |disk| { + let identity = disk.diff.identity.before; + let disposition = disk.diff.disposition; + BpTableRow::new( + state, + vec![ + BpTableColumn::value(identity.vendor.clone()), + BpTableColumn::value(identity.model.clone()), + BpTableColumn::value(identity.serial.clone()), + BpTableColumn::new( + disposition.before.to_string(), + disposition.after.to_string(), + ), + ], ) }) } } #[derive(Debug, Default)] -pub struct BpDiffPhysicalDisks { +pub struct BpDiffPhysicalDisks<'a> { pub added: BTreeMap, pub removed: BTreeMap, pub unchanged: BTreeMap, + pub modified: BTreeMap>, + pub errors: BTreeMap, } -impl BpDiffPhysicalDisks { - pub fn from_diff_summary(summary: &BlueprintDiffSummary<'_>) -> Self { +impl<'a> BpDiffPhysicalDisks<'a> { + pub fn from_diff_summary(summary: &'a BlueprintDiffSummary<'a>) -> Self { let mut diffs = BpDiffPhysicalDisks::default(); for sled_id in &summary.all_sleds { if let Some(added) = summary.added_disks(sled_id) { @@ -972,6 +1128,12 @@ impl BpDiffPhysicalDisks { if let Some(unchanged) = summary.unchanged_disks(sled_id) { diffs.unchanged.insert(*sled_id, unchanged); } + if let Some((modified, errors)) = summary.modified_disks(sled_id) { + diffs.modified.insert(*sled_id, modified); + if !errors.errors.is_empty() { + diffs.errors.insert(*sled_id, errors); + } + } } diffs } @@ -990,6 +1152,11 @@ impl BpDiffPhysicalDisks { rows.extend(diff.rows(BpDiffState::Removed)); } + if let Some(diff) = self.modified.get(sled_id) { + generation = diff.bp_generation(); + rows.extend(diff.rows(BpDiffState::Modified)); + } + if let Some(diff) = self.added.get(sled_id) { // Generations never vary for the same sled, so this is harmless generation = diff.bp_generation(); @@ -1716,7 +1883,7 @@ pub struct BlueprintDiffDisplay<'diff> { before_meta: BlueprintMetadata, after_meta: BlueprintMetadata, zones: BpDiffZones, - disks: BpDiffPhysicalDisks, + disks: BpDiffPhysicalDisks<'diff>, datasets: BpDiffDatasets, } @@ -1987,6 +2154,24 @@ impl fmt::Display for BlueprintDiffDisplay<'_> { } } + // Write out disk errors. + if !self.disks.errors.is_empty() { + writeln!(f, "DISK ERRORS:")?; + for (sled_id, errors) in &self.disks.errors { + writeln!(f, "\n sled {sled_id}\n")?; + writeln!( + f, + " disk diff errors: before gen {}, after gen {}\n", + errors.generation_before, errors.generation_after + )?; + + for err in &errors.errors { + writeln!(f, " disk id: {}", err.disk_id)?; + writeln!(f, " reason: {}", err.reason)?; + } + } + } + // Write out dataset errors. if !self.datasets.errors.is_empty() { writeln!(f, "DATASET ERRORS:")?; diff --git a/nexus/types/src/deployment/blueprint_display.rs b/nexus/types/src/deployment/blueprint_display.rs index 2cf664e0c1..bd5c95b0fb 100644 --- a/nexus/types/src/deployment/blueprint_display.rs +++ b/nexus/types/src/deployment/blueprint_display.rs @@ -332,7 +332,7 @@ impl BpTableSchema for BpPhysicalDisksTableSchema { } fn column_names(&self) -> &'static [&'static str] { - &["vendor", "model", "serial"] + &["vendor", "model", "serial", "disposition"] } } diff --git a/nexus/types/src/deployment/planning_input.rs b/nexus/types/src/deployment/planning_input.rs index 19ab656005..4f22b4d9b2 100644 --- a/nexus/types/src/deployment/planning_input.rs +++ b/nexus/types/src/deployment/planning_input.rs @@ -508,9 +508,6 @@ pub enum DiskFilter { /// All disks which are in-service. InService, - - /// All disks which are expunged but still active. - ExpungedButActive, } impl DiskFilter { @@ -530,12 +527,10 @@ impl PhysicalDiskPolicy { PhysicalDiskPolicy::InService => match filter { DiskFilter::All => true, DiskFilter::InService => true, - DiskFilter::ExpungedButActive => false, }, PhysicalDiskPolicy::Expunged => match filter { DiskFilter::All => true, DiskFilter::InService => false, - DiskFilter::ExpungedButActive => true, }, } } @@ -557,12 +552,10 @@ impl PhysicalDiskState { PhysicalDiskState::Active => match filter { DiskFilter::All => true, DiskFilter::InService => true, - DiskFilter::ExpungedButActive => true, }, PhysicalDiskState::Decommissioned => match filter { DiskFilter::All => true, DiskFilter::InService => false, - DiskFilter::ExpungedButActive => false, }, } } @@ -988,6 +981,8 @@ pub enum PlanningInputBuildError { #[source] err: SourceNatConfigError, }, + #[error("sled not found: {0}")] + SledNotFound(SledUuid), } /// Constructor for [`PlanningInput`]. @@ -1057,6 +1052,26 @@ impl PlanningInputBuilder { } } + /// Expunge a sled and all its disks + /// + /// In the real code, the `PlanningInput` comes from the database. In this + /// case all disks in a sled are marked expunged when the sled is expunged + /// inside a transaction. We do the same thing here for testing purposes. + pub fn expunge_sled( + &mut self, + sled_id: &SledUuid, + ) -> Result<(), PlanningInputBuildError> { + let sled_details = self + .sleds_mut() + .get_mut(&sled_id) + .ok_or(PlanningInputBuildError::SledNotFound(*sled_id))?; + sled_details.policy = SledPolicy::Expunged; + for (_, sled_disk) in sled_details.resources.zpools.iter_mut() { + sled_disk.policy = PhysicalDiskPolicy::Expunged; + } + Ok(()) + } + pub fn add_omicron_zone_external_ip( &mut self, zone_id: OmicronZoneUuid, diff --git a/nexus/types/src/external_api/views.rs b/nexus/types/src/external_api/views.rs index ce1387330c..02aaffd3cc 100644 --- a/nexus/types/src/external_api/views.rs +++ b/nexus/types/src/external_api/views.rs @@ -868,6 +868,7 @@ impl fmt::Display for PhysicalDiskPolicy { PartialEq, Eq, EnumIter, + Diffable, )] #[serde(rename_all = "snake_case")] pub enum PhysicalDiskState { diff --git a/openapi/nexus-internal.json b/openapi/nexus-internal.json index 65fcd7e3dc..e9f29a1dd9 100644 --- a/openapi/nexus-internal.json +++ b/openapi/nexus-internal.json @@ -2173,16 +2173,46 @@ "oneOf": [ { "description": "The physical disk is in-service.", - "type": "string", - "enum": [ - "in_service" + "type": "object", + "properties": { + "kind": { + "type": "string", + "enum": [ + "in_service" + ] + } + }, + "required": [ + "kind" ] }, { "description": "The physical disk is permanently gone.", - "type": "string", - "enum": [ - "expunged" + "type": "object", + "properties": { + "as_of_generation": { + "description": "Generation of the parent config in which this disk became expunged.", + "allOf": [ + { + "$ref": "#/components/schemas/Generation" + } + ] + }, + "kind": { + "type": "string", + "enum": [ + "expunged" + ] + }, + "ready_for_cleanup": { + "description": "True if Reconfiguration knows that this disk has been expunged.\n\nIn the current implementation, this means either:\n\na) the sled where the disk was residing has been expunged.\n\nb) the planner has observed an inventory collection where the disk expungement was seen by the sled agent on the sled where the disk was previously in service. This is indicated by the inventory reporting a disk generation at least as high as `as_of_generation`.", + "type": "boolean" + } + }, + "required": [ + "as_of_generation", + "kind", + "ready_for_cleanup" ] } ] diff --git a/schema/crdb/bp-disk-disposition-expunged-cleanup/up1.sql b/schema/crdb/bp-disk-disposition-expunged-cleanup/up1.sql new file mode 100644 index 0000000000..87ed52397c --- /dev/null +++ b/schema/crdb/bp-disk-disposition-expunged-cleanup/up1.sql @@ -0,0 +1,2 @@ +ALTER TABLE omicron.public.bp_omicron_physical_disk + ADD COLUMN IF NOT EXISTS disposition_expunged_as_of_generation INT; diff --git a/schema/crdb/bp-disk-disposition-expunged-cleanup/up2.sql b/schema/crdb/bp-disk-disposition-expunged-cleanup/up2.sql new file mode 100644 index 0000000000..31cfc9fc2b --- /dev/null +++ b/schema/crdb/bp-disk-disposition-expunged-cleanup/up2.sql @@ -0,0 +1,10 @@ +SET LOCAL disallow_full_table_scans = off; +UPDATE omicron.public.bp_omicron_physical_disk + SET disposition_expunged_as_of_generation = ( + SELECT generation + FROM omicron.public.bp_sled_omicron_physical_disks + WHERE + blueprint_id = omicron.public.bp_omicron_physical_disk.blueprint_id + AND sled_id = omicron.public.bp_omicron_physical_disk.sled_id + ) + WHERE disposition = 'expunged'; diff --git a/schema/crdb/bp-disk-disposition-expunged-cleanup/up3.sql b/schema/crdb/bp-disk-disposition-expunged-cleanup/up3.sql new file mode 100644 index 0000000000..501da394c6 --- /dev/null +++ b/schema/crdb/bp-disk-disposition-expunged-cleanup/up3.sql @@ -0,0 +1,3 @@ +ALTER TABLE omicron.public.bp_omicron_physical_disk + ADD COLUMN IF NOT EXISTS + disposition_expunged_ready_for_cleanup BOOL NOT NULL DEFAULT false; diff --git a/schema/crdb/bp-disk-disposition-expunged-cleanup/up4.sql b/schema/crdb/bp-disk-disposition-expunged-cleanup/up4.sql new file mode 100644 index 0000000000..3790ddd7de --- /dev/null +++ b/schema/crdb/bp-disk-disposition-expunged-cleanup/up4.sql @@ -0,0 +1,2 @@ +ALTER TABLE omicron.public.bp_omicron_physical_disk + ALTER COLUMN disposition_expunged_ready_for_cleanup DROP DEFAULT; diff --git a/schema/crdb/bp-disk-disposition-expunged-cleanup/up5.sql b/schema/crdb/bp-disk-disposition-expunged-cleanup/up5.sql new file mode 100644 index 0000000000..4fabf6e2e9 --- /dev/null +++ b/schema/crdb/bp-disk-disposition-expunged-cleanup/up5.sql @@ -0,0 +1,9 @@ +ALTER TABLE omicron.public.bp_omicron_physical_disk +ADD CONSTRAINT IF NOT EXISTS expunged_disposition_properties CHECK ( + (disposition != 'expunged' + AND disposition_expunged_as_of_generation IS NULL + AND NOT disposition_expunged_ready_for_cleanup) + OR + (disposition = 'expunged' + AND disposition_expunged_as_of_generation IS NOT NULL) +); diff --git a/schema/crdb/dbinit.sql b/schema/crdb/dbinit.sql index b24d44a9be..e5a8f79dce 100644 --- a/schema/crdb/dbinit.sql +++ b/schema/crdb/dbinit.sql @@ -3823,7 +3823,20 @@ CREATE TABLE IF NOT EXISTS omicron.public.bp_omicron_physical_disk ( disposition omicron.public.bp_physical_disk_disposition NOT NULL, - PRIMARY KEY (blueprint_id, id) + -- Specific properties of the `expunged` disposition + disposition_expunged_as_of_generation INT, + disposition_expunged_ready_for_cleanup BOOL NOT NULL, + + PRIMARY KEY (blueprint_id, id), + + CONSTRAINT expunged_disposition_properties CHECK ( + (disposition != 'expunged' + AND disposition_expunged_as_of_generation IS NULL + AND NOT disposition_expunged_ready_for_cleanup) + OR + (disposition = 'expunged' + AND disposition_expunged_as_of_generation IS NOT NULL) + ) ); -- description of a collection of omicron datasets stored in a blueprint @@ -4969,7 +4982,7 @@ INSERT INTO omicron.public.db_metadata ( version, target_version ) VALUES - (TRUE, NOW(), NOW(), '126.0.0', NULL) + (TRUE, NOW(), NOW(), '127.0.0', NULL) ON CONFLICT DO NOTHING; COMMIT;