diff --git a/dev-tools/omdb/src/bin/omdb/nexus.rs b/dev-tools/omdb/src/bin/omdb/nexus.rs index d11f18a321..38bd616da9 100644 --- a/dev-tools/omdb/src/bin/omdb/nexus.rs +++ b/dev-tools/omdb/src/bin/omdb/nexus.rs @@ -51,6 +51,8 @@ use nexus_types::internal_api::background::RegionSnapshotReplacementFinishStatus use nexus_types::internal_api::background::RegionSnapshotReplacementGarbageCollectStatus; use nexus_types::internal_api::background::RegionSnapshotReplacementStartStatus; use nexus_types::internal_api::background::RegionSnapshotReplacementStepStatus; +use nexus_types::internal_api::background::SupportBundleCleanupReport; +use nexus_types::internal_api::background::SupportBundleCollectionReport; use nexus_types::inventory::BaseboardId; use omicron_uuid_kinds::BlueprintUuid; use omicron_uuid_kinds::CollectionUuid; @@ -889,6 +891,9 @@ fn print_task_details(bgtask: &BackgroundTask, details: &serde_json::Value) { "blueprint_loader" => { print_task_blueprint_loader(details); } + "decommissioned_disk_cleaner" => { + print_task_decommissioned_disk_cleaner(details); + } "dns_config_external" | "dns_config_internal" => { print_task_dns_config(details); } @@ -943,6 +948,9 @@ fn print_task_details(bgtask: &BackgroundTask, details: &serde_json::Value) { "service_firewall_rule_propagation" => { print_task_service_firewall_rule_propagation(details); } + "support_bundle_collector" => { + print_task_support_bundle_collector(details); + } _ => { println!( "warning: unknown background task: {:?} \ @@ -1107,6 +1115,37 @@ fn print_task_blueprint_loader(details: &serde_json::Value) { } } +fn print_task_decommissioned_disk_cleaner(details: &serde_json::Value) { + #[derive(Deserialize)] + struct ActivationResult { + error: Option, + found: usize, + not_ready_to_be_deleted: usize, + deleted: usize, + error_count: usize, + } + match serde_json::from_value::(details.clone()) { + Err(error) => eprintln!( + "warning: failed to interpret task details: {:?}: {:?}", + error, details + ), + Ok(ActivationResult { + error, + found, + not_ready_to_be_deleted, + deleted, + error_count, + }) => { + println!(" Decommissioned Disk Cleaner"); + println!(" Last error: {error:?}"); + println!(" Zpools found: {found}"); + println!(" Zpools deleted from db: {deleted}"); + println!(" Zpools not ready to be deleted from db: {not_ready_to_be_deleted}"); + println!(" Zpools which failed to delete: {error_count}"); + } + } +} + fn print_task_dns_config(details: &serde_json::Value) { // The "dns_config" tasks emit the generation number of the config that // they read. @@ -2024,6 +2063,66 @@ fn print_task_service_firewall_rule_propagation(details: &serde_json::Value) { }; } +fn print_task_support_bundle_collector(details: &serde_json::Value) { + #[derive(Deserialize)] + struct SupportBundleCollectionStatus { + cleanup_report: Option, + cleanup_err: Option, + collection_report: Option, + collection_err: Option, + } + + match serde_json::from_value::( + details.clone(), + ) { + Err(error) => eprintln!( + "warning: failed to interpret task details: {:?}: {:?}", + error, details + ), + Ok(SupportBundleCollectionStatus { + cleanup_report, + cleanup_err, + collection_report, + collection_err, + }) => { + if let Some(cleanup_err) = cleanup_err { + println!(" failed to perform cleanup: {cleanup_err}"); + } + if let Some(SupportBundleCleanupReport { + sled_bundles_deleted_ok, + sled_bundles_deleted_not_found, + sled_bundles_delete_failed, + db_destroying_bundles_removed, + db_failing_bundles_updated, + }) = cleanup_report + { + println!(" Support Bundle Cleanup Report:"); + println!(" Bundles deleted from sleds: {sled_bundles_deleted_ok}"); + println!(" Bundles not found on sleds: {sled_bundles_deleted_not_found}"); + println!(" Bundles delete failed on sleds: {sled_bundles_delete_failed}"); + println!(" Bundles deleted from database: {db_destroying_bundles_removed}"); + println!(" Bundles marked failed in database: {db_failing_bundles_updated}"); + } + + if let Some(collection_err) = collection_err { + println!(" failed to perform collection: {collection_err}"); + } + + if let Some(SupportBundleCollectionReport { + bundle, + listed_in_service_sleds, + activated_in_db_ok, + }) = collection_report + { + println!(" Support Bundle Collection Report:"); + println!(" Bundle ID: {bundle}"); + println!(" Bundle was able to list in-service sleds: {listed_in_service_sleds}"); + println!(" Bundle was activated in the database: {activated_in_db_ok}"); + } + } + } +} + /// Summarizes an `ActivationReason` fn reason_str(reason: &ActivationReason) -> &'static str { match reason { diff --git a/dev-tools/omdb/tests/successes.out b/dev-tools/omdb/tests/successes.out index 09a4bb70c5..edaf163390 100644 --- a/dev-tools/omdb/tests/successes.out +++ b/dev-tools/omdb/tests/successes.out @@ -523,7 +523,12 @@ task: "decommissioned_disk_cleaner" currently executing: no last completed activation: , triggered by a periodic timer firing started at (s ago) and ran for ms -warning: unknown background task: "decommissioned_disk_cleaner" (don't know how to interpret details: Object {"deleted": Number(0), "error": Null, "error_count": Number(0), "found": Number(0), "not_ready_to_be_deleted": Number(0)}) + Decommissioned Disk Cleaner + Last error: None + Zpools found: 0 + Zpools deleted from db: 0 + Zpools not ready to be deleted from db: 0 + Zpools which failed to delete: 0 task: "external_endpoints" configured period: every m @@ -715,7 +720,12 @@ task: "support_bundle_collector" currently executing: no last completed activation: , triggered by a periodic timer firing started at (s ago) and ran for ms -warning: unknown background task: "support_bundle_collector" (don't know how to interpret details: Object {"cleanup_err": Null, "cleanup_report": Object {"db_destroying_bundles_removed": Number(0), "db_failing_bundles_updated": Number(0), "sled_bundles_delete_failed": Number(0), "sled_bundles_deleted_not_found": Number(0), "sled_bundles_deleted_ok": Number(0)}, "collection_err": Null, "collection_report": Null}) + Support Bundle Cleanup Report: + Bundles deleted from sleds: 0 + Bundles not found on sleds: 0 + Bundles delete failed on sleds: 0 + Bundles deleted from database: 0 + Bundles marked failed in database: 0 task: "switch_port_config_manager" configured period: every s @@ -982,7 +992,12 @@ task: "decommissioned_disk_cleaner" currently executing: no last completed activation: , triggered by a periodic timer firing started at (s ago) and ran for ms -warning: unknown background task: "decommissioned_disk_cleaner" (don't know how to interpret details: Object {"deleted": Number(0), "error": Null, "error_count": Number(0), "found": Number(0), "not_ready_to_be_deleted": Number(0)}) + Decommissioned Disk Cleaner + Last error: None + Zpools found: 0 + Zpools deleted from db: 0 + Zpools not ready to be deleted from db: 0 + Zpools which failed to delete: 0 task: "external_endpoints" configured period: every m @@ -1174,7 +1189,12 @@ task: "support_bundle_collector" currently executing: no last completed activation: , triggered by a periodic timer firing started at (s ago) and ran for ms -warning: unknown background task: "support_bundle_collector" (don't know how to interpret details: Object {"cleanup_err": Null, "cleanup_report": Object {"db_destroying_bundles_removed": Number(0), "db_failing_bundles_updated": Number(0), "sled_bundles_delete_failed": Number(0), "sled_bundles_deleted_not_found": Number(0), "sled_bundles_deleted_ok": Number(0)}, "collection_err": Null, "collection_report": Null}) + Support Bundle Cleanup Report: + Bundles deleted from sleds: 0 + Bundles not found on sleds: 0 + Bundles delete failed on sleds: 0 + Bundles deleted from database: 0 + Bundles marked failed in database: 0 task: "switch_port_config_manager" configured period: every s