From e6029bbd98122bed366776e1c6d14ac0321aee8f Mon Sep 17 00:00:00 2001 From: David Pacheco Date: Thu, 14 Mar 2024 08:26:07 -0700 Subject: [PATCH 1/5] rename SILO_ID -> DEFAULT_SILO_ID (#5264) --- nexus/db-queries/src/db/datastore/mod.rs | 16 +++++++------- nexus/db-queries/src/db/fixed_data/silo.rs | 4 ++-- .../db-queries/src/db/fixed_data/silo_user.rs | 6 +++--- nexus/reconfigurator/execution/src/dns.rs | 4 ++-- nexus/src/app/external_endpoints.rs | 4 ++-- nexus/tests/integration_tests/authn_http.rs | 4 ++-- nexus/tests/integration_tests/disks.rs | 10 ++++----- nexus/tests/integration_tests/instances.rs | 4 ++-- nexus/tests/integration_tests/metrics.rs | 21 ++++++++++++------- nexus/tests/integration_tests/silo_users.rs | 9 +++++--- nexus/tests/integration_tests/silos.rs | 12 +++++------ 11 files changed, 52 insertions(+), 42 deletions(-) diff --git a/nexus/db-queries/src/db/datastore/mod.rs b/nexus/db-queries/src/db/datastore/mod.rs index 475fb27df1..b2b564cc09 100644 --- a/nexus/db-queries/src/db/datastore/mod.rs +++ b/nexus/db-queries/src/db/datastore/mod.rs @@ -380,7 +380,7 @@ mod test { }; use crate::db::explain::ExplainableAsync; use crate::db::fixed_data::silo::DEFAULT_SILO; - use crate::db::fixed_data::silo::SILO_ID; + use crate::db::fixed_data::silo::DEFAULT_SILO_ID; use crate::db::identity::Asset; use crate::db::lookup::LookupPath; use crate::db::model::{ @@ -499,8 +499,8 @@ mod test { // Associate silo with user let authz_silo = authz::Silo::new( authz::FLEET, - *SILO_ID, - LookupType::ById(*SILO_ID), + *DEFAULT_SILO_ID, + LookupType::ById(*DEFAULT_SILO_ID), ); datastore .silo_user_create( @@ -519,7 +519,7 @@ mod test { .fetch() .await .unwrap(); - assert_eq!(*SILO_ID, db_silo_user.silo_id); + assert_eq!(*DEFAULT_SILO_ID, db_silo_user.silo_id); // fetch the one we just created let (.., fetched) = LookupPath::new(&opctx, &datastore) @@ -577,7 +577,7 @@ mod test { Arc::new(authz::Authz::new(&logctx.log)), authn::Context::for_test_user( silo_user_id, - *SILO_ID, + *DEFAULT_SILO_ID, SiloAuthnPolicy::try_from(&*DEFAULT_SILO).unwrap(), ), Arc::clone(&datastore), @@ -1381,8 +1381,8 @@ mod test { // Create a new Silo user so that we can lookup their keys. let authz_silo = authz::Silo::new( authz::FLEET, - *SILO_ID, - LookupType::ById(*SILO_ID), + *DEFAULT_SILO_ID, + LookupType::ById(*DEFAULT_SILO_ID), ); let silo_user_id = Uuid::new_v4(); datastore @@ -1432,7 +1432,7 @@ mod test { .fetch() .await .unwrap(); - assert_eq!(authz_silo.id(), *SILO_ID); + assert_eq!(authz_silo.id(), *DEFAULT_SILO_ID); assert_eq!(authz_silo_user.id(), silo_user_id); assert_eq!(found.silo_user_id, ssh_key.silo_user_id); assert_eq!(found.public_key, ssh_key.public_key); diff --git a/nexus/db-queries/src/db/fixed_data/silo.rs b/nexus/db-queries/src/db/fixed_data/silo.rs index 62bcc61c1e..dc5f19fc2f 100644 --- a/nexus/db-queries/src/db/fixed_data/silo.rs +++ b/nexus/db-queries/src/db/fixed_data/silo.rs @@ -7,7 +7,7 @@ use nexus_types::external_api::{params, shared}; use omicron_common::api::external::IdentityMetadataCreateParams; use once_cell::sync::Lazy; -pub static SILO_ID: Lazy = Lazy::new(|| { +pub static DEFAULT_SILO_ID: Lazy = Lazy::new(|| { "001de000-5110-4000-8000-000000000000" .parse() .expect("invalid uuid for builtin silo id") @@ -19,7 +19,7 @@ pub static SILO_ID: Lazy = Lazy::new(|| { /// remove it per omicron#2305. pub static DEFAULT_SILO: Lazy = Lazy::new(|| { db::model::Silo::new_with_id( - *SILO_ID, + *DEFAULT_SILO_ID, params::SiloCreate { identity: IdentityMetadataCreateParams { name: "default-silo".parse().unwrap(), diff --git a/nexus/db-queries/src/db/fixed_data/silo_user.rs b/nexus/db-queries/src/db/fixed_data/silo_user.rs index b5253b68e3..eb49093152 100644 --- a/nexus/db-queries/src/db/fixed_data/silo_user.rs +++ b/nexus/db-queries/src/db/fixed_data/silo_user.rs @@ -15,7 +15,7 @@ use once_cell::sync::Lazy; // not automatically at Nexus startup. See omicron#2305. pub static USER_TEST_PRIVILEGED: Lazy = Lazy::new(|| { db::model::SiloUser::new( - *db::fixed_data::silo::SILO_ID, + *db::fixed_data::silo::DEFAULT_SILO_ID, // "4007" looks a bit like "root". "001de000-05e4-4000-8000-000000004007".parse().unwrap(), "privileged".into(), @@ -39,7 +39,7 @@ pub static ROLE_ASSIGNMENTS_PRIVILEGED: Lazy> = db::model::IdentityType::SiloUser, USER_TEST_PRIVILEGED.id(), role_builtin::SILO_ADMIN.resource_type, - *db::fixed_data::silo::SILO_ID, + *db::fixed_data::silo::DEFAULT_SILO_ID, role_builtin::SILO_ADMIN.role_name, ), ] @@ -52,7 +52,7 @@ pub static ROLE_ASSIGNMENTS_PRIVILEGED: Lazy> = pub static USER_TEST_UNPRIVILEGED: Lazy = Lazy::new(|| { db::model::SiloUser::new( - *db::fixed_data::silo::SILO_ID, + *db::fixed_data::silo::DEFAULT_SILO_ID, // 60001 is the decimal uid for "nobody" on Helios. "001de000-05e4-4000-8000-000000060001".parse().unwrap(), "unprivileged".into(), diff --git a/nexus/reconfigurator/execution/src/dns.rs b/nexus/reconfigurator/execution/src/dns.rs index 9e0434c59f..6133da6428 100644 --- a/nexus/reconfigurator/execution/src/dns.rs +++ b/nexus/reconfigurator/execution/src/dns.rs @@ -15,7 +15,7 @@ use nexus_db_model::Silo; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::datastore::Discoverability; use nexus_db_queries::db::datastore::DnsVersionUpdateBuilder; -use nexus_db_queries::db::fixed_data::silo::SILO_ID; +use nexus_db_queries::db::fixed_data::silo::DEFAULT_SILO_ID; use nexus_db_queries::db::DataStore; use nexus_types::deployment::Blueprint; use nexus_types::deployment::OmicronZoneType; @@ -72,7 +72,7 @@ pub(crate) async fn deploy_dns( .internal_context("listing Silos (for configuring external DNS)")? .into_iter() // We do not generate a DNS name for the "default" Silo. - .filter(|silo| silo.id() != *SILO_ID) + .filter(|silo| silo.id() != *DEFAULT_SILO_ID) .collect::>(); let (nexus_external_ips, nexus_external_dns_zones) = diff --git a/nexus/src/app/external_endpoints.rs b/nexus/src/app/external_endpoints.rs index 25a9dd4e6c..db87632bbf 100644 --- a/nexus/src/app/external_endpoints.rs +++ b/nexus/src/app/external_endpoints.rs @@ -35,7 +35,7 @@ use nexus_db_model::Certificate; use nexus_db_model::DnsGroup; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::datastore::Discoverability; -use nexus_db_queries::db::fixed_data::silo::SILO_ID; +use nexus_db_queries::db::fixed_data::silo::DEFAULT_SILO_ID; use nexus_db_queries::db::model::ServiceKind; use nexus_db_queries::db::DataStore; use nexus_reconfigurator_execution::silo_dns_name; @@ -225,7 +225,7 @@ impl ExternalEndpoints { .filter(|s| { // Ignore the built-in Silo, which people are not supposed to // log into. - s.id() != *SILO_ID + s.id() != *DEFAULT_SILO_ID }) .find(|s| s.authentication_mode == AuthenticationMode::Local) .and_then(|s| { diff --git a/nexus/tests/integration_tests/authn_http.rs b/nexus/tests/integration_tests/authn_http.rs index 1b1286c7a6..51bfa08ce2 100644 --- a/nexus/tests/integration_tests/authn_http.rs +++ b/nexus/tests/integration_tests/authn_http.rs @@ -26,7 +26,7 @@ use nexus_db_queries::authn::external::spoof::SPOOF_SCHEME_NAME; use nexus_db_queries::authn::external::AuthenticatorContext; use nexus_db_queries::authn::external::HttpAuthnScheme; use nexus_db_queries::authn::external::SiloUserSilo; -use nexus_db_queries::db::fixed_data::silo::SILO_ID; +use nexus_db_queries::db::fixed_data::silo::DEFAULT_SILO_ID; use std::collections::HashMap; use std::sync::Mutex; use uuid::Uuid; @@ -335,7 +335,7 @@ impl SiloUserSilo for WhoamiServerState { silo_user_id.to_string(), "7f927c86-3371-4295-c34a-e3246a4b9c02" ); - Ok(*SILO_ID) + Ok(*DEFAULT_SILO_ID) } } diff --git a/nexus/tests/integration_tests/disks.rs b/nexus/tests/integration_tests/disks.rs index 379042c849..5464d7e589 100644 --- a/nexus/tests/integration_tests/disks.rs +++ b/nexus/tests/integration_tests/disks.rs @@ -11,7 +11,7 @@ use dropshot::HttpErrorResponseBody; use http::method::Method; use http::StatusCode; use nexus_db_queries::context::OpContext; -use nexus_db_queries::db::fixed_data::{silo::SILO_ID, FLEET_ID}; +use nexus_db_queries::db::fixed_data::{silo::DEFAULT_SILO_ID, FLEET_ID}; use nexus_db_queries::db::lookup::LookupPath; use nexus_test_utils::http_testing::AuthnMode; use nexus_test_utils::http_testing::Collection; @@ -1073,7 +1073,7 @@ async fn test_disk_virtual_provisioning_collection( 0 ); let virtual_provisioning_collection = datastore - .virtual_provisioning_collection_get(&opctx, *SILO_ID) + .virtual_provisioning_collection_get(&opctx, *DEFAULT_SILO_ID) .await .unwrap(); assert_eq!( @@ -1137,7 +1137,7 @@ async fn test_disk_virtual_provisioning_collection( 0 ); let virtual_provisioning_collection = datastore - .virtual_provisioning_collection_get(&opctx, *SILO_ID) + .virtual_provisioning_collection_get(&opctx, *DEFAULT_SILO_ID) .await .unwrap(); assert_eq!( @@ -1194,7 +1194,7 @@ async fn test_disk_virtual_provisioning_collection( disk_size ); let virtual_provisioning_collection = datastore - .virtual_provisioning_collection_get(&opctx, *SILO_ID) + .virtual_provisioning_collection_get(&opctx, *DEFAULT_SILO_ID) .await .unwrap(); assert_eq!( @@ -1232,7 +1232,7 @@ async fn test_disk_virtual_provisioning_collection( 0 ); let virtual_provisioning_collection = datastore - .virtual_provisioning_collection_get(&opctx, *SILO_ID) + .virtual_provisioning_collection_get(&opctx, *DEFAULT_SILO_ID) .await .unwrap(); assert_eq!( diff --git a/nexus/tests/integration_tests/instances.rs b/nexus/tests/integration_tests/instances.rs index 0df2b83008..309036256f 100644 --- a/nexus/tests/integration_tests/instances.rs +++ b/nexus/tests/integration_tests/instances.rs @@ -14,7 +14,7 @@ use http::StatusCode; use itertools::Itertools; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::fixed_data::silo::DEFAULT_SILO; -use nexus_db_queries::db::fixed_data::silo::SILO_ID; +use nexus_db_queries::db::fixed_data::silo::DEFAULT_SILO_ID; use nexus_db_queries::db::lookup::LookupPath; use nexus_test_interface::NexusServer; use nexus_test_utils::http_testing::AuthnMode; @@ -1031,7 +1031,7 @@ async fn assert_metrics( ram ); } - for id in &[None, Some(*SILO_ID)] { + for id in &[None, Some(*DEFAULT_SILO_ID)] { assert_eq!( get_latest_system_metric( cptestctx, diff --git a/nexus/tests/integration_tests/metrics.rs b/nexus/tests/integration_tests/metrics.rs index 5f517d49e0..73f11ce49a 100644 --- a/nexus/tests/integration_tests/metrics.rs +++ b/nexus/tests/integration_tests/metrics.rs @@ -6,7 +6,7 @@ use chrono::Utc; use dropshot::test_util::ClientTestContext; use dropshot::ResultsPage; use http::{Method, StatusCode}; -use nexus_db_queries::db::fixed_data::silo::SILO_ID; +use nexus_db_queries::db::fixed_data::silo::DEFAULT_SILO_ID; use nexus_test_utils::http_testing::{AuthnMode, NexusRequest, RequestBuilder}; use nexus_test_utils::resource_helpers::{ create_default_ip_pool, create_disk, create_instance, create_project, @@ -173,7 +173,7 @@ async fn test_metrics( // silo metrics start out zero assert_system_metrics(&cptestctx, None, 0, 0, 0).await; - assert_system_metrics(&cptestctx, Some(*SILO_ID), 0, 0, 0).await; + assert_system_metrics(&cptestctx, Some(*DEFAULT_SILO_ID), 0, 0, 0).await; assert_silo_metrics(&cptestctx, None, 0, 0, 0).await; let project1_id = create_project(&client, "p-1").await.identity.id; @@ -189,7 +189,7 @@ async fn test_metrics( "/v1/metrics/cpus_provisioned?start_time={:?}&end_time={:?}&order=descending&limit=1&project={}", cptestctx.start_time, Utc::now(), - *SILO_ID, + *DEFAULT_SILO_ID, ); assert_404(&cptestctx, &bad_silo_metrics_url).await; let bad_system_metrics_url = format!( @@ -205,14 +205,15 @@ async fn test_metrics( assert_silo_metrics(&cptestctx, Some(project1_id), 0, 4, GIB).await; assert_silo_metrics(&cptestctx, None, 0, 4, GIB).await; assert_system_metrics(&cptestctx, None, 0, 4, GIB).await; - assert_system_metrics(&cptestctx, Some(*SILO_ID), 0, 4, GIB).await; + assert_system_metrics(&cptestctx, Some(*DEFAULT_SILO_ID), 0, 4, GIB).await; // create disk in project 1 create_disk(&client, "p-1", "d-1").await; assert_silo_metrics(&cptestctx, Some(project1_id), GIB, 4, GIB).await; assert_silo_metrics(&cptestctx, None, GIB, 4, GIB).await; assert_system_metrics(&cptestctx, None, GIB, 4, GIB).await; - assert_system_metrics(&cptestctx, Some(*SILO_ID), GIB, 4, GIB).await; + assert_system_metrics(&cptestctx, Some(*DEFAULT_SILO_ID), GIB, 4, GIB) + .await; // project 2 metrics still empty assert_silo_metrics(&cptestctx, Some(project2_id), 0, 0, 0).await; @@ -225,8 +226,14 @@ async fn test_metrics( // both instances show up in silo and fleet metrics assert_silo_metrics(&cptestctx, None, 2 * GIB, 8, 2 * GIB).await; assert_system_metrics(&cptestctx, None, 2 * GIB, 8, 2 * GIB).await; - assert_system_metrics(&cptestctx, Some(*SILO_ID), 2 * GIB, 8, 2 * GIB) - .await; + assert_system_metrics( + &cptestctx, + Some(*DEFAULT_SILO_ID), + 2 * GIB, + 8, + 2 * GIB, + ) + .await; // project 1 unaffected by project 2's resources assert_silo_metrics(&cptestctx, Some(project1_id), GIB, 4, GIB).await; diff --git a/nexus/tests/integration_tests/silo_users.rs b/nexus/tests/integration_tests/silo_users.rs index 9357c28063..099a186a2c 100644 --- a/nexus/tests/integration_tests/silo_users.rs +++ b/nexus/tests/integration_tests/silo_users.rs @@ -7,7 +7,7 @@ use http::{method::Method, StatusCode}; use nexus_db_queries::authn::USER_TEST_UNPRIVILEGED; use nexus_db_queries::authz; use nexus_db_queries::context::OpContext; -use nexus_db_queries::db::fixed_data::silo::SILO_ID; +use nexus_db_queries::db::fixed_data::silo::DEFAULT_SILO_ID; use nexus_test_utils::assert_same_items; use nexus_test_utils::http_testing::{AuthnMode, NexusRequest}; use nexus_test_utils::resource_helpers::objects_list_page_authz; @@ -44,8 +44,11 @@ async fn test_silo_group_users(cptestctx: &ControlPlaneTestContext) { objects_list_page_authz::(client, &"/v1/groups").await; assert_eq!(groups.items.len(), 0); - let authz_silo = - authz::Silo::new(authz::FLEET, *SILO_ID, LookupType::ById(*SILO_ID)); + let authz_silo = authz::Silo::new( + authz::FLEET, + *DEFAULT_SILO_ID, + LookupType::ById(*DEFAULT_SILO_ID), + ); // create a group let group_name = "group1".to_string(); diff --git a/nexus/tests/integration_tests/silos.rs b/nexus/tests/integration_tests/silos.rs index 86bf01062f..6dfddb12e1 100644 --- a/nexus/tests/integration_tests/silos.rs +++ b/nexus/tests/integration_tests/silos.rs @@ -11,7 +11,7 @@ use nexus_db_queries::authn::{USER_TEST_PRIVILEGED, USER_TEST_UNPRIVILEGED}; use nexus_db_queries::authz::{self}; use nexus_db_queries::context::OpContext; use nexus_db_queries::db; -use nexus_db_queries::db::fixed_data::silo::{DEFAULT_SILO, SILO_ID}; +use nexus_db_queries::db::fixed_data::silo::{DEFAULT_SILO, DEFAULT_SILO_ID}; use nexus_db_queries::db::identity::Asset; use nexus_db_queries::db::lookup::LookupPath; use nexus_test_utils::http_testing::{AuthnMode, NexusRequest, RequestBuilder}; @@ -918,12 +918,12 @@ async fn test_silo_users_list(cptestctx: &ControlPlaneTestContext) { views::User { id: USER_TEST_PRIVILEGED.id(), display_name: USER_TEST_PRIVILEGED.external_id.clone(), - silo_id: *SILO_ID, + silo_id: *DEFAULT_SILO_ID, }, views::User { id: USER_TEST_UNPRIVILEGED.id(), display_name: USER_TEST_UNPRIVILEGED.external_id.clone(), - silo_id: *SILO_ID, + silo_id: *DEFAULT_SILO_ID, }, ] ); @@ -952,17 +952,17 @@ async fn test_silo_users_list(cptestctx: &ControlPlaneTestContext) { views::User { id: new_silo_user_id, display_name: new_silo_user_external_id.into(), - silo_id: *SILO_ID, + silo_id: *DEFAULT_SILO_ID, }, views::User { id: USER_TEST_PRIVILEGED.id(), display_name: USER_TEST_PRIVILEGED.external_id.clone(), - silo_id: *SILO_ID, + silo_id: *DEFAULT_SILO_ID, }, views::User { id: USER_TEST_UNPRIVILEGED.id(), display_name: USER_TEST_UNPRIVILEGED.external_id.clone(), - silo_id: *SILO_ID, + silo_id: *DEFAULT_SILO_ID, }, ] ); From 2406d9d93258cc33b57d03c7abcd90a95ca487c4 Mon Sep 17 00:00:00 2001 From: James MacMahon Date: Thu, 14 Mar 2024 12:44:49 -0400 Subject: [PATCH 2/5] Accept notifications from Crucible (#5135) Allow any Upstairs to notify Nexus about the start or completion (plus status) of live repairs. The motivation for this was to be used in the final stage of region replacement to notify Nexus that the replacement has finished, but more generally this can be used to keep track of how many times repair occurs for each region. Also accept notifications for: - when a downstairs client is requested to stop - when a downstairs client stops These will be used as breadcrumbs to determine when downstairs were having problems, why repairs started in the first place, and more. Fixes #5120 --- Cargo.lock | 3 + clients/nexus-client/Cargo.toml | 1 + clients/nexus-client/src/lib.rs | 4 + common/Cargo.toml | 1 + common/src/api/internal/nexus.rs | 83 ++ common/src/lib.rs | 81 ++ nexus/Cargo.toml | 1 + nexus/db-model/src/downstairs.rs | 133 +++ nexus/db-model/src/lib.rs | 4 + nexus/db-model/src/schema.rs | 46 +- nexus/db-model/src/upstairs_repair.rs | 154 ++++ nexus/db-queries/src/db/datastore/volume.rs | 249 ++++++ nexus/db-queries/src/db/pool_connection.rs | 4 + nexus/src/app/instance_network.rs | 2 +- nexus/src/app/sagas/common_storage.rs | 2 +- .../src/app/sagas/loopback_address_create.rs | 2 +- .../src/app/sagas/loopback_address_delete.rs | 2 +- nexus/src/app/sagas/mod.rs | 82 -- nexus/src/app/sagas/snapshot_create.rs | 2 +- .../app/sagas/switch_port_settings_apply.rs | 2 +- .../app/sagas/switch_port_settings_clear.rs | 2 +- nexus/src/app/volume.rs | 162 ++++ nexus/src/internal_api/http_entrypoints.rs | 180 ++++ .../integration_tests/volume_management.rs | 768 ++++++++++++++++++ openapi/nexus-internal.json | 401 +++++++++ schema/crdb/43.0.0/up01.sql | 5 + schema/crdb/43.0.0/up02.sql | 4 + schema/crdb/43.0.0/up03.sql | 21 + schema/crdb/43.0.0/up04.sql | 8 + schema/crdb/43.0.0/up05.sql | 11 + schema/crdb/43.0.0/up06.sql | 8 + schema/crdb/43.0.0/up07.sql | 11 + schema/crdb/43.0.0/up08.sql | 8 + schema/crdb/dbinit.sql | 86 +- uuid-kinds/src/lib.rs | 5 + 35 files changed, 2447 insertions(+), 91 deletions(-) create mode 100644 nexus/db-model/src/downstairs.rs create mode 100644 nexus/db-model/src/upstairs_repair.rs create mode 100644 schema/crdb/43.0.0/up01.sql create mode 100644 schema/crdb/43.0.0/up02.sql create mode 100644 schema/crdb/43.0.0/up03.sql create mode 100644 schema/crdb/43.0.0/up04.sql create mode 100644 schema/crdb/43.0.0/up05.sql create mode 100644 schema/crdb/43.0.0/up06.sql create mode 100644 schema/crdb/43.0.0/up07.sql create mode 100644 schema/crdb/43.0.0/up08.sql diff --git a/Cargo.lock b/Cargo.lock index 88c78a83d4..84f365e2f0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4369,6 +4369,7 @@ dependencies = [ "nexus-types", "omicron-common", "omicron-passwords", + "omicron-uuid-kinds", "omicron-workspace-hack", "progenitor", "regress 0.9.0", @@ -5057,6 +5058,7 @@ dependencies = [ "once_cell", "parse-display", "progenitor", + "progenitor-client", "proptest", "rand 0.8.5", "regress 0.9.0", @@ -5216,6 +5218,7 @@ dependencies = [ "omicron-rpaths", "omicron-sled-agent", "omicron-test-utils", + "omicron-uuid-kinds", "omicron-workspace-hack", "once_cell", "openapi-lint", diff --git a/clients/nexus-client/Cargo.toml b/clients/nexus-client/Cargo.toml index 965e2a7dfb..fd6df6919f 100644 --- a/clients/nexus-client/Cargo.toml +++ b/clients/nexus-client/Cargo.toml @@ -20,3 +20,4 @@ serde_json.workspace = true slog.workspace = true uuid.workspace = true omicron-workspace-hack.workspace = true +omicron-uuid-kinds.workspace = true diff --git a/clients/nexus-client/src/lib.rs b/clients/nexus-client/src/lib.rs index 85c67ddbfd..ad8269e675 100644 --- a/clients/nexus-client/src/lib.rs +++ b/clients/nexus-client/src/lib.rs @@ -35,6 +35,10 @@ progenitor::generate_api!( NewPasswordHash = omicron_passwords::NewPasswordHash, NetworkInterface = omicron_common::api::internal::shared::NetworkInterface, NetworkInterfaceKind = omicron_common::api::internal::shared::NetworkInterfaceKind, + TypedUuidForDownstairsKind = omicron_uuid_kinds::TypedUuid, + TypedUuidForUpstairsKind = omicron_uuid_kinds::TypedUuid, + TypedUuidForUpstairsRepairKind = omicron_uuid_kinds::TypedUuid, + TypedUuidForUpstairsSessionKind = omicron_uuid_kinds::TypedUuid, }, patch = { SledAgentInfo = { derives = [PartialEq, Eq] }, diff --git a/common/Cargo.toml b/common/Cargo.toml index 4451d92bdb..b16415b828 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -41,6 +41,7 @@ tokio = { workspace = true, features = ["full"] } uuid.workspace = true parse-display.workspace = true progenitor.workspace = true +progenitor-client.workspace = true omicron-workspace-hack.workspace = true once_cell.workspace = true regress.workspace = true diff --git a/common/src/api/internal/nexus.rs b/common/src/api/internal/nexus.rs index 3972e011cf..24ef9a16aa 100644 --- a/common/src/api/internal/nexus.rs +++ b/common/src/api/internal/nexus.rs @@ -9,6 +9,10 @@ use crate::api::external::{ InstanceState, IpNet, SemverVersion, Vni, }; use chrono::{DateTime, Utc}; +use omicron_uuid_kinds::DownstairsRegionKind; +use omicron_uuid_kinds::TypedUuid; +use omicron_uuid_kinds::UpstairsRepairKind; +use omicron_uuid_kinds::UpstairsSessionKind; use parse_display::{Display, FromStr}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; @@ -251,3 +255,82 @@ pub enum HostIdentifier { Ip(IpNet), Vpc(Vni), } + +#[derive(Debug, Deserialize, Serialize, JsonSchema, Clone, Copy)] +#[serde(rename_all = "snake_case")] +pub enum UpstairsRepairType { + Live, + Reconciliation, +} + +#[derive(Debug, Deserialize, Serialize, JsonSchema, Clone)] +pub struct DownstairsUnderRepair { + pub region_uuid: TypedUuid, + pub target_addr: std::net::SocketAddrV6, +} + +#[derive(Debug, Deserialize, Serialize, JsonSchema, Clone)] +pub struct RepairStartInfo { + pub time: DateTime, + pub session_id: TypedUuid, + pub repair_id: TypedUuid, + pub repair_type: UpstairsRepairType, + pub repairs: Vec, +} + +#[derive(Debug, Deserialize, Serialize, JsonSchema, Clone)] +pub struct RepairFinishInfo { + pub time: DateTime, + pub session_id: TypedUuid, + pub repair_id: TypedUuid, + pub repair_type: UpstairsRepairType, + pub repairs: Vec, + pub aborted: bool, +} + +#[derive(Debug, Deserialize, Serialize, JsonSchema, Clone)] +pub struct RepairProgress { + pub time: DateTime, + pub current_item: i64, + pub total_items: i64, +} + +#[derive(Debug, Deserialize, Serialize, JsonSchema, Clone)] +#[serde(rename_all = "snake_case")] +pub enum DownstairsClientStopRequestReason { + Replacing, + Disabled, + FailedReconcile, + IOError, + BadNegotiationOrder, + Incompatible, + FailedLiveRepair, + TooManyOutstandingJobs, + Deactivated, +} + +#[derive(Debug, Deserialize, Serialize, JsonSchema, Clone)] +pub struct DownstairsClientStopRequest { + pub time: DateTime, + pub reason: DownstairsClientStopRequestReason, +} + +#[derive(Debug, Deserialize, Serialize, JsonSchema, Clone)] +#[serde(rename_all = "snake_case")] +pub enum DownstairsClientStoppedReason { + ConnectionTimeout, + ConnectionFailed, + Timeout, + WriteFailed, + ReadFailed, + RequestedStop, + Finished, + QueueClosed, + ReceiveTaskCancelled, +} + +#[derive(Debug, Deserialize, Serialize, JsonSchema, Clone)] +pub struct DownstairsClientStopped { + pub time: DateTime, + pub reason: DownstairsClientStoppedReason, +} diff --git a/common/src/lib.rs b/common/src/lib.rs index 411bc3e426..24fa4dfba0 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -77,3 +77,84 @@ impl slog::KV for FileKv { } pub const OMICRON_DPD_TAG: &str = "omicron"; + +use futures::Future; +use slog::warn; + +/// Retry a progenitor client operation until a known result is returned. +/// +/// Saga execution relies on the outcome of an external call being known: since +/// they are idempotent, reissue the external call until a known result comes +/// back. Retry if a communication error is seen, or if another retryable error +/// is seen. +/// +/// Note that retrying is only valid if the call itself is idempotent. +pub async fn retry_until_known_result( + log: &slog::Logger, + mut f: F, +) -> Result> +where + F: FnMut() -> Fut, + Fut: Future>>, + E: std::fmt::Debug, +{ + backoff::retry_notify( + backoff::retry_policy_internal_service(), + move || { + let fut = f(); + async move { + match fut.await { + Err(progenitor_client::Error::CommunicationError(e)) => { + warn!( + log, + "saw transient communication error {}, retrying...", + e, + ); + + Err(backoff::BackoffError::transient( + progenitor_client::Error::CommunicationError(e), + )) + } + + Err(progenitor_client::Error::ErrorResponse( + response_value, + )) => { + match response_value.status() { + // Retry on 503 or 429 + http::StatusCode::SERVICE_UNAVAILABLE + | http::StatusCode::TOO_MANY_REQUESTS => { + Err(backoff::BackoffError::transient( + progenitor_client::Error::ErrorResponse( + response_value, + ), + )) + } + + // Anything else is a permanent error + _ => Err(backoff::BackoffError::Permanent( + progenitor_client::Error::ErrorResponse( + response_value, + ), + )), + } + } + + Err(e) => { + warn!(log, "saw permanent error {}, aborting", e,); + + Err(backoff::BackoffError::Permanent(e)) + } + + Ok(v) => Ok(v), + } + } + }, + |error: progenitor_client::Error<_>, delay| { + warn!( + log, + "failed external call ({:?}), will retry in {:?}", error, delay, + ); + }, + ) + .await +} diff --git a/nexus/Cargo.toml b/nexus/Cargo.toml index 2b8845f6f5..57d929d44d 100644 --- a/nexus/Cargo.toml +++ b/nexus/Cargo.toml @@ -97,6 +97,7 @@ rustls = { workspace = true } rustls-pemfile = { workspace = true } update-common.workspace = true omicron-workspace-hack.workspace = true +omicron-uuid-kinds.workspace = true [dev-dependencies] async-bb8-diesel.workspace = true diff --git a/nexus/db-model/src/downstairs.rs b/nexus/db-model/src/downstairs.rs new file mode 100644 index 0000000000..6aaeadc810 --- /dev/null +++ b/nexus/db-model/src/downstairs.rs @@ -0,0 +1,133 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +use super::impl_enum_type; +use crate::schema::downstairs_client_stop_request_notification; +use crate::schema::downstairs_client_stopped_notification; +use crate::typed_uuid::DbTypedUuid; +use chrono::{DateTime, Utc}; +use omicron_common::api::internal; +use omicron_uuid_kinds::DownstairsKind; +use omicron_uuid_kinds::UpstairsKind; +use serde::{Deserialize, Serialize}; + +// Types for stop request notification + +impl_enum_type!( + #[derive(SqlType, Debug, QueryId)] + #[diesel(postgres_type(name = "downstairs_client_stop_request_reason_type", schema = "public"))] + pub struct DownstairsClientStopRequestReasonEnum; + + #[derive(Copy, Clone, Debug, AsExpression, FromSqlRow, Serialize, Deserialize, PartialEq)] + #[diesel(sql_type = DownstairsClientStopRequestReasonEnum)] + pub enum DownstairsClientStopRequestReason; + + // Reason types + Replacing => b"replacing" + Disabled => b"disabled" + FailedReconcile => b"failed_reconcile" + IOError => b"io_error" + BadNegotiationOrder => b"bad_negotiation_order" + Incompatible => b"incompatible" + FailedLiveRepair => b"failed_live_repair" + TooManyOutstandingJobs => b"too_many_outstanding_jobs" + Deactivated => b"deactivated" +); + +impl From + for DownstairsClientStopRequestReason +{ + fn from( + v: internal::nexus::DownstairsClientStopRequestReason, + ) -> DownstairsClientStopRequestReason { + match v { + internal::nexus::DownstairsClientStopRequestReason::Replacing => DownstairsClientStopRequestReason::Replacing, + internal::nexus::DownstairsClientStopRequestReason::Disabled => DownstairsClientStopRequestReason::Disabled, + internal::nexus::DownstairsClientStopRequestReason::FailedReconcile => DownstairsClientStopRequestReason::FailedReconcile, + internal::nexus::DownstairsClientStopRequestReason::IOError => DownstairsClientStopRequestReason::IOError, + internal::nexus::DownstairsClientStopRequestReason::BadNegotiationOrder => DownstairsClientStopRequestReason::BadNegotiationOrder, + internal::nexus::DownstairsClientStopRequestReason::Incompatible => DownstairsClientStopRequestReason::Incompatible, + internal::nexus::DownstairsClientStopRequestReason::FailedLiveRepair => DownstairsClientStopRequestReason::FailedLiveRepair, + internal::nexus::DownstairsClientStopRequestReason::TooManyOutstandingJobs => DownstairsClientStopRequestReason::TooManyOutstandingJobs, + internal::nexus::DownstairsClientStopRequestReason::Deactivated => DownstairsClientStopRequestReason::Deactivated, + } + } +} + +/// A Record of when an Upstairs requested a Downstairs client task stop +#[derive(Queryable, Insertable, Debug, Clone, Selectable)] +#[diesel(table_name = downstairs_client_stop_request_notification)] +pub struct DownstairsClientStopRequestNotification { + // Importantly, this is client time, not Nexus' time that it received the + // notification. + pub time: DateTime, + + // Which Upstairs sent this notification? + pub upstairs_id: DbTypedUuid, + + // Which Downstairs client was requested to stop? + pub downstairs_id: DbTypedUuid, + + pub reason: DownstairsClientStopRequestReason, +} + +// Types for stopped notification + +impl_enum_type!( + #[derive(SqlType, Debug, QueryId)] + #[diesel(postgres_type(name = "downstairs_client_stopped_reason_type", schema = "public"))] + pub struct DownstairsClientStoppedReasonEnum; + + #[derive(Copy, Clone, Debug, AsExpression, FromSqlRow, Serialize, Deserialize, PartialEq)] + #[diesel(sql_type = DownstairsClientStoppedReasonEnum)] + pub enum DownstairsClientStoppedReason; + + // Reason types + ConnectionTimeout => b"connection_timeout" + ConnectionFailed => b"connection_failed" + Timeout => b"timeout" + WriteFailed => b"write_failed" + ReadFailed => b"read_failed" + RequestedStop => b"requested_stop" + Finished => b"finished" + QueueClosed => b"queue_closed" + ReceiveTaskCancelled => b"receive_task_cancelled" +); + +impl From + for DownstairsClientStoppedReason +{ + fn from( + v: internal::nexus::DownstairsClientStoppedReason, + ) -> DownstairsClientStoppedReason { + match v { + internal::nexus::DownstairsClientStoppedReason::ConnectionTimeout => DownstairsClientStoppedReason::ConnectionTimeout, + internal::nexus::DownstairsClientStoppedReason::ConnectionFailed => DownstairsClientStoppedReason::ConnectionFailed, + internal::nexus::DownstairsClientStoppedReason::Timeout => DownstairsClientStoppedReason::Timeout, + internal::nexus::DownstairsClientStoppedReason::WriteFailed => DownstairsClientStoppedReason::WriteFailed, + internal::nexus::DownstairsClientStoppedReason::ReadFailed => DownstairsClientStoppedReason::ReadFailed, + internal::nexus::DownstairsClientStoppedReason::RequestedStop => DownstairsClientStoppedReason::RequestedStop, + internal::nexus::DownstairsClientStoppedReason::Finished => DownstairsClientStoppedReason::Finished, + internal::nexus::DownstairsClientStoppedReason::QueueClosed => DownstairsClientStoppedReason::QueueClosed, + internal::nexus::DownstairsClientStoppedReason::ReceiveTaskCancelled => DownstairsClientStoppedReason::ReceiveTaskCancelled, + } + } +} + +/// A Record of when a Downstairs client task stopped +#[derive(Queryable, Insertable, Debug, Clone, Selectable)] +#[diesel(table_name = downstairs_client_stopped_notification)] +pub struct DownstairsClientStoppedNotification { + // Importantly, this is client time, not Nexus' time that it received the + // notification. + pub time: DateTime, + + // Which Upstairs sent this notification? + pub upstairs_id: DbTypedUuid, + + // Which Downstairs client was stopped? + pub downstairs_id: DbTypedUuid, + + pub reason: DownstairsClientStoppedReason, +} diff --git a/nexus/db-model/src/lib.rs b/nexus/db-model/src/lib.rs index 5c89134b78..d2b676a3da 100644 --- a/nexus/db-model/src/lib.rs +++ b/nexus/db-model/src/lib.rs @@ -26,6 +26,7 @@ mod digest; mod disk; mod disk_state; mod dns; +mod downstairs; mod external_ip; mod generation; mod identity_provider; @@ -85,6 +86,7 @@ mod switch; mod tuf_repo; mod typed_uuid; mod unsigned; +mod upstairs_repair; mod user_builtin; mod utilization; mod virtual_provisioning_collection; @@ -127,6 +129,7 @@ pub use digest::*; pub use disk::*; pub use disk_state::*; pub use dns::*; +pub use downstairs::*; pub use external_ip::*; pub use generation::*; pub use identity_provider::*; @@ -176,6 +179,7 @@ pub use switch_interface::*; pub use switch_port::*; pub use tuf_repo::*; pub use typed_uuid::to_db_typed_uuid; +pub use upstairs_repair::*; pub use user_builtin::*; pub use utilization::*; pub use virtual_provisioning_collection::*; diff --git a/nexus/db-model/src/schema.rs b/nexus/db-model/src/schema.rs index bcbf7fa88f..c31ce16775 100644 --- a/nexus/db-model/src/schema.rs +++ b/nexus/db-model/src/schema.rs @@ -13,7 +13,7 @@ use omicron_common::api::external::SemverVersion; /// /// This should be updated whenever the schema is changed. For more details, /// refer to: schema/crdb/README.adoc -pub const SCHEMA_VERSION: SemverVersion = SemverVersion::new(42, 0, 0); +pub const SCHEMA_VERSION: SemverVersion = SemverVersion::new(43, 0, 0); table! { disk (id) { @@ -1549,6 +1549,50 @@ table! { } } +table! { + upstairs_repair_notification (repair_id, upstairs_id, session_id, region_id, notification_type) { + time -> Timestamptz, + + repair_id -> Uuid, + repair_type -> crate::UpstairsRepairTypeEnum, + upstairs_id -> Uuid, + session_id -> Uuid, + + region_id -> Uuid, + target_ip -> Inet, + target_port -> Int4, + + notification_type -> crate::UpstairsRepairNotificationTypeEnum, + } +} + +table! { + upstairs_repair_progress (repair_id, time, current_item, total_items) { + repair_id -> Uuid, + time -> Timestamptz, + current_item -> Int8, + total_items -> Int8, + } +} + +table! { + downstairs_client_stop_request_notification (time, upstairs_id, downstairs_id, reason) { + time -> Timestamptz, + upstairs_id -> Uuid, + downstairs_id -> Uuid, + reason -> crate::DownstairsClientStopRequestReasonEnum, + } +} + +table! { + downstairs_client_stopped_notification (time, upstairs_id, downstairs_id, reason) { + time -> Timestamptz, + upstairs_id -> Uuid, + downstairs_id -> Uuid, + reason -> crate::DownstairsClientStoppedReasonEnum, + } +} + table! { db_metadata (singleton) { singleton -> Bool, diff --git a/nexus/db-model/src/upstairs_repair.rs b/nexus/db-model/src/upstairs_repair.rs new file mode 100644 index 0000000000..311592f8e4 --- /dev/null +++ b/nexus/db-model/src/upstairs_repair.rs @@ -0,0 +1,154 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +use super::impl_enum_type; +use crate::ipv6; +use crate::schema::upstairs_repair_notification; +use crate::schema::upstairs_repair_progress; +use crate::typed_uuid::DbTypedUuid; +use crate::SqlU16; +use chrono::{DateTime, Utc}; +use omicron_common::api::internal; +use omicron_uuid_kinds::DownstairsRegionKind; +use omicron_uuid_kinds::TypedUuid; +use omicron_uuid_kinds::UpstairsKind; +use omicron_uuid_kinds::UpstairsRepairKind; +use omicron_uuid_kinds::UpstairsSessionKind; +use serde::{Deserialize, Serialize}; +use std::net::SocketAddrV6; // internal::nexus::UpstairsRepairType; + +impl_enum_type!( + #[derive(SqlType, Debug, QueryId)] + #[diesel(postgres_type(name = "upstairs_repair_notification_type", schema = "public"))] + pub struct UpstairsRepairNotificationTypeEnum; + + #[derive(Copy, Clone, Debug, AsExpression, FromSqlRow, Serialize, Deserialize, PartialEq)] + #[diesel(sql_type = UpstairsRepairNotificationTypeEnum)] + pub enum UpstairsRepairNotificationType; + + // Notification types + Started => b"started" + Succeeded => b"succeeded" + Failed => b"failed" +); + +impl_enum_type!( + #[derive(SqlType, Debug, QueryId)] + #[diesel(postgres_type(name = "upstairs_repair_type", schema = "public"))] + pub struct UpstairsRepairTypeEnum; + + #[derive(Copy, Clone, Debug, AsExpression, FromSqlRow, Serialize, Deserialize, PartialEq, Eq, Hash)] + #[diesel(sql_type = UpstairsRepairTypeEnum)] + pub enum UpstairsRepairType; + + // Types of repair a Crucible Upstairs can do + Live => b"live" + Reconciliation => b"reconciliation" +); + +impl From for UpstairsRepairType { + fn from(v: internal::nexus::UpstairsRepairType) -> UpstairsRepairType { + match v { + internal::nexus::UpstairsRepairType::Live => { + UpstairsRepairType::Live + } + internal::nexus::UpstairsRepairType::Reconciliation => { + UpstairsRepairType::Reconciliation + } + } + } +} + +/// A record of Crucible Upstairs repair notifications: when a repair started, +/// succeeded, failed, etc. +/// +/// Each repair attempt is uniquely identified by the repair ID, upstairs ID, +/// session ID, and region ID. How those change tells Nexus about what is going +/// on: +/// +/// - if all IDs are the same for different requests, Nexus knows that the +/// client is retrying the notification. +/// +/// - if the upstairs ID, session ID, and region ID are all the same, but the +/// repair ID is different, then the same Upstairs is trying to repair that +/// region again. This could be due to a failed first attempt, or that +/// downstairs may have been kicked out again. +/// +/// - if the upstairs ID and region ID are the same, but the session ID and +/// repair ID are different, then a different session of the same Upstairs is +/// trying to repair that Downstairs. Session IDs change each time the +/// Upstairs is created, so it could have crashed, or it could have been +/// migrated and the destination Propolis' Upstairs is attempting to repair +/// the same region. +#[derive(Queryable, Insertable, Debug, Clone, Selectable)] +#[diesel(table_name = upstairs_repair_notification)] +pub struct UpstairsRepairNotification { + // Importantly, this is client time, not Nexus' time that it received the + // notification. + pub time: DateTime, + + pub repair_id: DbTypedUuid, + + // There's a difference between the live repairs and reconciliation: the + // Upstairs can go through reconciliation without there being any error from + // a downstairs, or any region replacement request from Nexus. One example + // is if the rack power is pulled: if everything is powered back up again + // reconciliation could be required but this isn't the fault of any problem + // with a physical disk, or any error that was returned. + // + // Alternatively any record of a live repair means that there was a problem: + // Currently, either an Upstairs kicked out a Downstairs (or two) due to + // some error or because it lagged behind the others, or Nexus has + // instructed an Upstairs to perform a region replacement. + pub repair_type: UpstairsRepairType, + + pub upstairs_id: DbTypedUuid, + pub session_id: DbTypedUuid, + + pub region_id: DbTypedUuid, + pub target_ip: ipv6::Ipv6Addr, + pub target_port: SqlU16, + + pub notification_type: UpstairsRepairNotificationType, +} + +impl UpstairsRepairNotification { + #[allow(clippy::too_many_arguments)] + pub fn new( + time: DateTime, + repair_id: TypedUuid, + repair_type: UpstairsRepairType, + upstairs_id: TypedUuid, + session_id: TypedUuid, + region_id: TypedUuid, + target_addr: SocketAddrV6, + notification_type: UpstairsRepairNotificationType, + ) -> Self { + Self { + time, + repair_id: repair_id.into(), + repair_type, + upstairs_id: upstairs_id.into(), + session_id: session_id.into(), + region_id: region_id.into(), + target_ip: target_addr.ip().into(), + target_port: target_addr.port().into(), + notification_type, + } + } + + pub fn address(&self) -> SocketAddrV6 { + SocketAddrV6::new(*self.target_ip, *self.target_port, 0, 0) + } +} + +/// A record of Crucible Upstairs repair progress. +#[derive(Queryable, Insertable, Debug, Clone, Selectable)] +#[diesel(table_name = upstairs_repair_progress)] +pub struct UpstairsRepairProgress { + pub repair_id: DbTypedUuid, + pub time: DateTime, + pub current_item: i64, + pub total_items: i64, +} diff --git a/nexus/db-queries/src/db/datastore/volume.rs b/nexus/db-queries/src/db/datastore/volume.rs index 374ef2cf73..a9646b9ef6 100644 --- a/nexus/db-queries/src/db/datastore/volume.rs +++ b/nexus/db-queries/src/db/datastore/volume.rs @@ -6,12 +6,18 @@ use super::DataStore; use crate::db; +use crate::db::datastore::OpContext; use crate::db::error::public_error_from_diesel; use crate::db::error::ErrorHandler; use crate::db::identity::Asset; use crate::db::model::Dataset; +use crate::db::model::DownstairsClientStopRequestNotification; +use crate::db::model::DownstairsClientStoppedNotification; use crate::db::model::Region; use crate::db::model::RegionSnapshot; +use crate::db::model::UpstairsRepairNotification; +use crate::db::model::UpstairsRepairNotificationType; +use crate::db::model::UpstairsRepairProgress; use crate::db::model::Volume; use crate::db::queries::volume::DecreaseCrucibleResourceCountAndSoftDeleteVolume; use crate::transaction_retry::OptionalError; @@ -25,6 +31,13 @@ use omicron_common::api::external::Error; use omicron_common::api::external::ListResultVec; use omicron_common::api::external::LookupResult; use omicron_common::api::external::ResourceType; +use omicron_common::api::internal::nexus::DownstairsClientStopRequest; +use omicron_common::api::internal::nexus::DownstairsClientStopped; +use omicron_common::api::internal::nexus::RepairProgress; +use omicron_uuid_kinds::DownstairsKind; +use omicron_uuid_kinds::TypedUuid; +use omicron_uuid_kinds::UpstairsKind; +use omicron_uuid_kinds::UpstairsRepairKind; use serde::Deserialize; use serde::Deserializer; use serde::Serialize; @@ -809,6 +822,242 @@ impl DataStore { public_error_from_diesel(e, ErrorHandler::Server) }) } + + // An Upstairs is created as part of a Volume hierarchy if the Volume + // Construction Request includes a "Region" variant. This may be at any + // layer of the Volume, and some notifications will come from an Upstairs + // instead of the top level of the Volume. The following functions have an + // Upstairs ID instead of a Volume ID for this reason. + + /// Record when an Upstairs notifies us about a repair. If that record + /// (uniquely identified by the four IDs passed in plus the notification + /// type) exists already, do nothing. + pub async fn upstairs_repair_notification( + &self, + opctx: &OpContext, + record: UpstairsRepairNotification, + ) -> Result<(), Error> { + use db::schema::upstairs_repair_notification::dsl; + + let conn = self.pool_connection_authorized(opctx).await?; + let err = OptionalError::new(); + + self.transaction_retry_wrapper("upstairs_repair_notification") + .transaction(&conn, |conn| { + let record = record.clone(); + let err = err.clone(); + + async move { + // Return 409 if a repair ID does not match types + let mismatched_record_type_count: usize = + dsl::upstairs_repair_notification + .filter(dsl::repair_id.eq(record.repair_id)) + .filter(dsl::repair_type.ne(record.repair_type)) + .execute_async(&conn) + .await?; + + if mismatched_record_type_count > 0 { + return Err(err.bail(Error::conflict(&format!( + "existing repair type for id {} does not match {:?}!", + record.repair_id, + record.repair_type, + )))); + } + + match &record.notification_type { + UpstairsRepairNotificationType::Started => { + // Proceed - the insertion can succeed or fail below + // based on the table's primary key + } + + UpstairsRepairNotificationType::Succeeded + | UpstairsRepairNotificationType::Failed => { + // However, Nexus must accept only one "finished" + // status - an Upstairs cannot change this and must + // instead perform another repair with a new repair + // ID. + let maybe_existing_finish_record: Option< + UpstairsRepairNotification, + > = dsl::upstairs_repair_notification + .filter(dsl::repair_id.eq(record.repair_id)) + .filter(dsl::upstairs_id.eq(record.upstairs_id)) + .filter(dsl::session_id.eq(record.session_id)) + .filter(dsl::region_id.eq(record.region_id)) + .filter(dsl::notification_type.eq_any(vec![ + UpstairsRepairNotificationType::Succeeded, + UpstairsRepairNotificationType::Failed, + ])) + .get_result_async(&conn) + .await + .optional()?; + + if let Some(existing_finish_record) = + maybe_existing_finish_record + { + if existing_finish_record.notification_type + != record.notification_type + { + return Err(err.bail(Error::conflict( + "existing finish record does not match", + ))); + } else { + // inserting the same record, bypass + return Ok(()); + } + } + } + } + + diesel::insert_into(dsl::upstairs_repair_notification) + .values(record) + .on_conflict(( + dsl::repair_id, + dsl::upstairs_id, + dsl::session_id, + dsl::region_id, + dsl::notification_type, + )) + .do_nothing() + .execute_async(&conn) + .await?; + + Ok(()) + } + }) + .await + .map_err(|e| { + if let Some(err) = err.take() { + err + } else { + public_error_from_diesel(e, ErrorHandler::Server) + } + }) + } + + /// Record Upstairs repair progress + pub async fn upstairs_repair_progress( + &self, + opctx: &OpContext, + upstairs_id: TypedUuid, + repair_id: TypedUuid, + repair_progress: RepairProgress, + ) -> Result<(), Error> { + use db::schema::upstairs_repair_notification::dsl as notification_dsl; + use db::schema::upstairs_repair_progress::dsl; + + let conn = self.pool_connection_authorized(opctx).await?; + let err = OptionalError::new(); + + self.transaction_retry_wrapper("upstairs_repair_progress") + .transaction(&conn, |conn| { + let repair_progress = repair_progress.clone(); + let err = err.clone(); + + async move { + // Check that there is a repair id for the upstairs id + let matching_repair: Option = + notification_dsl::upstairs_repair_notification + .filter(notification_dsl::repair_id.eq(nexus_db_model::to_db_typed_uuid(repair_id))) + .filter(notification_dsl::upstairs_id.eq(nexus_db_model::to_db_typed_uuid(upstairs_id))) + .filter(notification_dsl::notification_type.eq(UpstairsRepairNotificationType::Started)) + .get_result_async(&conn) + .await + .optional()?; + + if matching_repair.is_none() { + return Err(err.bail(Error::non_resourcetype_not_found(&format!( + "upstairs {upstairs_id} repair {repair_id} not found" + )))); + } + + diesel::insert_into(dsl::upstairs_repair_progress) + .values(UpstairsRepairProgress { + repair_id: repair_id.into(), + time: repair_progress.time, + current_item: repair_progress.current_item, + total_items: repair_progress.total_items, + }) + .execute_async(&conn) + .await?; + + Ok(()) + } + }) + .await + .map_err(|e| { + if let Some(err) = err.take() { + err + } else { + public_error_from_diesel(e, ErrorHandler::Server) + } + }) + } + + /// Record when a Downstairs client is requested to stop, and why + pub async fn downstairs_client_stop_request_notification( + &self, + opctx: &OpContext, + upstairs_id: TypedUuid, + downstairs_id: TypedUuid, + downstairs_client_stop_request: DownstairsClientStopRequest, + ) -> Result<(), Error> { + use db::schema::downstairs_client_stop_request_notification::dsl; + + let conn = self.pool_connection_authorized(opctx).await?; + + diesel::insert_into(dsl::downstairs_client_stop_request_notification) + .values(DownstairsClientStopRequestNotification { + time: downstairs_client_stop_request.time, + upstairs_id: upstairs_id.into(), + downstairs_id: downstairs_id.into(), + reason: downstairs_client_stop_request.reason.into(), + }) + .on_conflict(( + dsl::time, + dsl::upstairs_id, + dsl::downstairs_id, + dsl::reason, + )) + .do_nothing() + .execute_async(&*conn) + .await + .map_err(|e| public_error_from_diesel(e, ErrorHandler::Server))?; + + Ok(()) + } + + /// Record when a Downstairs client is stopped, and why + pub async fn downstairs_client_stopped_notification( + &self, + opctx: &OpContext, + upstairs_id: TypedUuid, + downstairs_id: TypedUuid, + downstairs_client_stopped: DownstairsClientStopped, + ) -> Result<(), Error> { + use db::schema::downstairs_client_stopped_notification::dsl; + + let conn = self.pool_connection_authorized(opctx).await?; + + diesel::insert_into(dsl::downstairs_client_stopped_notification) + .values(DownstairsClientStoppedNotification { + time: downstairs_client_stopped.time, + upstairs_id: upstairs_id.into(), + downstairs_id: downstairs_id.into(), + reason: downstairs_client_stopped.reason.into(), + }) + .on_conflict(( + dsl::time, + dsl::upstairs_id, + dsl::downstairs_id, + dsl::reason, + )) + .do_nothing() + .execute_async(&*conn) + .await + .map_err(|e| public_error_from_diesel(e, ErrorHandler::Server))?; + + Ok(()) + } } #[derive(Default, Clone, Debug, Serialize, Deserialize)] diff --git a/nexus/db-queries/src/db/pool_connection.rs b/nexus/db-queries/src/db/pool_connection.rs index f419ba6852..0331a3a103 100644 --- a/nexus/db-queries/src/db/pool_connection.rs +++ b/nexus/db-queries/src/db/pool_connection.rs @@ -44,6 +44,8 @@ static CUSTOM_TYPE_KEYS: &'static [&'static str] = &[ "caboose_which", "dataset_kind", "dns_group", + "downstairs_client_stop_request_reason_type", + "downstairs_client_stopped_reason_type", "hw_power_state", "hw_rot_slot", "identity_type", @@ -69,6 +71,8 @@ static CUSTOM_TYPE_KEYS: &'static [&'static str] = &[ "switch_link_fec", "switch_link_speed", "switch_port_geometry", + "upstairs_repair_notification_type", + "upstairs_repair_type", "user_provision_type", "vpc_firewall_rule_action", "vpc_firewall_rule_direction", diff --git a/nexus/src/app/instance_network.rs b/nexus/src/app/instance_network.rs index eb5f83470f..741b5b8b6d 100644 --- a/nexus/src/app/instance_network.rs +++ b/nexus/src/app/instance_network.rs @@ -4,7 +4,6 @@ //! Routines that manage instance-related networking state. -use crate::app::sagas::retry_until_known_result; use ipnetwork::IpNetwork; use ipnetwork::Ipv6Network; use nexus_db_model::ExternalIp; @@ -24,6 +23,7 @@ use omicron_common::api::external::Ipv6Net; use omicron_common::api::internal::nexus; use omicron_common::api::internal::shared::NetworkInterface; use omicron_common::api::internal::shared::SwitchLocation; +use omicron_common::retry_until_known_result; use sled_agent_client::types::DeleteVirtualNetworkInterfaceHost; use sled_agent_client::types::SetVirtualNetworkInterfaceHost; use std::collections::HashSet; diff --git a/nexus/src/app/sagas/common_storage.rs b/nexus/src/app/sagas/common_storage.rs index a7350d91fd..3b590f6205 100644 --- a/nexus/src/app/sagas/common_storage.rs +++ b/nexus/src/app/sagas/common_storage.rs @@ -6,7 +6,6 @@ use super::*; -use crate::app::sagas::retry_until_known_result; use crate::Nexus; use anyhow::anyhow; use crucible_agent_client::{ @@ -22,6 +21,7 @@ use nexus_db_queries::db::identity::Asset; use nexus_db_queries::db::lookup::LookupPath; use omicron_common::api::external::Error; use omicron_common::backoff::{self, BackoffError}; +use omicron_common::retry_until_known_result; use slog::Logger; use std::net::SocketAddrV6; diff --git a/nexus/src/app/sagas/loopback_address_create.rs b/nexus/src/app/sagas/loopback_address_create.rs index a5d89f202c..c32a5f387d 100644 --- a/nexus/src/app/sagas/loopback_address_create.rs +++ b/nexus/src/app/sagas/loopback_address_create.rs @@ -3,7 +3,6 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. use super::{NexusActionContext, NEXUS_DPD_TAG}; -use crate::app::sagas::retry_until_known_result; use crate::app::sagas::{ declare_saga_actions, ActionRegistry, NexusSaga, SagaInitError, }; @@ -13,6 +12,7 @@ use nexus_db_queries::authn; use nexus_db_queries::authz; use nexus_db_queries::db::model::LoopbackAddress; use omicron_common::api::internal::shared::SwitchLocation; +use omicron_common::retry_until_known_result; use serde::{Deserialize, Serialize}; use std::sync::Arc; use steno::ActionError; diff --git a/nexus/src/app/sagas/loopback_address_delete.rs b/nexus/src/app/sagas/loopback_address_delete.rs index a030178d27..822a360acf 100644 --- a/nexus/src/app/sagas/loopback_address_delete.rs +++ b/nexus/src/app/sagas/loopback_address_delete.rs @@ -3,7 +3,6 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. use super::NexusActionContext; -use crate::app::sagas::retry_until_known_result; use crate::app::sagas::{ declare_saga_actions, ActionRegistry, NexusSaga, SagaInitError, }; @@ -14,6 +13,7 @@ use nexus_db_queries::authz; use nexus_db_queries::db::model::{LoopbackAddress, Name}; use nexus_types::identity::Asset; use omicron_common::api::external::{IpNet, NameOrId}; +use omicron_common::retry_until_known_result; use serde::{Deserialize, Serialize}; use std::sync::Arc; use steno::ActionError; diff --git a/nexus/src/app/sagas/mod.rs b/nexus/src/app/sagas/mod.rs index aef8442090..01b01c4571 100644 --- a/nexus/src/app/sagas/mod.rs +++ b/nexus/src/app/sagas/mod.rs @@ -328,88 +328,6 @@ pub(crate) use __emit_action; pub(crate) use __stringify_ident; pub(crate) use declare_saga_actions; -use futures::Future; - -/// Retry a progenitor client operation until a known result is returned. -/// -/// Saga execution relies on the outcome of an external call being known: since -/// they are idempotent, reissue the external call until a known result comes -/// back. Retry if a communication error is seen, or if another retryable error -/// is seen. -/// -/// Note that retrying is only valid if the call itself is idempotent. -pub(crate) async fn retry_until_known_result( - log: &slog::Logger, - mut f: F, -) -> Result> -where - F: FnMut() -> Fut, - Fut: Future>>, - E: std::fmt::Debug, -{ - use omicron_common::backoff; - - backoff::retry_notify( - backoff::retry_policy_internal_service(), - move || { - let fut = f(); - async move { - match fut.await { - Err(progenitor_client::Error::CommunicationError(e)) => { - warn!( - log, - "saw transient communication error {}, retrying...", - e, - ); - - Err(backoff::BackoffError::transient( - progenitor_client::Error::CommunicationError(e), - )) - } - - Err(progenitor_client::Error::ErrorResponse( - response_value, - )) => { - match response_value.status() { - // Retry on 503 or 429 - http::StatusCode::SERVICE_UNAVAILABLE - | http::StatusCode::TOO_MANY_REQUESTS => { - Err(backoff::BackoffError::transient( - progenitor_client::Error::ErrorResponse( - response_value, - ), - )) - } - - // Anything else is a permanent error - _ => Err(backoff::BackoffError::Permanent( - progenitor_client::Error::ErrorResponse( - response_value, - ), - )), - } - } - - Err(e) => { - warn!(log, "saw permanent error {}, aborting", e,); - - Err(backoff::BackoffError::Permanent(e)) - } - - Ok(v) => Ok(v), - } - } - }, - |error: progenitor_client::Error<_>, delay| { - warn!( - log, - "failed external call ({:?}), will retry in {:?}", error, delay, - ); - }, - ) - .await -} - /// Reliable persistent workflows can request that sagas be run as part of their /// activation by sending a SagaRequest through a supplied channel to Nexus. pub enum SagaRequest { diff --git a/nexus/src/app/sagas/snapshot_create.rs b/nexus/src/app/sagas/snapshot_create.rs index e017ab377b..f1d1a2bd02 100644 --- a/nexus/src/app/sagas/snapshot_create.rs +++ b/nexus/src/app/sagas/snapshot_create.rs @@ -99,7 +99,6 @@ use super::{ ACTION_GENERATE_ID, }; use crate::app::sagas::declare_saga_actions; -use crate::app::sagas::retry_until_known_result; use crate::app::{authn, authz, db}; use crate::external_api::params; use anyhow::anyhow; @@ -109,6 +108,7 @@ use nexus_db_queries::db::identity::{Asset, Resource}; use nexus_db_queries::db::lookup::LookupPath; use omicron_common::api::external; use omicron_common::api::external::Error; +use omicron_common::retry_until_known_result; use rand::{rngs::StdRng, RngCore, SeedableRng}; use serde::Deserialize; use serde::Serialize; diff --git a/nexus/src/app/sagas/switch_port_settings_apply.rs b/nexus/src/app/sagas/switch_port_settings_apply.rs index 9e2331f416..44f2f77ea1 100644 --- a/nexus/src/app/sagas/switch_port_settings_apply.rs +++ b/nexus/src/app/sagas/switch_port_settings_apply.rs @@ -3,7 +3,6 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. use super::{NexusActionContext, NEXUS_DPD_TAG}; -use crate::app::sagas::retry_until_known_result; use crate::app::sagas::switch_port_settings_common::{ api_to_dpd_port_settings, ensure_switch_port_bgp_settings, ensure_switch_port_uplink, select_dendrite_client, select_mg_client, @@ -24,6 +23,7 @@ use nexus_db_queries::db::datastore::UpdatePrecondition; use nexus_db_queries::{authn, db}; use omicron_common::api::external::{self, NameOrId}; use omicron_common::api::internal::shared::SwitchLocation; +use omicron_common::retry_until_known_result; use serde::{Deserialize, Serialize}; use std::net::IpAddr; use std::str::FromStr; diff --git a/nexus/src/app/sagas/switch_port_settings_clear.rs b/nexus/src/app/sagas/switch_port_settings_clear.rs index 15290dd75b..2e35530ef1 100644 --- a/nexus/src/app/sagas/switch_port_settings_clear.rs +++ b/nexus/src/app/sagas/switch_port_settings_clear.rs @@ -3,7 +3,6 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. use super::{NexusActionContext, NEXUS_DPD_TAG}; -use crate::app::sagas::retry_until_known_result; use crate::app::sagas::switch_port_settings_common::{ api_to_dpd_port_settings, apply_bootstore_update, bootstore_update, ensure_switch_port_bgp_settings, ensure_switch_port_uplink, @@ -23,6 +22,7 @@ use nexus_db_model::NETWORK_KEY; use nexus_db_queries::authn; use nexus_db_queries::db::datastore::UpdatePrecondition; use omicron_common::api::external::{self, NameOrId, SwitchLocation}; +use omicron_common::retry_until_known_result; use serde::{Deserialize, Serialize}; use std::net::IpAddr; use std::str::FromStr; diff --git a/nexus/src/app/volume.rs b/nexus/src/app/volume.rs index c36c4524c1..8cfffdb686 100644 --- a/nexus/src/app/volume.rs +++ b/nexus/src/app/volume.rs @@ -5,9 +5,20 @@ //! Volumes use crate::app::sagas; +use nexus_db_model::UpstairsRepairNotification; +use nexus_db_model::UpstairsRepairNotificationType; use nexus_db_queries::authn; use nexus_db_queries::context::OpContext; use omicron_common::api::external::DeleteResult; +use omicron_common::api::internal::nexus::DownstairsClientStopRequest; +use omicron_common::api::internal::nexus::DownstairsClientStopped; +use omicron_common::api::internal::nexus::RepairFinishInfo; +use omicron_common::api::internal::nexus::RepairProgress; +use omicron_common::api::internal::nexus::RepairStartInfo; +use omicron_uuid_kinds::DownstairsKind; +use omicron_uuid_kinds::TypedUuid; +use omicron_uuid_kinds::UpstairsKind; +use omicron_uuid_kinds::UpstairsRepairKind; use std::sync::Arc; use uuid::Uuid; @@ -30,4 +41,155 @@ impl super::Nexus { Ok(()) } + + /// An Upstairs is telling us when a repair is starting. + pub(crate) async fn upstairs_repair_start( + self: &Arc, + opctx: &OpContext, + upstairs_id: TypedUuid, + repair_start_info: RepairStartInfo, + ) -> DeleteResult { + info!( + self.log, + "received upstairs_repair_start from upstairs {upstairs_id}: {:?}", + repair_start_info, + ); + + for repaired_downstairs in repair_start_info.repairs { + self.db_datastore + .upstairs_repair_notification( + opctx, + UpstairsRepairNotification::new( + repair_start_info.time, + repair_start_info.repair_id, + repair_start_info.repair_type.into(), + upstairs_id, + repair_start_info.session_id, + repaired_downstairs.region_uuid, + repaired_downstairs.target_addr, + UpstairsRepairNotificationType::Started, + ), + ) + .await?; + } + + Ok(()) + } + + /// An Upstairs is telling us when a repair is finished, and the result. + pub(crate) async fn upstairs_repair_finish( + self: &Arc, + opctx: &OpContext, + upstairs_id: TypedUuid, + repair_finish_info: RepairFinishInfo, + ) -> DeleteResult { + info!( + self.log, + "received upstairs_repair_finish from upstairs {upstairs_id}: {:?}", + repair_finish_info, + ); + + for repaired_downstairs in repair_finish_info.repairs { + self.db_datastore + .upstairs_repair_notification( + opctx, + UpstairsRepairNotification::new( + repair_finish_info.time, + repair_finish_info.repair_id, + repair_finish_info.repair_type.into(), + upstairs_id, + repair_finish_info.session_id, + repaired_downstairs.region_uuid, + repaired_downstairs.target_addr, + if repair_finish_info.aborted { + UpstairsRepairNotificationType::Failed + } else { + UpstairsRepairNotificationType::Succeeded + }, + ), + ) + .await?; + + if !repair_finish_info.aborted { + // TODO-followup if there's an active region replacement + // occurring, a successfully completed live repair can trigger a + // saga to destroy the original region. + } + } + + Ok(()) + } + + /// An Upstairs is updating us with repair progress + pub(crate) async fn upstairs_repair_progress( + self: &Arc, + opctx: &OpContext, + upstairs_id: TypedUuid, + repair_id: TypedUuid, + repair_progress: RepairProgress, + ) -> DeleteResult { + info!( + self.log, + "received upstairs_repair_progress from upstairs {upstairs_id} for repair {repair_id}: {:?}", + repair_progress, + ); + + self.db_datastore + .upstairs_repair_progress( + opctx, + upstairs_id, + repair_id, + repair_progress, + ) + .await + } + + /// An Upstairs is telling us that a Downstairs client task was requested to + /// stop + pub(crate) async fn downstairs_client_stop_request_notification( + self: &Arc, + opctx: &OpContext, + upstairs_id: TypedUuid, + downstairs_id: TypedUuid, + downstairs_client_stop_request: DownstairsClientStopRequest, + ) -> DeleteResult { + info!( + self.log, + "received downstairs_client_stop_request_notification from upstairs {upstairs_id} for downstairs {downstairs_id}: {:?}", + downstairs_client_stop_request, + ); + + self.db_datastore + .downstairs_client_stop_request_notification( + opctx, + upstairs_id, + downstairs_id, + downstairs_client_stop_request, + ) + .await + } + + /// An Upstairs is telling us that a Downstairs client task was stopped + pub(crate) async fn downstairs_client_stopped_notification( + self: &Arc, + opctx: &OpContext, + upstairs_id: TypedUuid, + downstairs_id: TypedUuid, + downstairs_client_stopped: DownstairsClientStopped, + ) -> DeleteResult { + info!( + self.log, + "received downstairs_client_stopped_notification from upstairs {upstairs_id} for downstairs {downstairs_id}: {:?}", + downstairs_client_stopped, + ); + + self.db_datastore + .downstairs_client_stopped_notification( + opctx, + upstairs_id, + downstairs_id, + downstairs_client_stopped, + ) + .await + } } diff --git a/nexus/src/internal_api/http_entrypoints.rs b/nexus/src/internal_api/http_entrypoints.rs index 9871c38117..0676ace70c 100644 --- a/nexus/src/internal_api/http_entrypoints.rs +++ b/nexus/src/internal_api/http_entrypoints.rs @@ -45,9 +45,18 @@ use omicron_common::api::external::http_pagination::ScanById; use omicron_common::api::external::http_pagination::ScanParams; use omicron_common::api::external::Error; use omicron_common::api::internal::nexus::DiskRuntimeState; +use omicron_common::api::internal::nexus::DownstairsClientStopRequest; +use omicron_common::api::internal::nexus::DownstairsClientStopped; use omicron_common::api::internal::nexus::ProducerEndpoint; +use omicron_common::api::internal::nexus::RepairFinishInfo; +use omicron_common::api::internal::nexus::RepairProgress; +use omicron_common::api::internal::nexus::RepairStartInfo; use omicron_common::api::internal::nexus::SledInstanceState; use omicron_common::update::ArtifactId; +use omicron_uuid_kinds::DownstairsKind; +use omicron_uuid_kinds::TypedUuid; +use omicron_uuid_kinds::UpstairsKind; +use omicron_uuid_kinds::UpstairsRepairKind; use oximeter::types::ProducerResults; use oximeter_producer::{collect, ProducerIdPathParams}; use schemars::JsonSchema; @@ -78,6 +87,12 @@ pub(crate) fn internal_api() -> NexusApiDescription { api.register(cpapi_metrics_collect)?; api.register(cpapi_artifact_download)?; + api.register(cpapi_upstairs_repair_start)?; + api.register(cpapi_upstairs_repair_finish)?; + api.register(cpapi_upstairs_repair_progress)?; + api.register(cpapi_downstairs_client_stop_request)?; + api.register(cpapi_downstairs_client_stopped)?; + api.register(saga_list)?; api.register(saga_view)?; @@ -513,6 +528,171 @@ async fn cpapi_artifact_download( Ok(HttpResponseOk(Body::from(body).into())) } +/// Path parameters for Upstairs requests (internal API) +#[derive(Deserialize, JsonSchema)] +struct UpstairsPathParam { + upstairs_id: TypedUuid, +} + +/// An Upstairs will notify this endpoint when a repair starts +#[endpoint { + method = POST, + path = "/crucible/0/upstairs/{upstairs_id}/repair-start", + }] +async fn cpapi_upstairs_repair_start( + rqctx: RequestContext>, + path_params: Path, + repair_start_info: TypedBody, +) -> Result { + let apictx = rqctx.context(); + let nexus = &apictx.nexus; + let path = path_params.into_inner(); + + let handler = async { + let opctx = crate::context::op_context_for_internal_api(&rqctx).await; + nexus + .upstairs_repair_start( + &opctx, + path.upstairs_id, + repair_start_info.into_inner(), + ) + .await?; + Ok(HttpResponseUpdatedNoContent()) + }; + apictx.internal_latencies.instrument_dropshot_handler(&rqctx, handler).await +} + +/// An Upstairs will notify this endpoint when a repair finishes. +#[endpoint { + method = POST, + path = "/crucible/0/upstairs/{upstairs_id}/repair-finish", + }] +async fn cpapi_upstairs_repair_finish( + rqctx: RequestContext>, + path_params: Path, + repair_finish_info: TypedBody, +) -> Result { + let apictx = rqctx.context(); + let nexus = &apictx.nexus; + let path = path_params.into_inner(); + + let handler = async { + let opctx = crate::context::op_context_for_internal_api(&rqctx).await; + nexus + .upstairs_repair_finish( + &opctx, + path.upstairs_id, + repair_finish_info.into_inner(), + ) + .await?; + Ok(HttpResponseUpdatedNoContent()) + }; + apictx.internal_latencies.instrument_dropshot_handler(&rqctx, handler).await +} + +/// Path parameters for Upstairs requests (internal API) +#[derive(Deserialize, JsonSchema)] +struct UpstairsRepairPathParam { + upstairs_id: TypedUuid, + repair_id: TypedUuid, +} + +/// An Upstairs will update this endpoint with the progress of a repair +#[endpoint { + method = POST, + path = "/crucible/0/upstairs/{upstairs_id}/repair/{repair_id}/progress", + }] +async fn cpapi_upstairs_repair_progress( + rqctx: RequestContext>, + path_params: Path, + repair_progress: TypedBody, +) -> Result { + let apictx = rqctx.context(); + let nexus = &apictx.nexus; + let path = path_params.into_inner(); + + let handler = async { + let opctx = crate::context::op_context_for_internal_api(&rqctx).await; + nexus + .upstairs_repair_progress( + &opctx, + path.upstairs_id, + path.repair_id, + repair_progress.into_inner(), + ) + .await?; + Ok(HttpResponseUpdatedNoContent()) + }; + apictx.internal_latencies.instrument_dropshot_handler(&rqctx, handler).await +} + +/// Path parameters for Downstairs requests (internal API) +#[derive(Deserialize, JsonSchema)] +struct UpstairsDownstairsPathParam { + upstairs_id: TypedUuid, + downstairs_id: TypedUuid, +} + +/// An Upstairs will update this endpoint if a Downstairs client task is +/// requested to stop +#[endpoint { + method = POST, + path = "/crucible/0/upstairs/{upstairs_id}/downstairs/{downstairs_id}/stop-request", + }] +async fn cpapi_downstairs_client_stop_request( + rqctx: RequestContext>, + path_params: Path, + downstairs_client_stop_request: TypedBody, +) -> Result { + let apictx = rqctx.context(); + let nexus = &apictx.nexus; + let path = path_params.into_inner(); + + let handler = async { + let opctx = crate::context::op_context_for_internal_api(&rqctx).await; + nexus + .downstairs_client_stop_request_notification( + &opctx, + path.upstairs_id, + path.downstairs_id, + downstairs_client_stop_request.into_inner(), + ) + .await?; + Ok(HttpResponseUpdatedNoContent()) + }; + apictx.internal_latencies.instrument_dropshot_handler(&rqctx, handler).await +} + +/// An Upstairs will update this endpoint if a Downstairs client task stops for +/// any reason (not just after being requested to) +#[endpoint { + method = POST, + path = "/crucible/0/upstairs/{upstairs_id}/downstairs/{downstairs_id}/stopped", + }] +async fn cpapi_downstairs_client_stopped( + rqctx: RequestContext>, + path_params: Path, + downstairs_client_stopped: TypedBody, +) -> Result { + let apictx = rqctx.context(); + let nexus = &apictx.nexus; + let path = path_params.into_inner(); + + let handler = async { + let opctx = crate::context::op_context_for_internal_api(&rqctx).await; + nexus + .downstairs_client_stopped_notification( + &opctx, + path.upstairs_id, + path.downstairs_id, + downstairs_client_stopped.into_inner(), + ) + .await?; + Ok(HttpResponseUpdatedNoContent()) + }; + apictx.internal_latencies.instrument_dropshot_handler(&rqctx, handler).await +} + // Sagas /// List sagas diff --git a/nexus/tests/integration_tests/volume_management.rs b/nexus/tests/integration_tests/volume_management.rs index 34f037ee8c..289446fe85 100644 --- a/nexus/tests/integration_tests/volume_management.rs +++ b/nexus/tests/integration_tests/volume_management.rs @@ -5,6 +5,7 @@ //! Tests that Nexus properly manages and cleans up Crucible resources //! associated with Volumes +use chrono::Utc; use dropshot::test_util::ClientTestContext; use http::method::Method; use http::StatusCode; @@ -24,6 +25,13 @@ use omicron_common::api::external::ByteCount; use omicron_common::api::external::Disk; use omicron_common::api::external::IdentityMetadataCreateParams; use omicron_common::api::external::Name; +use omicron_common::api::internal; +use omicron_uuid_kinds::DownstairsKind; +use omicron_uuid_kinds::DownstairsRegionKind; +use omicron_uuid_kinds::TypedUuid; +use omicron_uuid_kinds::UpstairsKind; +use omicron_uuid_kinds::UpstairsRepairKind; +use omicron_uuid_kinds::UpstairsSessionKind; use rand::prelude::SliceRandom; use rand::{rngs::StdRng, SeedableRng}; use sled_agent_client::types::{CrucibleOpts, VolumeConstructionRequest}; @@ -2552,3 +2560,763 @@ async fn test_volume_hard_delete_idempotent( datastore.volume_hard_delete(volume_id).await.unwrap(); datastore.volume_hard_delete(volume_id).await.unwrap(); } + +// internal API related tests + +/// Test that an Upstairs can reissue live repair notifications +#[nexus_test] +async fn test_upstairs_repair_notify_idempotent( + cptestctx: &ControlPlaneTestContext, +) { + let int_client = &cptestctx.internal_client; + + let upstairs_id: TypedUuid = TypedUuid::new_v4(); + let session_id: TypedUuid = TypedUuid::new_v4(); + let repair_id: TypedUuid = TypedUuid::new_v4(); + let region_id: TypedUuid = TypedUuid::new_v4(); + + // Send the same start request. + let notify_url = format!("/crucible/0/upstairs/{upstairs_id}/repair-start"); + + let request = internal::nexus::RepairStartInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345".parse().unwrap(), + }], + }; + + int_client + .make_request( + Method::POST, + ¬ify_url, + Some(request.clone()), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + int_client + .make_request( + Method::POST, + ¬ify_url, + Some(request), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + // Send the same finish request. + let notify_url = + format!("/crucible/0/upstairs/{upstairs_id}/repair-finish"); + + let request = internal::nexus::RepairFinishInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345".parse().unwrap(), + }], + aborted: false, + }; + + int_client + .make_request( + Method::POST, + ¬ify_url, + Some(request.clone()), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + int_client + .make_request( + Method::POST, + ¬ify_url, + Some(request), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); +} + +/// Test that an Upstairs cannot issue different finish statuses for the same +/// repair. +#[nexus_test] +async fn test_upstairs_repair_notify_different_finish_status( + cptestctx: &ControlPlaneTestContext, +) { + let int_client = &cptestctx.internal_client; + + let upstairs_id: TypedUuid = TypedUuid::new_v4(); + let session_id: TypedUuid = TypedUuid::new_v4(); + let repair_id: TypedUuid = TypedUuid::new_v4(); + let region_id: TypedUuid = TypedUuid::new_v4(); + + let notify_url = + format!("/crucible/0/upstairs/{upstairs_id}/repair-finish"); + + int_client + .make_request( + Method::POST, + ¬ify_url, + Some(internal::nexus::RepairFinishInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345" + .parse() + .unwrap(), + }], + aborted: false, // live repair was ok + }), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + int_client + .make_request( + Method::POST, + ¬ify_url, + Some(internal::nexus::RepairFinishInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345" + .parse() + .unwrap(), + }], + aborted: true, // live repair failed? + }), + StatusCode::CONFLICT, + ) + .await + .unwrap_err(); +} + +/// Test that the same Upstairs can rerun a repair again. +#[nexus_test] +async fn test_upstairs_repair_same_upstairs_retry( + cptestctx: &ControlPlaneTestContext, +) { + let int_client = &cptestctx.internal_client; + + let upstairs_id: TypedUuid = TypedUuid::new_v4(); + let session_id: TypedUuid = TypedUuid::new_v4(); + let repair_id: TypedUuid = TypedUuid::new_v4(); + let region_id: TypedUuid = TypedUuid::new_v4(); + + // Simulate one failed repair + + let notify_start_url = + format!("/crucible/0/upstairs/{upstairs_id}/repair-start"); + let notify_finish_url = + format!("/crucible/0/upstairs/{upstairs_id}/repair-finish"); + + int_client + .make_request( + Method::POST, + ¬ify_start_url, + Some(internal::nexus::RepairStartInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345" + .parse() + .unwrap(), + }], + }), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + int_client + .make_request( + Method::POST, + ¬ify_finish_url, + Some(internal::nexus::RepairFinishInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345" + .parse() + .unwrap(), + }], + aborted: true, + }), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + // Simulate the same Upstairs restarting the repair, which passes this time + + let repair_id: TypedUuid = TypedUuid::new_v4(); + + int_client + .make_request( + Method::POST, + ¬ify_start_url, + Some(internal::nexus::RepairStartInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345" + .parse() + .unwrap(), + }], + }), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + int_client + .make_request( + Method::POST, + ¬ify_finish_url, + Some(internal::nexus::RepairFinishInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345" + .parse() + .unwrap(), + }], + aborted: false, + }), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); +} + +/// Test that a different Upstairs session can rerun a repair again. +#[nexus_test] +async fn test_upstairs_repair_different_upstairs_retry( + cptestctx: &ControlPlaneTestContext, +) { + let int_client = &cptestctx.internal_client; + + let upstairs_id: TypedUuid = TypedUuid::new_v4(); + let session_id: TypedUuid = TypedUuid::new_v4(); + let repair_id: TypedUuid = TypedUuid::new_v4(); + let region_id: TypedUuid = TypedUuid::new_v4(); + + // Simulate one failed repair by one Upstairs + + let notify_start_url = + format!("/crucible/0/upstairs/{upstairs_id}/repair-start"); + let notify_finish_url = + format!("/crucible/0/upstairs/{upstairs_id}/repair-finish"); + + int_client + .make_request( + Method::POST, + ¬ify_start_url, + Some(internal::nexus::RepairStartInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345" + .parse() + .unwrap(), + }], + }), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + int_client + .make_request( + Method::POST, + ¬ify_finish_url, + Some(internal::nexus::RepairFinishInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345" + .parse() + .unwrap(), + }], + aborted: true, + }), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + // Simulate a different Upstairs session restarting the repair, which passes this time + + let session_id: TypedUuid = TypedUuid::new_v4(); + let repair_id: TypedUuid = TypedUuid::new_v4(); + + int_client + .make_request( + Method::POST, + ¬ify_start_url, + Some(internal::nexus::RepairStartInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345" + .parse() + .unwrap(), + }], + }), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + int_client + .make_request( + Method::POST, + ¬ify_finish_url, + Some(internal::nexus::RepairFinishInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345" + .parse() + .unwrap(), + }], + aborted: false, + }), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); +} + +/// Test that a different Upstairs session can rerun an interrupted repair +#[nexus_test] +async fn test_upstairs_repair_different_upstairs_retry_interrupted( + cptestctx: &ControlPlaneTestContext, +) { + let int_client = &cptestctx.internal_client; + + let upstairs_id: TypedUuid = TypedUuid::new_v4(); + let session_id: TypedUuid = TypedUuid::new_v4(); + let repair_id: TypedUuid = TypedUuid::new_v4(); + let region_id: TypedUuid = TypedUuid::new_v4(); + + // Simulate one failed repair by one Upstairs, which was interrupted (which + // leads to no finish message). + + let notify_start_url = + format!("/crucible/0/upstairs/{upstairs_id}/repair-start"); + let notify_finish_url = + format!("/crucible/0/upstairs/{upstairs_id}/repair-finish"); + + int_client + .make_request( + Method::POST, + ¬ify_start_url, + Some(internal::nexus::RepairStartInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345" + .parse() + .unwrap(), + }], + }), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + // Simulate a different Upstairs session restarting the interrupted repair, + // which passes this time + + let session_id: TypedUuid = TypedUuid::new_v4(); + let repair_id: TypedUuid = TypedUuid::new_v4(); + + int_client + .make_request( + Method::POST, + ¬ify_start_url, + Some(internal::nexus::RepairStartInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345" + .parse() + .unwrap(), + }], + }), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + int_client + .make_request( + Method::POST, + ¬ify_finish_url, + Some(internal::nexus::RepairFinishInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345" + .parse() + .unwrap(), + }], + aborted: false, + }), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); +} + +/// Test that the same repair ID cannot be used for different repair types +#[nexus_test] +async fn test_upstairs_repair_repair_id_and_type_conflict( + cptestctx: &ControlPlaneTestContext, +) { + let int_client = &cptestctx.internal_client; + + let upstairs_id: TypedUuid = TypedUuid::new_v4(); + let session_id: TypedUuid = TypedUuid::new_v4(); + let repair_id: TypedUuid = TypedUuid::new_v4(); + let region_id: TypedUuid = TypedUuid::new_v4(); + + let notify_start_url = + format!("/crucible/0/upstairs/{upstairs_id}/repair-start"); + + int_client + .make_request( + Method::POST, + ¬ify_start_url, + Some(internal::nexus::RepairStartInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345" + .parse() + .unwrap(), + }], + }), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + int_client + .make_request( + Method::POST, + ¬ify_start_url, + Some(internal::nexus::RepairStartInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: + internal::nexus::UpstairsRepairType::Reconciliation, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345" + .parse() + .unwrap(), + }], + }), + StatusCode::CONFLICT, + ) + .await + .unwrap_err(); +} + +/// Test that an Upstairs can submit progress for a repair +#[nexus_test] +async fn test_upstairs_repair_submit_progress( + cptestctx: &ControlPlaneTestContext, +) { + let int_client = &cptestctx.internal_client; + + let upstairs_id: TypedUuid = TypedUuid::new_v4(); + let session_id: TypedUuid = TypedUuid::new_v4(); + let repair_id: TypedUuid = TypedUuid::new_v4(); + let region_id: TypedUuid = TypedUuid::new_v4(); + + // A repair must be started before progress can be submitted + + let notify_start_url = + format!("/crucible/0/upstairs/{upstairs_id}/repair-start"); + + int_client + .make_request( + Method::POST, + ¬ify_start_url, + Some(internal::nexus::RepairStartInfo { + time: Utc::now(), + session_id, + repair_id, + repair_type: internal::nexus::UpstairsRepairType::Live, + repairs: vec![internal::nexus::DownstairsUnderRepair { + region_uuid: region_id, + target_addr: "[fd00:1122:3344:101::8]:12345" + .parse() + .unwrap(), + }], + }), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + let progress_url = format!( + "/crucible/0/upstairs/{upstairs_id}/repair/{repair_id}/progress" + ); + + for i in 0..100 { + int_client + .make_request( + Method::POST, + &progress_url, + Some(internal::nexus::RepairProgress { + time: Utc::now(), + current_item: i, + total_items: 100, + }), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + } +} + +/// Test that an Upstairs can't submit progress unless a repair was started +#[nexus_test] +async fn test_upstairs_repair_reject_submit_progress_when_no_repair( + cptestctx: &ControlPlaneTestContext, +) { + let int_client = &cptestctx.internal_client; + + let upstairs_id: TypedUuid = TypedUuid::new_v4(); + let repair_id: TypedUuid = TypedUuid::new_v4(); + + let progress_url = format!( + "/crucible/0/upstairs/{upstairs_id}/repair/{repair_id}/progress" + ); + + int_client + .make_request( + Method::POST, + &progress_url, + Some(internal::nexus::RepairProgress { + time: Utc::now(), + current_item: 10, + total_items: 100, + }), + StatusCode::NOT_FOUND, + ) + .await + .unwrap_err(); +} + +/// Test that an Upstairs can notify Nexus when a Downstairs client task is +/// requested to stop +#[nexus_test] +async fn test_upstairs_notify_downstairs_client_stop_request( + cptestctx: &ControlPlaneTestContext, +) { + let int_client = &cptestctx.internal_client; + + let upstairs_id: TypedUuid = TypedUuid::new_v4(); + let downstairs_id: TypedUuid = TypedUuid::new_v4(); + + let stop_request_url = format!( + "/crucible/0/upstairs/{upstairs_id}/downstairs/{downstairs_id}/stop-request" + ); + + // Make sure an Upstairs can re-send the notification + + let request = internal::nexus::DownstairsClientStopRequest { + time: Utc::now(), + reason: + internal::nexus::DownstairsClientStopRequestReason::TooManyOutstandingJobs, + }; + + int_client + .make_request( + Method::POST, + &stop_request_url, + Some(request.clone()), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + int_client + .make_request( + Method::POST, + &stop_request_url, + Some(request), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + // The client can be requested to stop for the same reason a different time + + let request = internal::nexus::DownstairsClientStopRequest { + time: Utc::now(), + reason: + internal::nexus::DownstairsClientStopRequestReason::TooManyOutstandingJobs, + }; + + int_client + .make_request( + Method::POST, + &stop_request_url, + Some(request), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + // The client can also be requested to stop for a different reason + + let request = internal::nexus::DownstairsClientStopRequest { + time: Utc::now(), + reason: internal::nexus::DownstairsClientStopRequestReason::IOError, + }; + + int_client + .make_request( + Method::POST, + &stop_request_url, + Some(request), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); +} + +/// Test that an Upstairs can notify Nexus when a Downstairs client task stops +#[nexus_test] +async fn test_upstairs_notify_downstairs_client_stops( + cptestctx: &ControlPlaneTestContext, +) { + let int_client = &cptestctx.internal_client; + + let upstairs_id: TypedUuid = TypedUuid::new_v4(); + let downstairs_id: TypedUuid = TypedUuid::new_v4(); + + let stopped_url = format!( + "/crucible/0/upstairs/{upstairs_id}/downstairs/{downstairs_id}/stopped" + ); + + // Make sure an Upstairs can re-send the notification + + let request = internal::nexus::DownstairsClientStopped { + time: Utc::now(), + reason: internal::nexus::DownstairsClientStoppedReason::ReadFailed, + }; + + int_client + .make_request( + Method::POST, + &stopped_url, + Some(request.clone()), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + int_client + .make_request( + Method::POST, + &stopped_url, + Some(request), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + // The client can stop for the same reason a different time + + let request = internal::nexus::DownstairsClientStopped { + time: Utc::now(), + reason: internal::nexus::DownstairsClientStoppedReason::ReadFailed, + }; + + int_client + .make_request( + Method::POST, + &stopped_url, + Some(request), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); + + // The client can also stop for a different reason + + let request = internal::nexus::DownstairsClientStopped { + time: Utc::now(), + reason: internal::nexus::DownstairsClientStoppedReason::Timeout, + }; + + int_client + .make_request( + Method::POST, + &stopped_url, + Some(request), + StatusCode::NO_CONTENT, + ) + .await + .unwrap(); +} diff --git a/openapi/nexus-internal.json b/openapi/nexus-internal.json index 09b5f1e5ab..679597c453 100644 --- a/openapi/nexus-internal.json +++ b/openapi/nexus-internal.json @@ -125,6 +125,217 @@ } } }, + "/crucible/0/upstairs/{upstairs_id}/downstairs/{downstairs_id}/stop-request": { + "post": { + "summary": "An Upstairs will update this endpoint if a Downstairs client task is", + "description": "requested to stop", + "operationId": "cpapi_downstairs_client_stop_request", + "parameters": [ + { + "in": "path", + "name": "downstairs_id", + "required": true, + "schema": { + "$ref": "#/components/schemas/TypedUuidForDownstairsKind" + } + }, + { + "in": "path", + "name": "upstairs_id", + "required": true, + "schema": { + "$ref": "#/components/schemas/TypedUuidForUpstairsKind" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DownstairsClientStopRequest" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "resource updated" + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + } + } + }, + "/crucible/0/upstairs/{upstairs_id}/downstairs/{downstairs_id}/stopped": { + "post": { + "summary": "An Upstairs will update this endpoint if a Downstairs client task stops for", + "description": "any reason (not just after being requested to)", + "operationId": "cpapi_downstairs_client_stopped", + "parameters": [ + { + "in": "path", + "name": "downstairs_id", + "required": true, + "schema": { + "$ref": "#/components/schemas/TypedUuidForDownstairsKind" + } + }, + { + "in": "path", + "name": "upstairs_id", + "required": true, + "schema": { + "$ref": "#/components/schemas/TypedUuidForUpstairsKind" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DownstairsClientStopped" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "resource updated" + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + } + } + }, + "/crucible/0/upstairs/{upstairs_id}/repair/{repair_id}/progress": { + "post": { + "summary": "An Upstairs will update this endpoint with the progress of a repair", + "operationId": "cpapi_upstairs_repair_progress", + "parameters": [ + { + "in": "path", + "name": "repair_id", + "required": true, + "schema": { + "$ref": "#/components/schemas/TypedUuidForUpstairsRepairKind" + } + }, + { + "in": "path", + "name": "upstairs_id", + "required": true, + "schema": { + "$ref": "#/components/schemas/TypedUuidForUpstairsKind" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RepairProgress" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "resource updated" + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + } + } + }, + "/crucible/0/upstairs/{upstairs_id}/repair-finish": { + "post": { + "summary": "An Upstairs will notify this endpoint when a repair finishes.", + "operationId": "cpapi_upstairs_repair_finish", + "parameters": [ + { + "in": "path", + "name": "upstairs_id", + "required": true, + "schema": { + "$ref": "#/components/schemas/TypedUuidForUpstairsKind" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RepairFinishInfo" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "resource updated" + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + } + } + }, + "/crucible/0/upstairs/{upstairs_id}/repair-start": { + "post": { + "summary": "An Upstairs will notify this endpoint when a repair starts", + "operationId": "cpapi_upstairs_repair_start", + "parameters": [ + { + "in": "path", + "name": "upstairs_id", + "required": true, + "schema": { + "$ref": "#/components/schemas/TypedUuidForUpstairsKind" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RepairStartInfo" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "resource updated" + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + } + } + }, "/deployment/blueprints/all": { "get": { "summary": "Lists blueprints", @@ -3649,6 +3860,81 @@ } ] }, + "DownstairsClientStopRequest": { + "type": "object", + "properties": { + "reason": { + "$ref": "#/components/schemas/DownstairsClientStopRequestReason" + }, + "time": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "reason", + "time" + ] + }, + "DownstairsClientStopRequestReason": { + "type": "string", + "enum": [ + "replacing", + "disabled", + "failed_reconcile", + "i_o_error", + "bad_negotiation_order", + "incompatible", + "failed_live_repair", + "too_many_outstanding_jobs", + "deactivated" + ] + }, + "DownstairsClientStopped": { + "type": "object", + "properties": { + "reason": { + "$ref": "#/components/schemas/DownstairsClientStoppedReason" + }, + "time": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "reason", + "time" + ] + }, + "DownstairsClientStoppedReason": { + "type": "string", + "enum": [ + "connection_timeout", + "connection_failed", + "timeout", + "write_failed", + "read_failed", + "requested_stop", + "finished", + "queue_closed", + "receive_task_cancelled" + ] + }, + "DownstairsUnderRepair": { + "type": "object", + "properties": { + "region_uuid": { + "$ref": "#/components/schemas/TypedUuidForDownstairsRegionKind" + }, + "target_addr": { + "type": "string" + } + }, + "required": [ + "region_uuid", + "target_addr" + ] + }, "Duration": { "type": "object", "properties": { @@ -6102,6 +6388,94 @@ "user_password_hash" ] }, + "RepairFinishInfo": { + "type": "object", + "properties": { + "aborted": { + "type": "boolean" + }, + "repair_id": { + "$ref": "#/components/schemas/TypedUuidForUpstairsRepairKind" + }, + "repair_type": { + "$ref": "#/components/schemas/UpstairsRepairType" + }, + "repairs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DownstairsUnderRepair" + } + }, + "session_id": { + "$ref": "#/components/schemas/TypedUuidForUpstairsSessionKind" + }, + "time": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "aborted", + "repair_id", + "repair_type", + "repairs", + "session_id", + "time" + ] + }, + "RepairProgress": { + "type": "object", + "properties": { + "current_item": { + "type": "integer", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "total_items": { + "type": "integer", + "format": "int64" + } + }, + "required": [ + "current_item", + "time", + "total_items" + ] + }, + "RepairStartInfo": { + "type": "object", + "properties": { + "repair_id": { + "$ref": "#/components/schemas/TypedUuidForUpstairsRepairKind" + }, + "repair_type": { + "$ref": "#/components/schemas/UpstairsRepairType" + }, + "repairs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DownstairsUnderRepair" + } + }, + "session_id": { + "$ref": "#/components/schemas/TypedUuidForUpstairsSessionKind" + }, + "time": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "repair_id", + "repair_type", + "repairs", + "session_id", + "time" + ] + }, "RouteConfig": { "type": "object", "properties": { @@ -6979,6 +7353,18 @@ "SwitchPutResponse": { "type": "object" }, + "TypedUuidForDownstairsRegionKind": { + "type": "string", + "format": "uuid" + }, + "TypedUuidForUpstairsRepairKind": { + "type": "string", + "format": "uuid" + }, + "TypedUuidForUpstairsSessionKind": { + "type": "string", + "format": "uuid" + }, "UninitializedSled": { "description": "A sled that has not been added to an initialized rack yet", "type": "object", @@ -7039,6 +7425,13 @@ "items" ] }, + "UpstairsRepairType": { + "type": "string", + "enum": [ + "live", + "reconciliation" + ] + }, "UserId": { "title": "A name unique within the parent collection", "description": "Names must begin with a lower case ASCII letter, be composed exclusively of lowercase ASCII, uppercase ASCII, numbers, and '-', and may not end with a '-'. Names cannot be a UUID though they may contain a UUID.", @@ -7125,6 +7518,14 @@ "type": "string", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" }, + "TypedUuidForDownstairsKind": { + "type": "string", + "format": "uuid" + }, + "TypedUuidForUpstairsKind": { + "type": "string", + "format": "uuid" + }, "IdSortMode": { "description": "Supported set of sort modes for scanning by id only.\n\nCurrently, we only support scanning in ascending order.", "oneOf": [ diff --git a/schema/crdb/43.0.0/up01.sql b/schema/crdb/43.0.0/up01.sql new file mode 100644 index 0000000000..b94f43eda7 --- /dev/null +++ b/schema/crdb/43.0.0/up01.sql @@ -0,0 +1,5 @@ +CREATE TYPE IF NOT EXISTS omicron.public.upstairs_repair_notification_type AS ENUM ( + 'started', + 'succeeded', + 'failed' +); diff --git a/schema/crdb/43.0.0/up02.sql b/schema/crdb/43.0.0/up02.sql new file mode 100644 index 0000000000..47c5f7f03a --- /dev/null +++ b/schema/crdb/43.0.0/up02.sql @@ -0,0 +1,4 @@ +CREATE TYPE IF NOT EXISTS omicron.public.upstairs_repair_type AS ENUM ( + 'live', + 'reconciliation' +); diff --git a/schema/crdb/43.0.0/up03.sql b/schema/crdb/43.0.0/up03.sql new file mode 100644 index 0000000000..a33c83c1ab --- /dev/null +++ b/schema/crdb/43.0.0/up03.sql @@ -0,0 +1,21 @@ +CREATE TABLE IF NOT EXISTS omicron.public.upstairs_repair_notification ( + time TIMESTAMPTZ NOT NULL, + + repair_id UUID NOT NULL, + repair_type omicron.public.upstairs_repair_type NOT NULL, + + upstairs_id UUID NOT NULL, + session_id UUID NOT NULL, + + region_id UUID NOT NULL, + target_ip INET NOT NULL, + target_port INT4 CHECK (target_port BETWEEN 0 AND 65535) NOT NULL, + + notification_type omicron.public.upstairs_repair_notification_type NOT NULL, + + /* + * A repair is uniquely identified by the four UUIDs here, and a + * notification is uniquely identified by its type. + */ + PRIMARY KEY (repair_id, upstairs_id, session_id, region_id, notification_type) +); diff --git a/schema/crdb/43.0.0/up04.sql b/schema/crdb/43.0.0/up04.sql new file mode 100644 index 0000000000..ed51c15a1e --- /dev/null +++ b/schema/crdb/43.0.0/up04.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS omicron.public.upstairs_repair_progress ( + repair_id UUID NOT NULL, + time TIMESTAMPTZ NOT NULL, + current_item INT8 NOT NULL, + total_items INT8 NOT NULL, + + PRIMARY KEY (repair_id, time, current_item, total_items) +); diff --git a/schema/crdb/43.0.0/up05.sql b/schema/crdb/43.0.0/up05.sql new file mode 100644 index 0000000000..16fb91d410 --- /dev/null +++ b/schema/crdb/43.0.0/up05.sql @@ -0,0 +1,11 @@ +CREATE TYPE IF NOT EXISTS omicron.public.downstairs_client_stop_request_reason_type AS ENUM ( + 'replacing', + 'disabled', + 'failed_reconcile', + 'io_error', + 'bad_negotiation_order', + 'incompatible', + 'failed_live_repair', + 'too_many_outstanding_jobs', + 'deactivated' +); diff --git a/schema/crdb/43.0.0/up06.sql b/schema/crdb/43.0.0/up06.sql new file mode 100644 index 0000000000..2cf45ce101 --- /dev/null +++ b/schema/crdb/43.0.0/up06.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS omicron.public.downstairs_client_stop_request_notification ( + time TIMESTAMPTZ NOT NULL, + upstairs_id UUID NOT NULL, + downstairs_id UUID NOT NULL, + reason omicron.public.downstairs_client_stop_request_reason_type NOT NULL, + + PRIMARY KEY (time, upstairs_id, downstairs_id, reason) +); diff --git a/schema/crdb/43.0.0/up07.sql b/schema/crdb/43.0.0/up07.sql new file mode 100644 index 0000000000..cb8903b1d3 --- /dev/null +++ b/schema/crdb/43.0.0/up07.sql @@ -0,0 +1,11 @@ +CREATE TYPE IF NOT EXISTS omicron.public.downstairs_client_stopped_reason_type AS ENUM ( + 'connection_timeout', + 'connection_failed', + 'timeout', + 'write_failed', + 'read_failed', + 'requested_stop', + 'finished', + 'queue_closed', + 'receive_task_cancelled' +); diff --git a/schema/crdb/43.0.0/up08.sql b/schema/crdb/43.0.0/up08.sql new file mode 100644 index 0000000000..6f898f382c --- /dev/null +++ b/schema/crdb/43.0.0/up08.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS omicron.public.downstairs_client_stopped_notification ( + time TIMESTAMPTZ NOT NULL, + upstairs_id UUID NOT NULL, + downstairs_id UUID NOT NULL, + reason omicron.public.downstairs_client_stopped_reason_type NOT NULL, + + PRIMARY KEY (time, upstairs_id, downstairs_id, reason) +); diff --git a/schema/crdb/dbinit.sql b/schema/crdb/dbinit.sql index 9895464fb5..255cdc8135 100644 --- a/schema/crdb/dbinit.sql +++ b/schema/crdb/dbinit.sql @@ -3552,6 +3552,90 @@ ALTER TABLE omicron.public.external_ip ADD COLUMN IF NOT EXISTS is_probe BOOL NO ALTER TYPE omicron.public.network_interface_kind ADD VALUE IF NOT EXISTS 'probe'; +CREATE TYPE IF NOT EXISTS omicron.public.upstairs_repair_notification_type AS ENUM ( + 'started', + 'succeeded', + 'failed' +); + +CREATE TYPE IF NOT EXISTS omicron.public.upstairs_repair_type AS ENUM ( + 'live', + 'reconciliation' +); + +CREATE TABLE IF NOT EXISTS omicron.public.upstairs_repair_notification ( + time TIMESTAMPTZ NOT NULL, + + repair_id UUID NOT NULL, + repair_type omicron.public.upstairs_repair_type NOT NULL, + + upstairs_id UUID NOT NULL, + session_id UUID NOT NULL, + + region_id UUID NOT NULL, + target_ip INET NOT NULL, + target_port INT4 CHECK (target_port BETWEEN 0 AND 65535) NOT NULL, + + notification_type omicron.public.upstairs_repair_notification_type NOT NULL, + + /* + * A repair is uniquely identified by the four UUIDs here, and a + * notification is uniquely identified by its type. + */ + PRIMARY KEY (repair_id, upstairs_id, session_id, region_id, notification_type) +); + +CREATE TABLE IF NOT EXISTS omicron.public.upstairs_repair_progress ( + repair_id UUID NOT NULL, + time TIMESTAMPTZ NOT NULL, + current_item INT8 NOT NULL, + total_items INT8 NOT NULL, + + PRIMARY KEY (repair_id, time, current_item, total_items) +); + +CREATE TYPE IF NOT EXISTS omicron.public.downstairs_client_stop_request_reason_type AS ENUM ( + 'replacing', + 'disabled', + 'failed_reconcile', + 'io_error', + 'bad_negotiation_order', + 'incompatible', + 'failed_live_repair', + 'too_many_outstanding_jobs', + 'deactivated' +); + +CREATE TABLE IF NOT EXISTS omicron.public.downstairs_client_stop_request_notification ( + time TIMESTAMPTZ NOT NULL, + upstairs_id UUID NOT NULL, + downstairs_id UUID NOT NULL, + reason omicron.public.downstairs_client_stop_request_reason_type NOT NULL, + + PRIMARY KEY (time, upstairs_id, downstairs_id, reason) +); + +CREATE TYPE IF NOT EXISTS omicron.public.downstairs_client_stopped_reason_type AS ENUM ( + 'connection_timeout', + 'connection_failed', + 'timeout', + 'write_failed', + 'read_failed', + 'requested_stop', + 'finished', + 'queue_closed', + 'receive_task_cancelled' +); + +CREATE TABLE IF NOT EXISTS omicron.public.downstairs_client_stopped_notification ( + time TIMESTAMPTZ NOT NULL, + upstairs_id UUID NOT NULL, + downstairs_id UUID NOT NULL, + reason omicron.public.downstairs_client_stopped_reason_type NOT NULL, + + PRIMARY KEY (time, upstairs_id, downstairs_id, reason) +); + /* * Metadata for the schema itself. This version number isn't great, as there's * nothing to ensure it gets bumped when it should be, but it's a start. @@ -3586,7 +3670,7 @@ INSERT INTO omicron.public.db_metadata ( version, target_version ) VALUES - ( TRUE, NOW(), NOW(), '42.0.0', NULL) + ( TRUE, NOW(), NOW(), '43.0.0', NULL) ON CONFLICT DO NOTHING; COMMIT; diff --git a/uuid-kinds/src/lib.rs b/uuid-kinds/src/lib.rs index 12bc756d68..7018485b59 100644 --- a/uuid-kinds/src/lib.rs +++ b/uuid-kinds/src/lib.rs @@ -45,6 +45,11 @@ macro_rules! impl_typed_uuid_kind { // Please keep this list in alphabetical order. impl_typed_uuid_kind! { + DownstairsKind => "downstairs", + DownstairsRegionKind => "downstairs_region", LoopbackAddressKind => "loopback_address", TufRepoKind => "tuf_repo", + UpstairsKind => "upstairs", + UpstairsRepairKind => "upstairs_repair", + UpstairsSessionKind => "upstairs_session", } From 75ad4a91cbc89392f548da32b0cb8e34b47d45ed Mon Sep 17 00:00:00 2001 From: Sean Klein Date: Thu, 14 Mar 2024 18:17:11 -0700 Subject: [PATCH 3/5] Removes test_complex from the reconfigurator test suite (#5268) This test has a lot of value, but could benefit from a little more automation to avoid round-trips for developers. Me putting up this PR is decidedly "an opinion" though, and I can alter course here if we want to discuss things more. --- .../tests/input/complex.json | 8655 ----------------- .../reconfigurator-cli/tests/test_basic.rs | 88 - 2 files changed, 8743 deletions(-) delete mode 100644 dev-tools/reconfigurator-cli/tests/input/complex.json diff --git a/dev-tools/reconfigurator-cli/tests/input/complex.json b/dev-tools/reconfigurator-cli/tests/input/complex.json deleted file mode 100644 index 67f1881147..0000000000 --- a/dev-tools/reconfigurator-cli/tests/input/complex.json +++ /dev/null @@ -1,8655 +0,0 @@ -{ - "policy": { - "sleds": { - "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b": { - "policy": { - "kind": "in_service", - "provision_policy": "provisionable" - }, - "state": "active", - "zpools": [ - "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03", - "oxp_24b4dc85-ab45-49fb-a4b4-d351ae214c03", - "oxp_d452a7f5-b528-40fe-80ff-4e4189e2d52b", - "oxp_e4b4dc85-ab45-49fb-a4b4-d351ae214c03", - "oxp_f4b4dc85-ab45-49fb-a4b4-d351ae214c03" - ], - "subnet": { - "net": "fd00:1122:3344:103::/64" - } - }, - "67a1268b-52d3-4159-b3ed-7a0777f1f340": { - "policy": { - "kind": "in_service", - "provision_policy": "provisionable" - }, - "state": "active", - "zpools": [ - "oxp_14b4dc87-ab46-49fb-a4b4-d361ae214c03", - "oxp_24b4dc87-ab46-49fb-a4b4-d361ae214c03", - "oxp_d462a7f7-b628-40fe-80ff-4e4189e2d62b", - "oxp_e4b4dc87-ab46-49fb-a4b4-d361ae214c03", - "oxp_f4b4dc87-ab46-49fb-a4b4-d361ae214c03" - ], - "subnet": { - "net": "fd00:1122:3344:104::/64" - } - }, - "77851655-10a5-4e80-88b0-a001473cab7e": { - "policy": { - "kind": "in_service", - "provision_policy": "provisionable" - }, - "state": "active", - "zpools": [ - "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03", - "oxp_24b4dc86-ab46-49fb-a4b4-d361ae214c03", - "oxp_d462a7f6-b628-40fe-80ff-4e4189e2d62b", - "oxp_e4b4dc86-ab46-49fb-a4b4-d361ae214c03", - "oxp_f4b4dc86-ab46-49fb-a4b4-d361ae214c03" - ], - "subnet": { - "net": "fd00:1122:3344:102::/64" - } - }, - "f122b3a2-e383-4e42-b2a5-74a69a9d110a": { - "policy": { - "kind": "in_service", - "provision_policy": "provisionable" - }, - "state": "active", - "zpools": [ - "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03", - "oxp_24b4dc84-ab46-49fb-a4b4-d361ae214c03", - "oxp_d462a4f4-b628-40fe-80ff-4e4189e2d62b", - "oxp_e4b4dc84-ab46-49fb-a4b4-d361ae214c03", - "oxp_f4b4dc84-ab46-49fb-a4b4-d361ae214c03" - ], - "subnet": { - "net": "fd00:1122:3344:101::/64" - } - } - }, - "service_ip_pool_ranges": [ - { - "first": "198.51.100.20", - "last": "198.51.100.29" - } - ], - "target_nexus_zone_count": 3 - }, - "collections": [ - { - "id": "3f61b723-cfe7-40ec-b22c-e3e1f35325f9", - "errors": [], - "time_started": "2024-03-12T18:59:34.196825Z", - "time_done": "2024-03-12T18:59:34.397868Z", - "collector": "0d459323-e414-4f32-9944-76c7331da622", - "baseboards": [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "part_number": "i86pc", - "serial_number": "g3" - } - ], - "cabooses": [ - { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - }, - { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - }, - { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimSidecar", - "version": "0.0.1" - }, - { - "board": "SimSidecarSp", - "git_commit": "ffffffff", - "name": "SimSidecar", - "version": "0.0.1" - } - ], - "rot_pages": [ - { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "c2lkZWNhci1jZnBhLWFjdGl2ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "c2lkZWNhci1jZnBhLWluYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "c2lkZWNhci1jZnBhLXNjcmF0Y2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "c2lkZWNhci1jbXBhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - ], - "sps": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T18:59:34.203615Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "switch", - "sp_slot": 1, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T18:59:34.208589Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "sled", - "sp_slot": 0, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T18:59:34.214982Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "sled", - "sp_slot": 1, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T18:59:34.220269Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "sled", - "sp_slot": 2, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T18:59:34.198632Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "sled", - "sp_slot": 3, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ] - ], - "rots": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T18:59:34.203615Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T18:59:34.208589Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T18:59:34.214982Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T18:59:34.220269Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T18:59:34.198632Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ] - ], - "cabooses_found": { - "SpSlot0": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T18:59:34.204198Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimSidecarSp", - "git_commit": "ffffffff", - "name": "SimSidecar", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T18:59:34.209189Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T18:59:34.215708Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T18:59:34.220965Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T18:59:34.199229Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ] - ], - "SpSlot1": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T18:59:34.204765Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimSidecarSp", - "git_commit": "ffffffff", - "name": "SimSidecar", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T18:59:34.209887Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T18:59:34.216379Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T18:59:34.221612Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T18:59:34.199808Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ] - ], - "RotSlotA": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T18:59:34.205525Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimSidecar", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T18:59:34.210499Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T18:59:34.217080Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T18:59:34.222264Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T18:59:34.200511Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ] - ], - "RotSlotB": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T18:59:34.206173Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimSidecar", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T18:59:34.211127Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T18:59:34.217758Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T18:59:34.222982Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T18:59:34.201220Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ] - ] - }, - "rot_pages_found": { - "Cmpa": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T18:59:34.206630Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "c2lkZWNhci1jbXBhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T18:59:34.211561Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T18:59:34.218199Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T18:59:34.223472Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T18:59:34.201705Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ] - ], - "CfpaActive": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T18:59:34.207099Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "c2lkZWNhci1jZnBhLWFjdGl2ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T18:59:34.212036Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T18:59:34.218655Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T18:59:34.223978Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T18:59:34.202177Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ] - ], - "CfpaInactive": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T18:59:34.207582Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "c2lkZWNhci1jZnBhLWluYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T18:59:34.212533Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T18:59:34.219102Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T18:59:34.224471Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T18:59:34.202661Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ] - ], - "CfpaScratch": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T18:59:34.208087Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "c2lkZWNhci1jZnBhLXNjcmF0Y2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T18:59:34.213042Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T18:59:34.219676Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T18:59:34.224951Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T18:59:34.203171Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ] - ] - }, - "sled_agents": { - "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b": { - "time_collected": "2024-03-12T18:59:34.262487Z", - "source": "http://[fd00:1122:3344:103::1]:12345", - "sled_id": "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b", - "baseboard_id": null, - "sled_agent_address": "[fd00:1122:3344:103::1]:12345", - "sled_role": "gimlet", - "usable_hardware_threads": 8, - "usable_physical_ram": 8582262784, - "reservoir_size": 0, - "disks": [ - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-a452a7f5-b528-40fe-80ff-4e4189e2d52b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1024 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-b452a7f5-b528-40fe-80ff-4e4189e2d52b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1025 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-d452a7f5-b528-40fe-80ff-4e4189e2d52b", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1026 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-e4b4dc85-ab45-49fb-a4b4-d351ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1027 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-f4b4dc85-ab45-49fb-a4b4-d351ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1028 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-14b4dc85-ab45-49fb-a4b4-d351ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1029 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-24b4dc85-ab45-49fb-a4b4-d351ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1030 - } - ] - }, - "67a1268b-52d3-4159-b3ed-7a0777f1f340": { - "time_collected": "2024-03-12T18:59:34.306155Z", - "source": "http://[fd00:1122:3344:104::1]:12345", - "sled_id": "67a1268b-52d3-4159-b3ed-7a0777f1f340", - "baseboard_id": null, - "sled_agent_address": "[fd00:1122:3344:104::1]:12345", - "sled_role": "scrimlet", - "usable_hardware_threads": 8, - "usable_physical_ram": 8582262784, - "reservoir_size": 0, - "disks": [ - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-a462a7f7-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1024 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-b462a7f7-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1025 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-d462a7f7-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1026 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-e4b4dc87-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1027 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-f4b4dc87-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1028 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-14b4dc87-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1029 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-24b4dc87-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1030 - } - ] - }, - "77851655-10a5-4e80-88b0-a001473cab7e": { - "time_collected": "2024-03-12T18:59:34.349258Z", - "source": "http://[fd00:1122:3344:102::1]:12345", - "sled_id": "77851655-10a5-4e80-88b0-a001473cab7e", - "baseboard_id": null, - "sled_agent_address": "[fd00:1122:3344:102::1]:12345", - "sled_role": "gimlet", - "usable_hardware_threads": 8, - "usable_physical_ram": 8582262784, - "reservoir_size": 0, - "disks": [ - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-a462a7f6-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1024 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-b462a7f6-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1025 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-d462a7f6-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1026 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-e4b4dc86-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1027 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-f4b4dc86-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1028 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-14b4dc86-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1029 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-24b4dc86-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1030 - } - ] - }, - "f122b3a2-e383-4e42-b2a5-74a69a9d110a": { - "time_collected": "2024-03-12T18:59:34.392838Z", - "source": "http://[fd00:1122:3344:101::1]:12345", - "sled_id": "f122b3a2-e383-4e42-b2a5-74a69a9d110a", - "baseboard_id": null, - "sled_agent_address": "[fd00:1122:3344:101::1]:12345", - "sled_role": "scrimlet", - "usable_hardware_threads": 8, - "usable_physical_ram": 8582262784, - "reservoir_size": 0, - "disks": [ - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-a462a4f4-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1024 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-b462a4f4-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1025 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-d462a4f4-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1026 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-e4b4dc84-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1027 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-f4b4dc84-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1028 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-14b4dc84-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1029 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-24b4dc84-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1030 - } - ] - } - }, - "omicron_zones": { - "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b": { - "time_collected": "2024-03-12T18:59:34.266337Z", - "source": "http://[fd00:1122:3344:103::1]:12345", - "sled_id": "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b", - "zones": { - "generation": 5, - "zones": [ - { - "id": "0db88baf-911d-47bb-af71-3aebd7c96934", - "underlay_address": "fd00:1122:3344:103::4", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.22", - "external_tls": false, - "internal_address": "[fd00:1122:3344:103::4]:12221", - "nic": { - "id": "8847a09c-cabc-429b-bf46-66d5e2e1140c", - "kind": { - "type": "service", - "id": "0db88baf-911d-47bb-af71-3aebd7c96934" - }, - "name": "nexus-0db88baf-911d-47bb-af71-3aebd7c96934", - "ip": "172.30.2.5", - "mac": "A8:40:25:FF:CC:DA", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "213d7dd3-95a4-45a7-99ca-e4899991dab4", - "underlay_address": "fd00:1122:3344:103::6", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::6]:32345", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "218f36a5-9e51-4b88-ad1a-da4d85c246c4", - "underlay_address": "fd00:1122:3344:3::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - }, - "dns_address": "[fd00:1122:3344:3::1]:53", - "gz_address": "fd00:1122:3344:3::2", - "gz_address_index": 2, - "http_address": "[fd00:1122:3344:3::1]:5353" - } - }, - { - "id": "40c47ead-3be8-4724-a8ef-b66233fc5c65", - "underlay_address": "fd00:1122:3344:103::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::7]:32345", - "dataset": { - "pool_name": "oxp_24b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "425d9d2f-72ea-4f53-80b6-04e002771cdb", - "underlay_address": "fd00:1122:3344:103::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::9]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "46a050b6-37b8-47b9-b4ae-ccb736ecd6d5", - "underlay_address": "fd00:1122:3344:103::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::8]:32345", - "dataset": { - "pool_name": "oxp_d452a7f5-b528-40fe-80ff-4e4189e2d52b" - } - } - }, - { - "id": "4ea8104f-2cfc-4599-9d2c-bcfd8f0b71fd", - "underlay_address": "fd00:1122:3344:103::5", - "zone_type": { - "type": "clickhouse", - "address": "[fd00:1122:3344:103::5]:8123", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "7611a549-effc-41b6-b6cb-c03e0c70a31f", - "underlay_address": "fd00:1122:3344:103::b", - "zone_type": { - "type": "internal_ntp", - "address": "[fd00:1122:3344:103::b]:123", - "dns_servers": [ - "fd00:1122:3344:1::1", - "fd00:1122:3344:2::1", - "fd00:1122:3344:3::1" - ], - "ntp_servers": [ - "8494befe-6df6-42d1-9baa-599ba4228430.host.control-plane.oxide.internal", - "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded.host.control-plane.oxide.internal" - ] - } - }, - { - "id": "af7ccead-2bd8-4a8a-9fbf-3b788d180139", - "underlay_address": "fd00:1122:3344:103::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:103::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "d4428e41-ad7b-41f0-bde6-7c7c955f20c1", - "underlay_address": "fd00:1122:3344:103::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::a]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - } - ] - } - }, - "67a1268b-52d3-4159-b3ed-7a0777f1f340": { - "time_collected": "2024-03-12T18:59:34.311965Z", - "source": "http://[fd00:1122:3344:104::1]:12345", - "sled_id": "67a1268b-52d3-4159-b3ed-7a0777f1f340", - "zones": { - "generation": 5, - "zones": [ - { - "id": "1ebea0c3-1bfd-472c-9f84-ac9e23b32707", - "underlay_address": "fd00:1122:3344:104::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "2e9dfa8f-5371-48e5-b7f7-62a6af8283c1", - "underlay_address": "fd00:1122:3344:104::4", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:104::4]:32221", - "dataset": { - "pool_name": "oxp_24b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "57c712a6-6429-44b7-a9b2-9957cb9054d4", - "underlay_address": "fd00:1122:3344:104::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "59c4c9f0-bea9-46b7-ae9d-fb6dc1d658b9", - "underlay_address": "fd00:1122:3344:104::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "73916098-788f-48d8-b745-e13fdcfb771b", - "underlay_address": "fd00:1122:3344:104::c", - "zone_type": { - "type": "internal_ntp", - "address": "[fd00:1122:3344:104::c]:123", - "dns_servers": [ - "fd00:1122:3344:1::1", - "fd00:1122:3344:2::1", - "fd00:1122:3344:3::1" - ], - "ntp_servers": [ - "8494befe-6df6-42d1-9baa-599ba4228430.host.control-plane.oxide.internal", - "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded.host.control-plane.oxide.internal" - ] - } - }, - { - "id": "9bb513e3-7505-416c-aa70-b26f1152bbdc", - "underlay_address": "fd00:1122:3344:104::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::9]:32345", - "dataset": { - "pool_name": "oxp_d462a7f7-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "9c14c879-137b-4f5b-8068-1292bffc83ed", - "underlay_address": "fd00:1122:3344:104::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:104::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "9cf90589-5da1-4b42-b09b-d784e4134637", - "underlay_address": "fd00:1122:3344:104::5", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.23", - "external_tls": false, - "internal_address": "[fd00:1122:3344:104::5]:12221", - "nic": { - "id": "fa76e7e1-dee6-4574-b71f-e07ea1cffd08", - "kind": { - "type": "service", - "id": "9cf90589-5da1-4b42-b09b-d784e4134637" - }, - "name": "nexus-9cf90589-5da1-4b42-b09b-d784e4134637", - "ip": "172.30.2.6", - "mac": "A8:40:25:FF:C4:6F", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "d48b2dfa-c749-47dd-98b6-3f478cd63934", - "underlay_address": "fd00:1122:3344:104::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:104::6]:17000" - } - }, - { - "id": "fd003bee-818a-4c95-aae5-e378ac601522", - "underlay_address": "fd00:1122:3344:104::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - } - ] - } - }, - "77851655-10a5-4e80-88b0-a001473cab7e": { - "time_collected": "2024-03-12T18:59:34.356678Z", - "source": "http://[fd00:1122:3344:102::1]:12345", - "sled_id": "77851655-10a5-4e80-88b0-a001473cab7e", - "zones": { - "generation": 5, - "zones": [ - { - "id": "084cac6e-44b5-4333-a2ff-b0993b534898", - "underlay_address": "fd00:1122:3344:102::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "11c527c5-0598-428e-9270-be5b74d3461b", - "underlay_address": "fd00:1122:3344:102::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:102::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "20be9299-495d-428d-b315-694c2c4b64af", - "underlay_address": "fd00:1122:3344:102::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:102::6]:17000" - } - }, - { - "id": "2b29cb95-f8c6-4aff-acc0-1c0a627be392", - "underlay_address": "fd00:1122:3344:102::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "8d452bdd-e8b8-4108-a690-46fc59197db0", - "underlay_address": "fd00:1122:3344:102::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "953019c0-8e85-4417-b231-d42820470125", - "underlay_address": "fd00:1122:3344:102::5", - "zone_type": { - "type": "oximeter", - "address": "[fd00:1122:3344:102::5]:12223" - } - }, - { - "id": "99c635b9-8e97-414a-8316-8261d2d767d0", - "underlay_address": "fd00:1122:3344:102::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "cbe1abfa-0063-44b2-9ce7-7ad76b403a94", - "underlay_address": "fd00:1122:3344:2::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "[fd00:1122:3344:2::1]:53", - "gz_address": "fd00:1122:3344:2::2", - "gz_address_index": 1, - "http_address": "[fd00:1122:3344:2::1]:5353" - } - }, - { - "id": "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded", - "underlay_address": "fd00:1122:3344:102::c", - "zone_type": { - "type": "boundary_ntp", - "address": "[fd00:1122:3344:102::c]:123", - "dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "nic": { - "id": "659f33f7-e7bd-4875-9140-bf8a8b2d964a", - "kind": { - "type": "service", - "id": "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded" - }, - "name": "ntp-d52e797a-8fff-4e1e-a5ff-0ab8c8293ded", - "ip": "172.30.3.6", - "mac": "A8:40:25:FF:B1:99", - "subnet": "172.30.3.0/24", - "vni": 100, - "primary": true, - "slot": 0 - }, - "ntp_servers": [ - "time.cloudflare.com" - ], - "snat_cfg": { - "ip": "198.51.100.26", - "first_port": 16384, - "last_port": 32767 - } - } - }, - { - "id": "dc7f703a-27d1-4802-b85d-5629ddb2d67c", - "underlay_address": "fd00:1122:3344:102::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::9]:32345", - "dataset": { - "pool_name": "oxp_d462a7f6-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "f0ed9838-6f1b-4646-a478-9f74f2e6e802", - "underlay_address": "fd00:1122:3344:102::4", - "zone_type": { - "type": "external_dns", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "198.51.100.21:53", - "http_address": "[fd00:1122:3344:102::4]:5353", - "nic": { - "id": "d4dd2f7a-8a3b-405e-8444-62f99a754a8a", - "kind": { - "type": "service", - "id": "f0ed9838-6f1b-4646-a478-9f74f2e6e802" - }, - "name": "external-dns-f0ed9838-6f1b-4646-a478-9f74f2e6e802", - "ip": "172.30.1.6", - "mac": "A8:40:25:FF:F4:5C", - "subnet": "172.30.1.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - } - ] - } - }, - "f122b3a2-e383-4e42-b2a5-74a69a9d110a": { - "time_collected": "2024-03-12T18:59:34.396440Z", - "source": "http://[fd00:1122:3344:101::1]:12345", - "sled_id": "f122b3a2-e383-4e42-b2a5-74a69a9d110a", - "zones": { - "generation": 5, - "zones": [ - { - "id": "0d459323-e414-4f32-9944-76c7331da622", - "underlay_address": "fd00:1122:3344:101::5", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.24", - "external_tls": false, - "internal_address": "[fd00:1122:3344:101::5]:12221", - "nic": { - "id": "514902b8-7a1a-42a3-95a6-d00861833b5c", - "kind": { - "type": "service", - "id": "0d459323-e414-4f32-9944-76c7331da622" - }, - "name": "nexus-0d459323-e414-4f32-9944-76c7331da622", - "ip": "172.30.2.7", - "mac": "A8:40:25:FF:DE:AC", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "2902972b-3ae4-489d-b937-6480352e214a", - "underlay_address": "fd00:1122:3344:101::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "2ee832de-af75-47ac-abac-f91304857ca4", - "underlay_address": "fd00:1122:3344:101::4", - "zone_type": { - "type": "external_dns", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "198.51.100.20:53", - "http_address": "[fd00:1122:3344:101::4]:5353", - "nic": { - "id": "fadff4ab-62d7-466a-9203-04080e4078ed", - "kind": { - "type": "service", - "id": "2ee832de-af75-47ac-abac-f91304857ca4" - }, - "name": "external-dns-2ee832de-af75-47ac-abac-f91304857ca4", - "ip": "172.30.1.5", - "mac": "A8:40:25:FF:B4:93", - "subnet": "172.30.1.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "30050a7e-7fc3-4965-b07b-1635212393eb", - "underlay_address": "fd00:1122:3344:101::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:101::6]:17000" - } - }, - { - "id": "8494befe-6df6-42d1-9baa-599ba4228430", - "underlay_address": "fd00:1122:3344:101::c", - "zone_type": { - "type": "boundary_ntp", - "address": "[fd00:1122:3344:101::c]:123", - "dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "nic": { - "id": "23041748-e3a6-4846-930d-5a348c316e91", - "kind": { - "type": "service", - "id": "8494befe-6df6-42d1-9baa-599ba4228430" - }, - "name": "ntp-8494befe-6df6-42d1-9baa-599ba4228430", - "ip": "172.30.3.5", - "mac": "A8:40:25:FF:D1:C4", - "subnet": "172.30.3.0/24", - "vni": 100, - "primary": true, - "slot": 0 - }, - "ntp_servers": [ - "time.cloudflare.com" - ], - "snat_cfg": { - "ip": "198.51.100.25", - "first_port": 0, - "last_port": 16383 - } - } - }, - { - "id": "92cba955-3a5a-4d82-b0f2-30e89d4556d1", - "underlay_address": "fd00:1122:3344:101::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "9ba4cda7-d2e4-4c44-b1a6-8ddfe676098b", - "underlay_address": "fd00:1122:3344:101::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:101::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "e668e3f5-5457-4689-97da-b2af537787ac", - "underlay_address": "fd00:1122:3344:101::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "f32fd972-7f40-4c58-9e00-7fc5c44273f4", - "underlay_address": "fd00:1122:3344:101::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::9]:32345", - "dataset": { - "pool_name": "oxp_d462a4f4-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "f8c79ba4-194a-4cfe-8090-5315e297b780", - "underlay_address": "fd00:1122:3344:1::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "[fd00:1122:3344:1::1]:53", - "gz_address": "fd00:1122:3344:1::2", - "gz_address_index": 0, - "http_address": "[fd00:1122:3344:1::1]:5353" - } - }, - { - "id": "fa5e0176-b4a8-4598-aa31-40fd562d246c", - "underlay_address": "fd00:1122:3344:101::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - } - ] - } - } - } - }, - { - "id": "37c212f1-bfdd-4cfd-a17c-e65bd93bea5f", - "errors": [], - "time_started": "2024-03-12T19:07:28.237276Z", - "time_done": "2024-03-12T19:07:28.472922Z", - "collector": "0db88baf-911d-47bb-af71-3aebd7c96934", - "baseboards": [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "part_number": "i86pc", - "serial_number": "g3" - } - ], - "cabooses": [ - { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - }, - { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - }, - { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimSidecar", - "version": "0.0.1" - }, - { - "board": "SimSidecarSp", - "git_commit": "ffffffff", - "name": "SimSidecar", - "version": "0.0.1" - } - ], - "rot_pages": [ - { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "c2lkZWNhci1jZnBhLWFjdGl2ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "c2lkZWNhci1jZnBhLWluYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "c2lkZWNhci1jZnBhLXNjcmF0Y2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "c2lkZWNhci1jbXBhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - ], - "sps": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.244597Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "switch", - "sp_slot": 1, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.251644Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "sled", - "sp_slot": 0, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.257993Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "sled", - "sp_slot": 1, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.263543Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "sled", - "sp_slot": 2, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.239320Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "sled", - "sp_slot": 3, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ] - ], - "rots": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.244597Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.251644Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.257993Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.263543Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.239320Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ] - ], - "cabooses_found": { - "SpSlot0": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.245320Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimSidecarSp", - "git_commit": "ffffffff", - "name": "SimSidecar", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.252625Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.258749Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.273088Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.240046Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ] - ], - "SpSlot1": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.245980Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimSidecarSp", - "git_commit": "ffffffff", - "name": "SimSidecar", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.253364Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.259496Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.273807Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.240736Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ] - ], - "RotSlotA": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.246605Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimSidecar", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.254069Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.260195Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.274568Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.241356Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ] - ], - "RotSlotB": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.247577Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimSidecar", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.254910Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.260882Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.275221Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.241947Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ] - ] - }, - "rot_pages_found": { - "Cmpa": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.248572Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "c2lkZWNhci1jbXBhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.255711Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.261401Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.275673Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.242430Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ] - ], - "CfpaActive": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.249231Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "c2lkZWNhci1jZnBhLWFjdGl2ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.256314Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.261975Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.276189Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.242948Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ] - ], - "CfpaInactive": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.249902Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "c2lkZWNhci1jZnBhLWluYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.256959Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.262485Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.276907Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.243514Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ] - ], - "CfpaScratch": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.250611Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "c2lkZWNhci1jZnBhLXNjcmF0Y2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.257483Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.262983Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.277386Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.244032Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ] - ] - }, - "sled_agents": { - "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b": { - "time_collected": "2024-03-12T19:07:28.330250Z", - "source": "http://[fd00:1122:3344:103::1]:12345", - "sled_id": "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b", - "baseboard_id": null, - "sled_agent_address": "[fd00:1122:3344:103::1]:12345", - "sled_role": "gimlet", - "usable_hardware_threads": 8, - "usable_physical_ram": 8582262784, - "reservoir_size": 0, - "disks": [ - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-a452a7f5-b528-40fe-80ff-4e4189e2d52b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1024 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-b452a7f5-b528-40fe-80ff-4e4189e2d52b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1025 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-d452a7f5-b528-40fe-80ff-4e4189e2d52b", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1026 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-e4b4dc85-ab45-49fb-a4b4-d351ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1027 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-f4b4dc85-ab45-49fb-a4b4-d351ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1028 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-14b4dc85-ab45-49fb-a4b4-d351ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1029 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-24b4dc85-ab45-49fb-a4b4-d351ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1030 - } - ] - }, - "67a1268b-52d3-4159-b3ed-7a0777f1f340": { - "time_collected": "2024-03-12T19:07:28.371508Z", - "source": "http://[fd00:1122:3344:104::1]:12345", - "sled_id": "67a1268b-52d3-4159-b3ed-7a0777f1f340", - "baseboard_id": null, - "sled_agent_address": "[fd00:1122:3344:104::1]:12345", - "sled_role": "scrimlet", - "usable_hardware_threads": 8, - "usable_physical_ram": 8582262784, - "reservoir_size": 0, - "disks": [ - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-a462a7f7-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1024 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-b462a7f7-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1025 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-d462a7f7-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1026 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-e4b4dc87-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1027 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-f4b4dc87-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1028 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-14b4dc87-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1029 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-24b4dc87-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1030 - } - ] - }, - "77851655-10a5-4e80-88b0-a001473cab7e": { - "time_collected": "2024-03-12T19:07:28.409958Z", - "source": "http://[fd00:1122:3344:102::1]:12345", - "sled_id": "77851655-10a5-4e80-88b0-a001473cab7e", - "baseboard_id": null, - "sled_agent_address": "[fd00:1122:3344:102::1]:12345", - "sled_role": "gimlet", - "usable_hardware_threads": 8, - "usable_physical_ram": 8582262784, - "reservoir_size": 0, - "disks": [ - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-a462a7f6-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1024 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-b462a7f6-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1025 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-d462a7f6-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1026 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-e4b4dc86-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1027 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-f4b4dc86-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1028 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-14b4dc86-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1029 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-24b4dc86-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1030 - } - ] - }, - "f122b3a2-e383-4e42-b2a5-74a69a9d110a": { - "time_collected": "2024-03-12T19:07:28.461671Z", - "source": "http://[fd00:1122:3344:101::1]:12345", - "sled_id": "f122b3a2-e383-4e42-b2a5-74a69a9d110a", - "baseboard_id": null, - "sled_agent_address": "[fd00:1122:3344:101::1]:12345", - "sled_role": "scrimlet", - "usable_hardware_threads": 8, - "usable_physical_ram": 8582262784, - "reservoir_size": 0, - "disks": [ - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-a462a4f4-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1024 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-b462a4f4-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1025 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-d462a4f4-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1026 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-e4b4dc84-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1027 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-f4b4dc84-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1028 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-14b4dc84-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1029 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-24b4dc84-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1030 - } - ] - } - }, - "omicron_zones": { - "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b": { - "time_collected": "2024-03-12T19:07:28.340118Z", - "source": "http://[fd00:1122:3344:103::1]:12345", - "sled_id": "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b", - "zones": { - "generation": 5, - "zones": [ - { - "id": "0db88baf-911d-47bb-af71-3aebd7c96934", - "underlay_address": "fd00:1122:3344:103::4", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.22", - "external_tls": false, - "internal_address": "[fd00:1122:3344:103::4]:12221", - "nic": { - "id": "8847a09c-cabc-429b-bf46-66d5e2e1140c", - "kind": { - "type": "service", - "id": "0db88baf-911d-47bb-af71-3aebd7c96934" - }, - "name": "nexus-0db88baf-911d-47bb-af71-3aebd7c96934", - "ip": "172.30.2.5", - "mac": "A8:40:25:FF:CC:DA", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "213d7dd3-95a4-45a7-99ca-e4899991dab4", - "underlay_address": "fd00:1122:3344:103::6", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::6]:32345", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "218f36a5-9e51-4b88-ad1a-da4d85c246c4", - "underlay_address": "fd00:1122:3344:3::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - }, - "dns_address": "[fd00:1122:3344:3::1]:53", - "gz_address": "fd00:1122:3344:3::2", - "gz_address_index": 2, - "http_address": "[fd00:1122:3344:3::1]:5353" - } - }, - { - "id": "40c47ead-3be8-4724-a8ef-b66233fc5c65", - "underlay_address": "fd00:1122:3344:103::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::7]:32345", - "dataset": { - "pool_name": "oxp_24b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "425d9d2f-72ea-4f53-80b6-04e002771cdb", - "underlay_address": "fd00:1122:3344:103::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::9]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "46a050b6-37b8-47b9-b4ae-ccb736ecd6d5", - "underlay_address": "fd00:1122:3344:103::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::8]:32345", - "dataset": { - "pool_name": "oxp_d452a7f5-b528-40fe-80ff-4e4189e2d52b" - } - } - }, - { - "id": "4ea8104f-2cfc-4599-9d2c-bcfd8f0b71fd", - "underlay_address": "fd00:1122:3344:103::5", - "zone_type": { - "type": "clickhouse", - "address": "[fd00:1122:3344:103::5]:8123", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "7611a549-effc-41b6-b6cb-c03e0c70a31f", - "underlay_address": "fd00:1122:3344:103::b", - "zone_type": { - "type": "internal_ntp", - "address": "[fd00:1122:3344:103::b]:123", - "dns_servers": [ - "fd00:1122:3344:1::1", - "fd00:1122:3344:2::1", - "fd00:1122:3344:3::1" - ], - "ntp_servers": [ - "8494befe-6df6-42d1-9baa-599ba4228430.host.control-plane.oxide.internal", - "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded.host.control-plane.oxide.internal" - ] - } - }, - { - "id": "af7ccead-2bd8-4a8a-9fbf-3b788d180139", - "underlay_address": "fd00:1122:3344:103::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:103::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "d4428e41-ad7b-41f0-bde6-7c7c955f20c1", - "underlay_address": "fd00:1122:3344:103::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::a]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - } - ] - } - }, - "67a1268b-52d3-4159-b3ed-7a0777f1f340": { - "time_collected": "2024-03-12T19:07:28.381330Z", - "source": "http://[fd00:1122:3344:104::1]:12345", - "sled_id": "67a1268b-52d3-4159-b3ed-7a0777f1f340", - "zones": { - "generation": 5, - "zones": [ - { - "id": "1ebea0c3-1bfd-472c-9f84-ac9e23b32707", - "underlay_address": "fd00:1122:3344:104::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "2e9dfa8f-5371-48e5-b7f7-62a6af8283c1", - "underlay_address": "fd00:1122:3344:104::4", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:104::4]:32221", - "dataset": { - "pool_name": "oxp_24b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "57c712a6-6429-44b7-a9b2-9957cb9054d4", - "underlay_address": "fd00:1122:3344:104::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "59c4c9f0-bea9-46b7-ae9d-fb6dc1d658b9", - "underlay_address": "fd00:1122:3344:104::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "73916098-788f-48d8-b745-e13fdcfb771b", - "underlay_address": "fd00:1122:3344:104::c", - "zone_type": { - "type": "internal_ntp", - "address": "[fd00:1122:3344:104::c]:123", - "dns_servers": [ - "fd00:1122:3344:1::1", - "fd00:1122:3344:2::1", - "fd00:1122:3344:3::1" - ], - "ntp_servers": [ - "8494befe-6df6-42d1-9baa-599ba4228430.host.control-plane.oxide.internal", - "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded.host.control-plane.oxide.internal" - ] - } - }, - { - "id": "9bb513e3-7505-416c-aa70-b26f1152bbdc", - "underlay_address": "fd00:1122:3344:104::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::9]:32345", - "dataset": { - "pool_name": "oxp_d462a7f7-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "9c14c879-137b-4f5b-8068-1292bffc83ed", - "underlay_address": "fd00:1122:3344:104::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:104::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "9cf90589-5da1-4b42-b09b-d784e4134637", - "underlay_address": "fd00:1122:3344:104::5", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.23", - "external_tls": false, - "internal_address": "[fd00:1122:3344:104::5]:12221", - "nic": { - "id": "fa76e7e1-dee6-4574-b71f-e07ea1cffd08", - "kind": { - "type": "service", - "id": "9cf90589-5da1-4b42-b09b-d784e4134637" - }, - "name": "nexus-9cf90589-5da1-4b42-b09b-d784e4134637", - "ip": "172.30.2.6", - "mac": "A8:40:25:FF:C4:6F", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "d48b2dfa-c749-47dd-98b6-3f478cd63934", - "underlay_address": "fd00:1122:3344:104::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:104::6]:17000" - } - }, - { - "id": "fd003bee-818a-4c95-aae5-e378ac601522", - "underlay_address": "fd00:1122:3344:104::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - } - ] - } - }, - "77851655-10a5-4e80-88b0-a001473cab7e": { - "time_collected": "2024-03-12T19:07:28.426275Z", - "source": "http://[fd00:1122:3344:102::1]:12345", - "sled_id": "77851655-10a5-4e80-88b0-a001473cab7e", - "zones": { - "generation": 5, - "zones": [ - { - "id": "084cac6e-44b5-4333-a2ff-b0993b534898", - "underlay_address": "fd00:1122:3344:102::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "11c527c5-0598-428e-9270-be5b74d3461b", - "underlay_address": "fd00:1122:3344:102::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:102::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "20be9299-495d-428d-b315-694c2c4b64af", - "underlay_address": "fd00:1122:3344:102::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:102::6]:17000" - } - }, - { - "id": "2b29cb95-f8c6-4aff-acc0-1c0a627be392", - "underlay_address": "fd00:1122:3344:102::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "8d452bdd-e8b8-4108-a690-46fc59197db0", - "underlay_address": "fd00:1122:3344:102::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "953019c0-8e85-4417-b231-d42820470125", - "underlay_address": "fd00:1122:3344:102::5", - "zone_type": { - "type": "oximeter", - "address": "[fd00:1122:3344:102::5]:12223" - } - }, - { - "id": "99c635b9-8e97-414a-8316-8261d2d767d0", - "underlay_address": "fd00:1122:3344:102::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "cbe1abfa-0063-44b2-9ce7-7ad76b403a94", - "underlay_address": "fd00:1122:3344:2::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "[fd00:1122:3344:2::1]:53", - "gz_address": "fd00:1122:3344:2::2", - "gz_address_index": 1, - "http_address": "[fd00:1122:3344:2::1]:5353" - } - }, - { - "id": "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded", - "underlay_address": "fd00:1122:3344:102::c", - "zone_type": { - "type": "boundary_ntp", - "address": "[fd00:1122:3344:102::c]:123", - "dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "nic": { - "id": "659f33f7-e7bd-4875-9140-bf8a8b2d964a", - "kind": { - "type": "service", - "id": "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded" - }, - "name": "ntp-d52e797a-8fff-4e1e-a5ff-0ab8c8293ded", - "ip": "172.30.3.6", - "mac": "A8:40:25:FF:B1:99", - "subnet": "172.30.3.0/24", - "vni": 100, - "primary": true, - "slot": 0 - }, - "ntp_servers": [ - "time.cloudflare.com" - ], - "snat_cfg": { - "ip": "198.51.100.26", - "first_port": 16384, - "last_port": 32767 - } - } - }, - { - "id": "dc7f703a-27d1-4802-b85d-5629ddb2d67c", - "underlay_address": "fd00:1122:3344:102::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::9]:32345", - "dataset": { - "pool_name": "oxp_d462a7f6-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "f0ed9838-6f1b-4646-a478-9f74f2e6e802", - "underlay_address": "fd00:1122:3344:102::4", - "zone_type": { - "type": "external_dns", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "198.51.100.21:53", - "http_address": "[fd00:1122:3344:102::4]:5353", - "nic": { - "id": "d4dd2f7a-8a3b-405e-8444-62f99a754a8a", - "kind": { - "type": "service", - "id": "f0ed9838-6f1b-4646-a478-9f74f2e6e802" - }, - "name": "external-dns-f0ed9838-6f1b-4646-a478-9f74f2e6e802", - "ip": "172.30.1.6", - "mac": "A8:40:25:FF:F4:5C", - "subnet": "172.30.1.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - } - ] - } - }, - "f122b3a2-e383-4e42-b2a5-74a69a9d110a": { - "time_collected": "2024-03-12T19:07:28.471504Z", - "source": "http://[fd00:1122:3344:101::1]:12345", - "sled_id": "f122b3a2-e383-4e42-b2a5-74a69a9d110a", - "zones": { - "generation": 5, - "zones": [ - { - "id": "0d459323-e414-4f32-9944-76c7331da622", - "underlay_address": "fd00:1122:3344:101::5", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.24", - "external_tls": false, - "internal_address": "[fd00:1122:3344:101::5]:12221", - "nic": { - "id": "514902b8-7a1a-42a3-95a6-d00861833b5c", - "kind": { - "type": "service", - "id": "0d459323-e414-4f32-9944-76c7331da622" - }, - "name": "nexus-0d459323-e414-4f32-9944-76c7331da622", - "ip": "172.30.2.7", - "mac": "A8:40:25:FF:DE:AC", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "2902972b-3ae4-489d-b937-6480352e214a", - "underlay_address": "fd00:1122:3344:101::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "2ee832de-af75-47ac-abac-f91304857ca4", - "underlay_address": "fd00:1122:3344:101::4", - "zone_type": { - "type": "external_dns", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "198.51.100.20:53", - "http_address": "[fd00:1122:3344:101::4]:5353", - "nic": { - "id": "fadff4ab-62d7-466a-9203-04080e4078ed", - "kind": { - "type": "service", - "id": "2ee832de-af75-47ac-abac-f91304857ca4" - }, - "name": "external-dns-2ee832de-af75-47ac-abac-f91304857ca4", - "ip": "172.30.1.5", - "mac": "A8:40:25:FF:B4:93", - "subnet": "172.30.1.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "30050a7e-7fc3-4965-b07b-1635212393eb", - "underlay_address": "fd00:1122:3344:101::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:101::6]:17000" - } - }, - { - "id": "8494befe-6df6-42d1-9baa-599ba4228430", - "underlay_address": "fd00:1122:3344:101::c", - "zone_type": { - "type": "boundary_ntp", - "address": "[fd00:1122:3344:101::c]:123", - "dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "nic": { - "id": "23041748-e3a6-4846-930d-5a348c316e91", - "kind": { - "type": "service", - "id": "8494befe-6df6-42d1-9baa-599ba4228430" - }, - "name": "ntp-8494befe-6df6-42d1-9baa-599ba4228430", - "ip": "172.30.3.5", - "mac": "A8:40:25:FF:D1:C4", - "subnet": "172.30.3.0/24", - "vni": 100, - "primary": true, - "slot": 0 - }, - "ntp_servers": [ - "time.cloudflare.com" - ], - "snat_cfg": { - "ip": "198.51.100.25", - "first_port": 0, - "last_port": 16383 - } - } - }, - { - "id": "92cba955-3a5a-4d82-b0f2-30e89d4556d1", - "underlay_address": "fd00:1122:3344:101::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "9ba4cda7-d2e4-4c44-b1a6-8ddfe676098b", - "underlay_address": "fd00:1122:3344:101::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:101::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "e668e3f5-5457-4689-97da-b2af537787ac", - "underlay_address": "fd00:1122:3344:101::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "f32fd972-7f40-4c58-9e00-7fc5c44273f4", - "underlay_address": "fd00:1122:3344:101::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::9]:32345", - "dataset": { - "pool_name": "oxp_d462a4f4-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "f8c79ba4-194a-4cfe-8090-5315e297b780", - "underlay_address": "fd00:1122:3344:1::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "[fd00:1122:3344:1::1]:53", - "gz_address": "fd00:1122:3344:1::2", - "gz_address_index": 0, - "http_address": "[fd00:1122:3344:1::1]:5353" - } - }, - { - "id": "fa5e0176-b4a8-4598-aa31-40fd562d246c", - "underlay_address": "fd00:1122:3344:101::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - } - ] - } - } - } - }, - { - "id": "3700dcd4-64bb-4997-bfdb-dcfc7cbbc998", - "errors": [], - "time_started": "2024-03-12T19:07:28.555090Z", - "time_done": "2024-03-12T19:07:28.728530Z", - "collector": "9cf90589-5da1-4b42-b09b-d784e4134637", - "baseboards": [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "part_number": "i86pc", - "serial_number": "g3" - } - ], - "cabooses": [ - { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - }, - { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - }, - { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimSidecar", - "version": "0.0.1" - }, - { - "board": "SimSidecarSp", - "git_commit": "ffffffff", - "name": "SimSidecar", - "version": "0.0.1" - } - ], - "rot_pages": [ - { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "c2lkZWNhci1jZnBhLWFjdGl2ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "c2lkZWNhci1jZnBhLWluYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "c2lkZWNhci1jZnBhLXNjcmF0Y2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "c2lkZWNhci1jbXBhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - ], - "sps": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.560161Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "switch", - "sp_slot": 1, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.563500Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "sled", - "sp_slot": 0, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.566461Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "sled", - "sp_slot": 1, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.576218Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "sled", - "sp_slot": 2, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.556487Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "sled", - "sp_slot": 3, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ] - ], - "rots": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.560161Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.563500Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.566461Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.576218Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.556487Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ] - ], - "cabooses_found": { - "SpSlot0": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.560637Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimSidecarSp", - "git_commit": "ffffffff", - "name": "SimSidecar", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.563951Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.566869Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.576918Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.557119Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ] - ], - "SpSlot1": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.561066Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimSidecarSp", - "git_commit": "ffffffff", - "name": "SimSidecar", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.564309Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.567309Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.577611Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.557613Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ] - ], - "RotSlotA": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.561535Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimSidecar", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.564659Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.567749Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.578148Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.558097Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ] - ], - "RotSlotB": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.561932Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimSidecar", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.565057Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.568166Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.578556Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.558565Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ] - ] - }, - "rot_pages_found": { - "Cmpa": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.562164Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "c2lkZWNhci1jbXBhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.565265Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.574062Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.578773Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.558913Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ] - ], - "CfpaActive": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.562441Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "c2lkZWNhci1jZnBhLWFjdGl2ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.565512Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.574335Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.579009Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.559298Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ] - ], - "CfpaInactive": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.562788Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "c2lkZWNhci1jZnBhLWluYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.565754Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.574960Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.579245Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.559529Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ] - ], - "CfpaScratch": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:07:28.563108Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "c2lkZWNhci1jZnBhLXNjcmF0Y2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:07:28.566172Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:07:28.575618Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:07:28.579487Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:07:28.559780Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ] - ] - }, - "sled_agents": { - "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b": { - "time_collected": "2024-03-12T19:07:28.622525Z", - "source": "http://[fd00:1122:3344:103::1]:12345", - "sled_id": "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b", - "baseboard_id": null, - "sled_agent_address": "[fd00:1122:3344:103::1]:12345", - "sled_role": "gimlet", - "usable_hardware_threads": 8, - "usable_physical_ram": 8582262784, - "reservoir_size": 0, - "disks": [ - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-a452a7f5-b528-40fe-80ff-4e4189e2d52b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1024 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-b452a7f5-b528-40fe-80ff-4e4189e2d52b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1025 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-d452a7f5-b528-40fe-80ff-4e4189e2d52b", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1026 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-e4b4dc85-ab45-49fb-a4b4-d351ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1027 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-f4b4dc85-ab45-49fb-a4b4-d351ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1028 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-14b4dc85-ab45-49fb-a4b4-d351ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1029 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-24b4dc85-ab45-49fb-a4b4-d351ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1030 - } - ] - }, - "67a1268b-52d3-4159-b3ed-7a0777f1f340": { - "time_collected": "2024-03-12T19:07:28.654092Z", - "source": "http://[fd00:1122:3344:104::1]:12345", - "sled_id": "67a1268b-52d3-4159-b3ed-7a0777f1f340", - "baseboard_id": null, - "sled_agent_address": "[fd00:1122:3344:104::1]:12345", - "sled_role": "scrimlet", - "usable_hardware_threads": 8, - "usable_physical_ram": 8582262784, - "reservoir_size": 0, - "disks": [ - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-a462a7f7-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1024 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-b462a7f7-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1025 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-d462a7f7-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1026 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-e4b4dc87-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1027 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-f4b4dc87-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1028 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-14b4dc87-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1029 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-24b4dc87-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1030 - } - ] - }, - "77851655-10a5-4e80-88b0-a001473cab7e": { - "time_collected": "2024-03-12T19:07:28.685728Z", - "source": "http://[fd00:1122:3344:102::1]:12345", - "sled_id": "77851655-10a5-4e80-88b0-a001473cab7e", - "baseboard_id": null, - "sled_agent_address": "[fd00:1122:3344:102::1]:12345", - "sled_role": "gimlet", - "usable_hardware_threads": 8, - "usable_physical_ram": 8582262784, - "reservoir_size": 0, - "disks": [ - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-a462a7f6-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1024 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-b462a7f6-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1025 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-d462a7f6-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1026 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-e4b4dc86-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1027 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-f4b4dc86-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1028 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-14b4dc86-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1029 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-24b4dc86-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1030 - } - ] - }, - "f122b3a2-e383-4e42-b2a5-74a69a9d110a": { - "time_collected": "2024-03-12T19:07:28.725605Z", - "source": "http://[fd00:1122:3344:101::1]:12345", - "sled_id": "f122b3a2-e383-4e42-b2a5-74a69a9d110a", - "baseboard_id": null, - "sled_agent_address": "[fd00:1122:3344:101::1]:12345", - "sled_role": "scrimlet", - "usable_hardware_threads": 8, - "usable_physical_ram": 8582262784, - "reservoir_size": 0, - "disks": [ - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-a462a4f4-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1024 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-b462a4f4-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1025 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-d462a4f4-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1026 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-e4b4dc84-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1027 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-f4b4dc84-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1028 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-14b4dc84-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1029 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-24b4dc84-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1030 - } - ] - } - }, - "omicron_zones": { - "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b": { - "time_collected": "2024-03-12T19:07:28.623604Z", - "source": "http://[fd00:1122:3344:103::1]:12345", - "sled_id": "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b", - "zones": { - "generation": 5, - "zones": [ - { - "id": "0db88baf-911d-47bb-af71-3aebd7c96934", - "underlay_address": "fd00:1122:3344:103::4", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.22", - "external_tls": false, - "internal_address": "[fd00:1122:3344:103::4]:12221", - "nic": { - "id": "8847a09c-cabc-429b-bf46-66d5e2e1140c", - "kind": { - "type": "service", - "id": "0db88baf-911d-47bb-af71-3aebd7c96934" - }, - "name": "nexus-0db88baf-911d-47bb-af71-3aebd7c96934", - "ip": "172.30.2.5", - "mac": "A8:40:25:FF:CC:DA", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "213d7dd3-95a4-45a7-99ca-e4899991dab4", - "underlay_address": "fd00:1122:3344:103::6", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::6]:32345", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "218f36a5-9e51-4b88-ad1a-da4d85c246c4", - "underlay_address": "fd00:1122:3344:3::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - }, - "dns_address": "[fd00:1122:3344:3::1]:53", - "gz_address": "fd00:1122:3344:3::2", - "gz_address_index": 2, - "http_address": "[fd00:1122:3344:3::1]:5353" - } - }, - { - "id": "40c47ead-3be8-4724-a8ef-b66233fc5c65", - "underlay_address": "fd00:1122:3344:103::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::7]:32345", - "dataset": { - "pool_name": "oxp_24b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "425d9d2f-72ea-4f53-80b6-04e002771cdb", - "underlay_address": "fd00:1122:3344:103::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::9]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "46a050b6-37b8-47b9-b4ae-ccb736ecd6d5", - "underlay_address": "fd00:1122:3344:103::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::8]:32345", - "dataset": { - "pool_name": "oxp_d452a7f5-b528-40fe-80ff-4e4189e2d52b" - } - } - }, - { - "id": "4ea8104f-2cfc-4599-9d2c-bcfd8f0b71fd", - "underlay_address": "fd00:1122:3344:103::5", - "zone_type": { - "type": "clickhouse", - "address": "[fd00:1122:3344:103::5]:8123", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "7611a549-effc-41b6-b6cb-c03e0c70a31f", - "underlay_address": "fd00:1122:3344:103::b", - "zone_type": { - "type": "internal_ntp", - "address": "[fd00:1122:3344:103::b]:123", - "dns_servers": [ - "fd00:1122:3344:1::1", - "fd00:1122:3344:2::1", - "fd00:1122:3344:3::1" - ], - "ntp_servers": [ - "8494befe-6df6-42d1-9baa-599ba4228430.host.control-plane.oxide.internal", - "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded.host.control-plane.oxide.internal" - ] - } - }, - { - "id": "af7ccead-2bd8-4a8a-9fbf-3b788d180139", - "underlay_address": "fd00:1122:3344:103::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:103::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "d4428e41-ad7b-41f0-bde6-7c7c955f20c1", - "underlay_address": "fd00:1122:3344:103::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::a]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - } - ] - } - }, - "67a1268b-52d3-4159-b3ed-7a0777f1f340": { - "time_collected": "2024-03-12T19:07:28.655005Z", - "source": "http://[fd00:1122:3344:104::1]:12345", - "sled_id": "67a1268b-52d3-4159-b3ed-7a0777f1f340", - "zones": { - "generation": 5, - "zones": [ - { - "id": "1ebea0c3-1bfd-472c-9f84-ac9e23b32707", - "underlay_address": "fd00:1122:3344:104::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "2e9dfa8f-5371-48e5-b7f7-62a6af8283c1", - "underlay_address": "fd00:1122:3344:104::4", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:104::4]:32221", - "dataset": { - "pool_name": "oxp_24b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "57c712a6-6429-44b7-a9b2-9957cb9054d4", - "underlay_address": "fd00:1122:3344:104::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "59c4c9f0-bea9-46b7-ae9d-fb6dc1d658b9", - "underlay_address": "fd00:1122:3344:104::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "73916098-788f-48d8-b745-e13fdcfb771b", - "underlay_address": "fd00:1122:3344:104::c", - "zone_type": { - "type": "internal_ntp", - "address": "[fd00:1122:3344:104::c]:123", - "dns_servers": [ - "fd00:1122:3344:1::1", - "fd00:1122:3344:2::1", - "fd00:1122:3344:3::1" - ], - "ntp_servers": [ - "8494befe-6df6-42d1-9baa-599ba4228430.host.control-plane.oxide.internal", - "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded.host.control-plane.oxide.internal" - ] - } - }, - { - "id": "9bb513e3-7505-416c-aa70-b26f1152bbdc", - "underlay_address": "fd00:1122:3344:104::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::9]:32345", - "dataset": { - "pool_name": "oxp_d462a7f7-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "9c14c879-137b-4f5b-8068-1292bffc83ed", - "underlay_address": "fd00:1122:3344:104::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:104::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "9cf90589-5da1-4b42-b09b-d784e4134637", - "underlay_address": "fd00:1122:3344:104::5", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.23", - "external_tls": false, - "internal_address": "[fd00:1122:3344:104::5]:12221", - "nic": { - "id": "fa76e7e1-dee6-4574-b71f-e07ea1cffd08", - "kind": { - "type": "service", - "id": "9cf90589-5da1-4b42-b09b-d784e4134637" - }, - "name": "nexus-9cf90589-5da1-4b42-b09b-d784e4134637", - "ip": "172.30.2.6", - "mac": "A8:40:25:FF:C4:6F", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "d48b2dfa-c749-47dd-98b6-3f478cd63934", - "underlay_address": "fd00:1122:3344:104::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:104::6]:17000" - } - }, - { - "id": "fd003bee-818a-4c95-aae5-e378ac601522", - "underlay_address": "fd00:1122:3344:104::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - } - ] - } - }, - "77851655-10a5-4e80-88b0-a001473cab7e": { - "time_collected": "2024-03-12T19:07:28.687431Z", - "source": "http://[fd00:1122:3344:102::1]:12345", - "sled_id": "77851655-10a5-4e80-88b0-a001473cab7e", - "zones": { - "generation": 5, - "zones": [ - { - "id": "084cac6e-44b5-4333-a2ff-b0993b534898", - "underlay_address": "fd00:1122:3344:102::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "11c527c5-0598-428e-9270-be5b74d3461b", - "underlay_address": "fd00:1122:3344:102::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:102::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "20be9299-495d-428d-b315-694c2c4b64af", - "underlay_address": "fd00:1122:3344:102::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:102::6]:17000" - } - }, - { - "id": "2b29cb95-f8c6-4aff-acc0-1c0a627be392", - "underlay_address": "fd00:1122:3344:102::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "8d452bdd-e8b8-4108-a690-46fc59197db0", - "underlay_address": "fd00:1122:3344:102::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "953019c0-8e85-4417-b231-d42820470125", - "underlay_address": "fd00:1122:3344:102::5", - "zone_type": { - "type": "oximeter", - "address": "[fd00:1122:3344:102::5]:12223" - } - }, - { - "id": "99c635b9-8e97-414a-8316-8261d2d767d0", - "underlay_address": "fd00:1122:3344:102::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "cbe1abfa-0063-44b2-9ce7-7ad76b403a94", - "underlay_address": "fd00:1122:3344:2::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "[fd00:1122:3344:2::1]:53", - "gz_address": "fd00:1122:3344:2::2", - "gz_address_index": 1, - "http_address": "[fd00:1122:3344:2::1]:5353" - } - }, - { - "id": "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded", - "underlay_address": "fd00:1122:3344:102::c", - "zone_type": { - "type": "boundary_ntp", - "address": "[fd00:1122:3344:102::c]:123", - "dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "nic": { - "id": "659f33f7-e7bd-4875-9140-bf8a8b2d964a", - "kind": { - "type": "service", - "id": "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded" - }, - "name": "ntp-d52e797a-8fff-4e1e-a5ff-0ab8c8293ded", - "ip": "172.30.3.6", - "mac": "A8:40:25:FF:B1:99", - "subnet": "172.30.3.0/24", - "vni": 100, - "primary": true, - "slot": 0 - }, - "ntp_servers": [ - "time.cloudflare.com" - ], - "snat_cfg": { - "ip": "198.51.100.26", - "first_port": 16384, - "last_port": 32767 - } - } - }, - { - "id": "dc7f703a-27d1-4802-b85d-5629ddb2d67c", - "underlay_address": "fd00:1122:3344:102::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::9]:32345", - "dataset": { - "pool_name": "oxp_d462a7f6-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "f0ed9838-6f1b-4646-a478-9f74f2e6e802", - "underlay_address": "fd00:1122:3344:102::4", - "zone_type": { - "type": "external_dns", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "198.51.100.21:53", - "http_address": "[fd00:1122:3344:102::4]:5353", - "nic": { - "id": "d4dd2f7a-8a3b-405e-8444-62f99a754a8a", - "kind": { - "type": "service", - "id": "f0ed9838-6f1b-4646-a478-9f74f2e6e802" - }, - "name": "external-dns-f0ed9838-6f1b-4646-a478-9f74f2e6e802", - "ip": "172.30.1.6", - "mac": "A8:40:25:FF:F4:5C", - "subnet": "172.30.1.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - } - ] - } - }, - "f122b3a2-e383-4e42-b2a5-74a69a9d110a": { - "time_collected": "2024-03-12T19:07:28.727281Z", - "source": "http://[fd00:1122:3344:101::1]:12345", - "sled_id": "f122b3a2-e383-4e42-b2a5-74a69a9d110a", - "zones": { - "generation": 5, - "zones": [ - { - "id": "0d459323-e414-4f32-9944-76c7331da622", - "underlay_address": "fd00:1122:3344:101::5", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.24", - "external_tls": false, - "internal_address": "[fd00:1122:3344:101::5]:12221", - "nic": { - "id": "514902b8-7a1a-42a3-95a6-d00861833b5c", - "kind": { - "type": "service", - "id": "0d459323-e414-4f32-9944-76c7331da622" - }, - "name": "nexus-0d459323-e414-4f32-9944-76c7331da622", - "ip": "172.30.2.7", - "mac": "A8:40:25:FF:DE:AC", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "2902972b-3ae4-489d-b937-6480352e214a", - "underlay_address": "fd00:1122:3344:101::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "2ee832de-af75-47ac-abac-f91304857ca4", - "underlay_address": "fd00:1122:3344:101::4", - "zone_type": { - "type": "external_dns", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "198.51.100.20:53", - "http_address": "[fd00:1122:3344:101::4]:5353", - "nic": { - "id": "fadff4ab-62d7-466a-9203-04080e4078ed", - "kind": { - "type": "service", - "id": "2ee832de-af75-47ac-abac-f91304857ca4" - }, - "name": "external-dns-2ee832de-af75-47ac-abac-f91304857ca4", - "ip": "172.30.1.5", - "mac": "A8:40:25:FF:B4:93", - "subnet": "172.30.1.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "30050a7e-7fc3-4965-b07b-1635212393eb", - "underlay_address": "fd00:1122:3344:101::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:101::6]:17000" - } - }, - { - "id": "8494befe-6df6-42d1-9baa-599ba4228430", - "underlay_address": "fd00:1122:3344:101::c", - "zone_type": { - "type": "boundary_ntp", - "address": "[fd00:1122:3344:101::c]:123", - "dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "nic": { - "id": "23041748-e3a6-4846-930d-5a348c316e91", - "kind": { - "type": "service", - "id": "8494befe-6df6-42d1-9baa-599ba4228430" - }, - "name": "ntp-8494befe-6df6-42d1-9baa-599ba4228430", - "ip": "172.30.3.5", - "mac": "A8:40:25:FF:D1:C4", - "subnet": "172.30.3.0/24", - "vni": 100, - "primary": true, - "slot": 0 - }, - "ntp_servers": [ - "time.cloudflare.com" - ], - "snat_cfg": { - "ip": "198.51.100.25", - "first_port": 0, - "last_port": 16383 - } - } - }, - { - "id": "92cba955-3a5a-4d82-b0f2-30e89d4556d1", - "underlay_address": "fd00:1122:3344:101::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "9ba4cda7-d2e4-4c44-b1a6-8ddfe676098b", - "underlay_address": "fd00:1122:3344:101::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:101::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "e668e3f5-5457-4689-97da-b2af537787ac", - "underlay_address": "fd00:1122:3344:101::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "f32fd972-7f40-4c58-9e00-7fc5c44273f4", - "underlay_address": "fd00:1122:3344:101::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::9]:32345", - "dataset": { - "pool_name": "oxp_d462a4f4-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "f8c79ba4-194a-4cfe-8090-5315e297b780", - "underlay_address": "fd00:1122:3344:1::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "[fd00:1122:3344:1::1]:53", - "gz_address": "fd00:1122:3344:1::2", - "gz_address_index": 0, - "http_address": "[fd00:1122:3344:1::1]:5353" - } - }, - { - "id": "fa5e0176-b4a8-4598-aa31-40fd562d246c", - "underlay_address": "fd00:1122:3344:101::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - } - ] - } - } - } - }, - { - "id": "5e1d6ae0-c5b4-4884-ac41-680cd4f5762d", - "errors": [], - "time_started": "2024-03-12T19:09:36.927333Z", - "time_done": "2024-03-12T19:09:37.116573Z", - "collector": "0d459323-e414-4f32-9944-76c7331da622", - "baseboards": [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "part_number": "i86pc", - "serial_number": "g3" - } - ], - "cabooses": [ - { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - }, - { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - }, - { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimSidecar", - "version": "0.0.1" - }, - { - "board": "SimSidecarSp", - "git_commit": "ffffffff", - "name": "SimSidecar", - "version": "0.0.1" - } - ], - "rot_pages": [ - { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "c2lkZWNhci1jZnBhLWFjdGl2ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "c2lkZWNhci1jZnBhLWluYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "c2lkZWNhci1jZnBhLXNjcmF0Y2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - }, - { - "data_base64": "c2lkZWNhci1jbXBhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - ], - "sps": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:09:36.934628Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "switch", - "sp_slot": 1, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:09:36.940025Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "sled", - "sp_slot": 0, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:09:36.945090Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "sled", - "sp_slot": 1, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:09:36.949989Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "sled", - "sp_slot": 2, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:09:36.929081Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "sp_type": "sled", - "sp_slot": 3, - "baseboard_revision": 0, - "hubris_archive": "0000000000000000", - "power_state": "A2" - } - ] - ], - "rots": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:09:36.934628Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:09:36.940025Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:09:36.945090Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:09:36.949989Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:09:36.929081Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "active_slot": { - "slot": "a" - }, - "persistent_boot_preference": { - "slot": "a" - }, - "pending_persistent_boot_preference": null, - "transient_boot_preference": null, - "slot_a_sha3_256_digest": null, - "slot_b_sha3_256_digest": null - } - ] - ], - "cabooses_found": { - "SpSlot0": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:09:36.935488Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimSidecarSp", - "git_commit": "ffffffff", - "name": "SimSidecar", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:09:36.940638Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:09:36.945685Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:09:36.950734Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:09:36.929758Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ] - ], - "SpSlot1": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:09:36.936167Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimSidecarSp", - "git_commit": "ffffffff", - "name": "SimSidecar", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:09:36.941223Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:09:36.946254Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:09:36.951335Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:09:36.930670Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimGimletSp", - "git_commit": "ffffffff", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ] - ], - "RotSlotA": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:09:36.936811Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimSidecar", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:09:36.941800Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:09:36.946826Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:09:36.951934Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:09:36.931245Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ] - ], - "RotSlotB": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:09:36.937534Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimSidecar", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:09:36.942409Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:09:36.947558Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:09:36.953023Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:09:36.931825Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "caboose": { - "board": "SimRot", - "git_commit": "eeeeeeee", - "name": "SimGimlet", - "version": "0.0.1" - } - } - ] - ] - }, - "rot_pages_found": { - "Cmpa": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:09:36.938012Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "c2lkZWNhci1jbXBhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:09:36.942853Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:09:36.948038Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:09:36.954159Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:09:36.932312Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNtcGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ] - ], - "CfpaActive": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:09:36.938490Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "c2lkZWNhci1jZnBhLWFjdGl2ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:09:36.943336Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:09:36.948514Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:09:36.954600Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:09:36.932820Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ] - ], - "CfpaInactive": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:09:36.938996Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "c2lkZWNhci1jZnBhLWluYWN0aXZlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:09:36.944180Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:09:36.948958Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:09:36.955267Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:09:36.933319Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtaW5hY3RpdmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ] - ], - "CfpaScratch": [ - [ - { - "part_number": "FAKE_SIM_SIDECAR", - "serial_number": "SimSidecar0" - }, - { - "time_collected": "2024-03-12T19:09:36.939491Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "c2lkZWNhci1jZnBhLXNjcmF0Y2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g0" - }, - { - "time_collected": "2024-03-12T19:09:36.944650Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g1" - }, - { - "time_collected": "2024-03-12T19:09:36.949453Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g2" - }, - { - "time_collected": "2024-03-12T19:09:36.955924Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ], - [ - { - "part_number": "i86pc", - "serial_number": "g3" - }, - { - "time_collected": "2024-03-12T19:09:36.933794Z", - "source": "http://[fd00:1122:3344:104::2]:12225", - "page": { - "data_base64": "Z2ltbGV0LWNmcGEtc2NyYXRjaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - } - } - ] - ] - }, - "sled_agents": { - "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b": { - "time_collected": "2024-03-12T19:09:37.008918Z", - "source": "http://[fd00:1122:3344:103::1]:12345", - "sled_id": "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b", - "baseboard_id": null, - "sled_agent_address": "[fd00:1122:3344:103::1]:12345", - "sled_role": "gimlet", - "usable_hardware_threads": 8, - "usable_physical_ram": 8582262784, - "reservoir_size": 0, - "disks": [ - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-a452a7f5-b528-40fe-80ff-4e4189e2d52b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1024 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-b452a7f5-b528-40fe-80ff-4e4189e2d52b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1025 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-d452a7f5-b528-40fe-80ff-4e4189e2d52b", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1026 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-e4b4dc85-ab45-49fb-a4b4-d351ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1027 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-f4b4dc85-ab45-49fb-a4b4-d351ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1028 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-14b4dc85-ab45-49fb-a4b4-d351ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1029 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-24b4dc85-ab45-49fb-a4b4-d351ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1030 - } - ] - }, - "67a1268b-52d3-4159-b3ed-7a0777f1f340": { - "time_collected": "2024-03-12T19:09:37.040839Z", - "source": "http://[fd00:1122:3344:104::1]:12345", - "sled_id": "67a1268b-52d3-4159-b3ed-7a0777f1f340", - "baseboard_id": null, - "sled_agent_address": "[fd00:1122:3344:104::1]:12345", - "sled_role": "scrimlet", - "usable_hardware_threads": 8, - "usable_physical_ram": 8582262784, - "reservoir_size": 0, - "disks": [ - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-a462a7f7-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1024 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-b462a7f7-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1025 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-d462a7f7-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1026 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-e4b4dc87-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1027 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-f4b4dc87-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1028 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-14b4dc87-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1029 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-24b4dc87-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1030 - } - ] - }, - "77851655-10a5-4e80-88b0-a001473cab7e": { - "time_collected": "2024-03-12T19:09:37.086600Z", - "source": "http://[fd00:1122:3344:102::1]:12345", - "sled_id": "77851655-10a5-4e80-88b0-a001473cab7e", - "baseboard_id": null, - "sled_agent_address": "[fd00:1122:3344:102::1]:12345", - "sled_role": "gimlet", - "usable_hardware_threads": 8, - "usable_physical_ram": 8582262784, - "reservoir_size": 0, - "disks": [ - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-a462a7f6-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1024 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-b462a7f6-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1025 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-d462a7f6-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1026 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-e4b4dc86-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1027 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-f4b4dc86-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1028 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-14b4dc86-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1029 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-24b4dc86-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1030 - } - ] - }, - "f122b3a2-e383-4e42-b2a5-74a69a9d110a": { - "time_collected": "2024-03-12T19:09:37.114717Z", - "source": "http://[fd00:1122:3344:101::1]:12345", - "sled_id": "f122b3a2-e383-4e42-b2a5-74a69a9d110a", - "baseboard_id": null, - "sled_agent_address": "[fd00:1122:3344:101::1]:12345", - "sled_role": "scrimlet", - "usable_hardware_threads": 8, - "usable_physical_ram": 8582262784, - "reservoir_size": 0, - "disks": [ - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-a462a4f4-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1024 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-b462a4f4-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "m2", - "slot": 1025 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-d462a4f4-b628-40fe-80ff-4e4189e2d62b", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1026 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-e4b4dc84-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1027 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-f4b4dc84-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1028 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-14b4dc84-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1029 - }, - { - "identity": { - "vendor": "synthetic-vendor", - "serial": "synthetic-serial-24b4dc84-ab46-49fb-a4b4-d361ae214c03", - "model": "synthetic-model" - }, - "variant": "u2", - "slot": 1030 - } - ] - } - }, - "omicron_zones": { - "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b": { - "time_collected": "2024-03-12T19:09:37.010960Z", - "source": "http://[fd00:1122:3344:103::1]:12345", - "sled_id": "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b", - "zones": { - "generation": 5, - "zones": [ - { - "id": "0db88baf-911d-47bb-af71-3aebd7c96934", - "underlay_address": "fd00:1122:3344:103::4", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.22", - "external_tls": false, - "internal_address": "[fd00:1122:3344:103::4]:12221", - "nic": { - "id": "8847a09c-cabc-429b-bf46-66d5e2e1140c", - "kind": { - "type": "service", - "id": "0db88baf-911d-47bb-af71-3aebd7c96934" - }, - "name": "nexus-0db88baf-911d-47bb-af71-3aebd7c96934", - "ip": "172.30.2.5", - "mac": "A8:40:25:FF:CC:DA", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "213d7dd3-95a4-45a7-99ca-e4899991dab4", - "underlay_address": "fd00:1122:3344:103::6", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::6]:32345", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "218f36a5-9e51-4b88-ad1a-da4d85c246c4", - "underlay_address": "fd00:1122:3344:3::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - }, - "dns_address": "[fd00:1122:3344:3::1]:53", - "gz_address": "fd00:1122:3344:3::2", - "gz_address_index": 2, - "http_address": "[fd00:1122:3344:3::1]:5353" - } - }, - { - "id": "40c47ead-3be8-4724-a8ef-b66233fc5c65", - "underlay_address": "fd00:1122:3344:103::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::7]:32345", - "dataset": { - "pool_name": "oxp_24b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "425d9d2f-72ea-4f53-80b6-04e002771cdb", - "underlay_address": "fd00:1122:3344:103::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::9]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "46a050b6-37b8-47b9-b4ae-ccb736ecd6d5", - "underlay_address": "fd00:1122:3344:103::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::8]:32345", - "dataset": { - "pool_name": "oxp_d452a7f5-b528-40fe-80ff-4e4189e2d52b" - } - } - }, - { - "id": "4ea8104f-2cfc-4599-9d2c-bcfd8f0b71fd", - "underlay_address": "fd00:1122:3344:103::5", - "zone_type": { - "type": "clickhouse", - "address": "[fd00:1122:3344:103::5]:8123", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "7611a549-effc-41b6-b6cb-c03e0c70a31f", - "underlay_address": "fd00:1122:3344:103::b", - "zone_type": { - "type": "internal_ntp", - "address": "[fd00:1122:3344:103::b]:123", - "dns_servers": [ - "fd00:1122:3344:1::1", - "fd00:1122:3344:2::1", - "fd00:1122:3344:3::1" - ], - "ntp_servers": [ - "8494befe-6df6-42d1-9baa-599ba4228430.host.control-plane.oxide.internal", - "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded.host.control-plane.oxide.internal" - ] - } - }, - { - "id": "af7ccead-2bd8-4a8a-9fbf-3b788d180139", - "underlay_address": "fd00:1122:3344:103::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:103::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "d4428e41-ad7b-41f0-bde6-7c7c955f20c1", - "underlay_address": "fd00:1122:3344:103::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::a]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - } - ] - } - }, - "67a1268b-52d3-4159-b3ed-7a0777f1f340": { - "time_collected": "2024-03-12T19:09:37.049002Z", - "source": "http://[fd00:1122:3344:104::1]:12345", - "sled_id": "67a1268b-52d3-4159-b3ed-7a0777f1f340", - "zones": { - "generation": 5, - "zones": [ - { - "id": "1ebea0c3-1bfd-472c-9f84-ac9e23b32707", - "underlay_address": "fd00:1122:3344:104::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "2e9dfa8f-5371-48e5-b7f7-62a6af8283c1", - "underlay_address": "fd00:1122:3344:104::4", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:104::4]:32221", - "dataset": { - "pool_name": "oxp_24b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "57c712a6-6429-44b7-a9b2-9957cb9054d4", - "underlay_address": "fd00:1122:3344:104::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "59c4c9f0-bea9-46b7-ae9d-fb6dc1d658b9", - "underlay_address": "fd00:1122:3344:104::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "73916098-788f-48d8-b745-e13fdcfb771b", - "underlay_address": "fd00:1122:3344:104::c", - "zone_type": { - "type": "internal_ntp", - "address": "[fd00:1122:3344:104::c]:123", - "dns_servers": [ - "fd00:1122:3344:1::1", - "fd00:1122:3344:2::1", - "fd00:1122:3344:3::1" - ], - "ntp_servers": [ - "8494befe-6df6-42d1-9baa-599ba4228430.host.control-plane.oxide.internal", - "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded.host.control-plane.oxide.internal" - ] - } - }, - { - "id": "9bb513e3-7505-416c-aa70-b26f1152bbdc", - "underlay_address": "fd00:1122:3344:104::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::9]:32345", - "dataset": { - "pool_name": "oxp_d462a7f7-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "9c14c879-137b-4f5b-8068-1292bffc83ed", - "underlay_address": "fd00:1122:3344:104::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:104::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "9cf90589-5da1-4b42-b09b-d784e4134637", - "underlay_address": "fd00:1122:3344:104::5", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.23", - "external_tls": false, - "internal_address": "[fd00:1122:3344:104::5]:12221", - "nic": { - "id": "fa76e7e1-dee6-4574-b71f-e07ea1cffd08", - "kind": { - "type": "service", - "id": "9cf90589-5da1-4b42-b09b-d784e4134637" - }, - "name": "nexus-9cf90589-5da1-4b42-b09b-d784e4134637", - "ip": "172.30.2.6", - "mac": "A8:40:25:FF:C4:6F", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "d48b2dfa-c749-47dd-98b6-3f478cd63934", - "underlay_address": "fd00:1122:3344:104::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:104::6]:17000" - } - }, - { - "id": "fd003bee-818a-4c95-aae5-e378ac601522", - "underlay_address": "fd00:1122:3344:104::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - } - ] - } - }, - "77851655-10a5-4e80-88b0-a001473cab7e": { - "time_collected": "2024-03-12T19:09:37.088155Z", - "source": "http://[fd00:1122:3344:102::1]:12345", - "sled_id": "77851655-10a5-4e80-88b0-a001473cab7e", - "zones": { - "generation": 5, - "zones": [ - { - "id": "084cac6e-44b5-4333-a2ff-b0993b534898", - "underlay_address": "fd00:1122:3344:102::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "11c527c5-0598-428e-9270-be5b74d3461b", - "underlay_address": "fd00:1122:3344:102::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:102::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "20be9299-495d-428d-b315-694c2c4b64af", - "underlay_address": "fd00:1122:3344:102::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:102::6]:17000" - } - }, - { - "id": "2b29cb95-f8c6-4aff-acc0-1c0a627be392", - "underlay_address": "fd00:1122:3344:102::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "8d452bdd-e8b8-4108-a690-46fc59197db0", - "underlay_address": "fd00:1122:3344:102::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "953019c0-8e85-4417-b231-d42820470125", - "underlay_address": "fd00:1122:3344:102::5", - "zone_type": { - "type": "oximeter", - "address": "[fd00:1122:3344:102::5]:12223" - } - }, - { - "id": "99c635b9-8e97-414a-8316-8261d2d767d0", - "underlay_address": "fd00:1122:3344:102::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "cbe1abfa-0063-44b2-9ce7-7ad76b403a94", - "underlay_address": "fd00:1122:3344:2::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "[fd00:1122:3344:2::1]:53", - "gz_address": "fd00:1122:3344:2::2", - "gz_address_index": 1, - "http_address": "[fd00:1122:3344:2::1]:5353" - } - }, - { - "id": "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded", - "underlay_address": "fd00:1122:3344:102::c", - "zone_type": { - "type": "boundary_ntp", - "address": "[fd00:1122:3344:102::c]:123", - "dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "nic": { - "id": "659f33f7-e7bd-4875-9140-bf8a8b2d964a", - "kind": { - "type": "service", - "id": "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded" - }, - "name": "ntp-d52e797a-8fff-4e1e-a5ff-0ab8c8293ded", - "ip": "172.30.3.6", - "mac": "A8:40:25:FF:B1:99", - "subnet": "172.30.3.0/24", - "vni": 100, - "primary": true, - "slot": 0 - }, - "ntp_servers": [ - "time.cloudflare.com" - ], - "snat_cfg": { - "ip": "198.51.100.26", - "first_port": 16384, - "last_port": 32767 - } - } - }, - { - "id": "dc7f703a-27d1-4802-b85d-5629ddb2d67c", - "underlay_address": "fd00:1122:3344:102::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::9]:32345", - "dataset": { - "pool_name": "oxp_d462a7f6-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "f0ed9838-6f1b-4646-a478-9f74f2e6e802", - "underlay_address": "fd00:1122:3344:102::4", - "zone_type": { - "type": "external_dns", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "198.51.100.21:53", - "http_address": "[fd00:1122:3344:102::4]:5353", - "nic": { - "id": "d4dd2f7a-8a3b-405e-8444-62f99a754a8a", - "kind": { - "type": "service", - "id": "f0ed9838-6f1b-4646-a478-9f74f2e6e802" - }, - "name": "external-dns-f0ed9838-6f1b-4646-a478-9f74f2e6e802", - "ip": "172.30.1.6", - "mac": "A8:40:25:FF:F4:5C", - "subnet": "172.30.1.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - } - ] - } - }, - "f122b3a2-e383-4e42-b2a5-74a69a9d110a": { - "time_collected": "2024-03-12T19:09:37.115884Z", - "source": "http://[fd00:1122:3344:101::1]:12345", - "sled_id": "f122b3a2-e383-4e42-b2a5-74a69a9d110a", - "zones": { - "generation": 5, - "zones": [ - { - "id": "0d459323-e414-4f32-9944-76c7331da622", - "underlay_address": "fd00:1122:3344:101::5", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.24", - "external_tls": false, - "internal_address": "[fd00:1122:3344:101::5]:12221", - "nic": { - "id": "514902b8-7a1a-42a3-95a6-d00861833b5c", - "kind": { - "type": "service", - "id": "0d459323-e414-4f32-9944-76c7331da622" - }, - "name": "nexus-0d459323-e414-4f32-9944-76c7331da622", - "ip": "172.30.2.7", - "mac": "A8:40:25:FF:DE:AC", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "2902972b-3ae4-489d-b937-6480352e214a", - "underlay_address": "fd00:1122:3344:101::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "2ee832de-af75-47ac-abac-f91304857ca4", - "underlay_address": "fd00:1122:3344:101::4", - "zone_type": { - "type": "external_dns", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "198.51.100.20:53", - "http_address": "[fd00:1122:3344:101::4]:5353", - "nic": { - "id": "fadff4ab-62d7-466a-9203-04080e4078ed", - "kind": { - "type": "service", - "id": "2ee832de-af75-47ac-abac-f91304857ca4" - }, - "name": "external-dns-2ee832de-af75-47ac-abac-f91304857ca4", - "ip": "172.30.1.5", - "mac": "A8:40:25:FF:B4:93", - "subnet": "172.30.1.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "30050a7e-7fc3-4965-b07b-1635212393eb", - "underlay_address": "fd00:1122:3344:101::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:101::6]:17000" - } - }, - { - "id": "8494befe-6df6-42d1-9baa-599ba4228430", - "underlay_address": "fd00:1122:3344:101::c", - "zone_type": { - "type": "boundary_ntp", - "address": "[fd00:1122:3344:101::c]:123", - "dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "nic": { - "id": "23041748-e3a6-4846-930d-5a348c316e91", - "kind": { - "type": "service", - "id": "8494befe-6df6-42d1-9baa-599ba4228430" - }, - "name": "ntp-8494befe-6df6-42d1-9baa-599ba4228430", - "ip": "172.30.3.5", - "mac": "A8:40:25:FF:D1:C4", - "subnet": "172.30.3.0/24", - "vni": 100, - "primary": true, - "slot": 0 - }, - "ntp_servers": [ - "time.cloudflare.com" - ], - "snat_cfg": { - "ip": "198.51.100.25", - "first_port": 0, - "last_port": 16383 - } - } - }, - { - "id": "92cba955-3a5a-4d82-b0f2-30e89d4556d1", - "underlay_address": "fd00:1122:3344:101::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "9ba4cda7-d2e4-4c44-b1a6-8ddfe676098b", - "underlay_address": "fd00:1122:3344:101::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:101::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "e668e3f5-5457-4689-97da-b2af537787ac", - "underlay_address": "fd00:1122:3344:101::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "f32fd972-7f40-4c58-9e00-7fc5c44273f4", - "underlay_address": "fd00:1122:3344:101::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::9]:32345", - "dataset": { - "pool_name": "oxp_d462a4f4-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "f8c79ba4-194a-4cfe-8090-5315e297b780", - "underlay_address": "fd00:1122:3344:1::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "[fd00:1122:3344:1::1]:53", - "gz_address": "fd00:1122:3344:1::2", - "gz_address_index": 0, - "http_address": "[fd00:1122:3344:1::1]:5353" - } - }, - { - "id": "fa5e0176-b4a8-4598-aa31-40fd562d246c", - "underlay_address": "fd00:1122:3344:101::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - } - ] - } - } - } - } - ], - "blueprints": [ - { - "id": "649e444d-d00f-4067-a915-12e15647bf37", - "omicron_zones": { - "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b": { - "generation": 5, - "zones": [ - { - "id": "0db88baf-911d-47bb-af71-3aebd7c96934", - "underlay_address": "fd00:1122:3344:103::4", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.22", - "external_tls": false, - "internal_address": "[fd00:1122:3344:103::4]:12221", - "nic": { - "id": "8847a09c-cabc-429b-bf46-66d5e2e1140c", - "kind": { - "type": "service", - "id": "0db88baf-911d-47bb-af71-3aebd7c96934" - }, - "name": "nexus-0db88baf-911d-47bb-af71-3aebd7c96934", - "ip": "172.30.2.5", - "mac": "A8:40:25:FF:CC:DA", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "213d7dd3-95a4-45a7-99ca-e4899991dab4", - "underlay_address": "fd00:1122:3344:103::6", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::6]:32345", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "218f36a5-9e51-4b88-ad1a-da4d85c246c4", - "underlay_address": "fd00:1122:3344:3::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - }, - "dns_address": "[fd00:1122:3344:3::1]:53", - "gz_address": "fd00:1122:3344:3::2", - "gz_address_index": 2, - "http_address": "[fd00:1122:3344:3::1]:5353" - } - }, - { - "id": "40c47ead-3be8-4724-a8ef-b66233fc5c65", - "underlay_address": "fd00:1122:3344:103::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::7]:32345", - "dataset": { - "pool_name": "oxp_24b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "425d9d2f-72ea-4f53-80b6-04e002771cdb", - "underlay_address": "fd00:1122:3344:103::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::9]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "46a050b6-37b8-47b9-b4ae-ccb736ecd6d5", - "underlay_address": "fd00:1122:3344:103::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::8]:32345", - "dataset": { - "pool_name": "oxp_d452a7f5-b528-40fe-80ff-4e4189e2d52b" - } - } - }, - { - "id": "4ea8104f-2cfc-4599-9d2c-bcfd8f0b71fd", - "underlay_address": "fd00:1122:3344:103::5", - "zone_type": { - "type": "clickhouse", - "address": "[fd00:1122:3344:103::5]:8123", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "7611a549-effc-41b6-b6cb-c03e0c70a31f", - "underlay_address": "fd00:1122:3344:103::b", - "zone_type": { - "type": "internal_ntp", - "address": "[fd00:1122:3344:103::b]:123", - "dns_servers": [ - "fd00:1122:3344:1::1", - "fd00:1122:3344:2::1", - "fd00:1122:3344:3::1" - ], - "ntp_servers": [ - "8494befe-6df6-42d1-9baa-599ba4228430.host.control-plane.oxide.internal", - "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded.host.control-plane.oxide.internal" - ] - } - }, - { - "id": "af7ccead-2bd8-4a8a-9fbf-3b788d180139", - "underlay_address": "fd00:1122:3344:103::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:103::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "d4428e41-ad7b-41f0-bde6-7c7c955f20c1", - "underlay_address": "fd00:1122:3344:103::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::a]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - } - ] - }, - "67a1268b-52d3-4159-b3ed-7a0777f1f340": { - "generation": 5, - "zones": [ - { - "id": "1ebea0c3-1bfd-472c-9f84-ac9e23b32707", - "underlay_address": "fd00:1122:3344:104::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "2e9dfa8f-5371-48e5-b7f7-62a6af8283c1", - "underlay_address": "fd00:1122:3344:104::4", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:104::4]:32221", - "dataset": { - "pool_name": "oxp_24b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "57c712a6-6429-44b7-a9b2-9957cb9054d4", - "underlay_address": "fd00:1122:3344:104::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "59c4c9f0-bea9-46b7-ae9d-fb6dc1d658b9", - "underlay_address": "fd00:1122:3344:104::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "73916098-788f-48d8-b745-e13fdcfb771b", - "underlay_address": "fd00:1122:3344:104::c", - "zone_type": { - "type": "internal_ntp", - "address": "[fd00:1122:3344:104::c]:123", - "dns_servers": [ - "fd00:1122:3344:1::1", - "fd00:1122:3344:2::1", - "fd00:1122:3344:3::1" - ], - "ntp_servers": [ - "8494befe-6df6-42d1-9baa-599ba4228430.host.control-plane.oxide.internal", - "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded.host.control-plane.oxide.internal" - ] - } - }, - { - "id": "9bb513e3-7505-416c-aa70-b26f1152bbdc", - "underlay_address": "fd00:1122:3344:104::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::9]:32345", - "dataset": { - "pool_name": "oxp_d462a7f7-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "9c14c879-137b-4f5b-8068-1292bffc83ed", - "underlay_address": "fd00:1122:3344:104::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:104::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "9cf90589-5da1-4b42-b09b-d784e4134637", - "underlay_address": "fd00:1122:3344:104::5", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.23", - "external_tls": false, - "internal_address": "[fd00:1122:3344:104::5]:12221", - "nic": { - "id": "fa76e7e1-dee6-4574-b71f-e07ea1cffd08", - "kind": { - "type": "service", - "id": "9cf90589-5da1-4b42-b09b-d784e4134637" - }, - "name": "nexus-9cf90589-5da1-4b42-b09b-d784e4134637", - "ip": "172.30.2.6", - "mac": "A8:40:25:FF:C4:6F", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "d48b2dfa-c749-47dd-98b6-3f478cd63934", - "underlay_address": "fd00:1122:3344:104::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:104::6]:17000" - } - }, - { - "id": "fd003bee-818a-4c95-aae5-e378ac601522", - "underlay_address": "fd00:1122:3344:104::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - } - ] - }, - "77851655-10a5-4e80-88b0-a001473cab7e": { - "generation": 5, - "zones": [ - { - "id": "084cac6e-44b5-4333-a2ff-b0993b534898", - "underlay_address": "fd00:1122:3344:102::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "11c527c5-0598-428e-9270-be5b74d3461b", - "underlay_address": "fd00:1122:3344:102::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:102::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "20be9299-495d-428d-b315-694c2c4b64af", - "underlay_address": "fd00:1122:3344:102::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:102::6]:17000" - } - }, - { - "id": "2b29cb95-f8c6-4aff-acc0-1c0a627be392", - "underlay_address": "fd00:1122:3344:102::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "8d452bdd-e8b8-4108-a690-46fc59197db0", - "underlay_address": "fd00:1122:3344:102::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "953019c0-8e85-4417-b231-d42820470125", - "underlay_address": "fd00:1122:3344:102::5", - "zone_type": { - "type": "oximeter", - "address": "[fd00:1122:3344:102::5]:12223" - } - }, - { - "id": "99c635b9-8e97-414a-8316-8261d2d767d0", - "underlay_address": "fd00:1122:3344:102::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "cbe1abfa-0063-44b2-9ce7-7ad76b403a94", - "underlay_address": "fd00:1122:3344:2::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "[fd00:1122:3344:2::1]:53", - "gz_address": "fd00:1122:3344:2::2", - "gz_address_index": 1, - "http_address": "[fd00:1122:3344:2::1]:5353" - } - }, - { - "id": "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded", - "underlay_address": "fd00:1122:3344:102::c", - "zone_type": { - "type": "boundary_ntp", - "address": "[fd00:1122:3344:102::c]:123", - "dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "nic": { - "id": "659f33f7-e7bd-4875-9140-bf8a8b2d964a", - "kind": { - "type": "service", - "id": "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded" - }, - "name": "ntp-d52e797a-8fff-4e1e-a5ff-0ab8c8293ded", - "ip": "172.30.3.6", - "mac": "A8:40:25:FF:B1:99", - "subnet": "172.30.3.0/24", - "vni": 100, - "primary": true, - "slot": 0 - }, - "ntp_servers": [ - "time.cloudflare.com" - ], - "snat_cfg": { - "ip": "198.51.100.26", - "first_port": 16384, - "last_port": 32767 - } - } - }, - { - "id": "dc7f703a-27d1-4802-b85d-5629ddb2d67c", - "underlay_address": "fd00:1122:3344:102::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::9]:32345", - "dataset": { - "pool_name": "oxp_d462a7f6-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "f0ed9838-6f1b-4646-a478-9f74f2e6e802", - "underlay_address": "fd00:1122:3344:102::4", - "zone_type": { - "type": "external_dns", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "198.51.100.21:53", - "http_address": "[fd00:1122:3344:102::4]:5353", - "nic": { - "id": "d4dd2f7a-8a3b-405e-8444-62f99a754a8a", - "kind": { - "type": "service", - "id": "f0ed9838-6f1b-4646-a478-9f74f2e6e802" - }, - "name": "external-dns-f0ed9838-6f1b-4646-a478-9f74f2e6e802", - "ip": "172.30.1.6", - "mac": "A8:40:25:FF:F4:5C", - "subnet": "172.30.1.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - } - ] - }, - "f122b3a2-e383-4e42-b2a5-74a69a9d110a": { - "generation": 5, - "zones": [ - { - "id": "0d459323-e414-4f32-9944-76c7331da622", - "underlay_address": "fd00:1122:3344:101::5", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.24", - "external_tls": false, - "internal_address": "[fd00:1122:3344:101::5]:12221", - "nic": { - "id": "514902b8-7a1a-42a3-95a6-d00861833b5c", - "kind": { - "type": "service", - "id": "0d459323-e414-4f32-9944-76c7331da622" - }, - "name": "nexus-0d459323-e414-4f32-9944-76c7331da622", - "ip": "172.30.2.7", - "mac": "A8:40:25:FF:DE:AC", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "2902972b-3ae4-489d-b937-6480352e214a", - "underlay_address": "fd00:1122:3344:101::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "2ee832de-af75-47ac-abac-f91304857ca4", - "underlay_address": "fd00:1122:3344:101::4", - "zone_type": { - "type": "external_dns", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "198.51.100.20:53", - "http_address": "[fd00:1122:3344:101::4]:5353", - "nic": { - "id": "fadff4ab-62d7-466a-9203-04080e4078ed", - "kind": { - "type": "service", - "id": "2ee832de-af75-47ac-abac-f91304857ca4" - }, - "name": "external-dns-2ee832de-af75-47ac-abac-f91304857ca4", - "ip": "172.30.1.5", - "mac": "A8:40:25:FF:B4:93", - "subnet": "172.30.1.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "30050a7e-7fc3-4965-b07b-1635212393eb", - "underlay_address": "fd00:1122:3344:101::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:101::6]:17000" - } - }, - { - "id": "8494befe-6df6-42d1-9baa-599ba4228430", - "underlay_address": "fd00:1122:3344:101::c", - "zone_type": { - "type": "boundary_ntp", - "address": "[fd00:1122:3344:101::c]:123", - "dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "nic": { - "id": "23041748-e3a6-4846-930d-5a348c316e91", - "kind": { - "type": "service", - "id": "8494befe-6df6-42d1-9baa-599ba4228430" - }, - "name": "ntp-8494befe-6df6-42d1-9baa-599ba4228430", - "ip": "172.30.3.5", - "mac": "A8:40:25:FF:D1:C4", - "subnet": "172.30.3.0/24", - "vni": 100, - "primary": true, - "slot": 0 - }, - "ntp_servers": [ - "time.cloudflare.com" - ], - "snat_cfg": { - "ip": "198.51.100.25", - "first_port": 0, - "last_port": 16383 - } - } - }, - { - "id": "92cba955-3a5a-4d82-b0f2-30e89d4556d1", - "underlay_address": "fd00:1122:3344:101::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "9ba4cda7-d2e4-4c44-b1a6-8ddfe676098b", - "underlay_address": "fd00:1122:3344:101::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:101::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "e668e3f5-5457-4689-97da-b2af537787ac", - "underlay_address": "fd00:1122:3344:101::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "f32fd972-7f40-4c58-9e00-7fc5c44273f4", - "underlay_address": "fd00:1122:3344:101::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::9]:32345", - "dataset": { - "pool_name": "oxp_d462a4f4-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "f8c79ba4-194a-4cfe-8090-5315e297b780", - "underlay_address": "fd00:1122:3344:1::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "[fd00:1122:3344:1::1]:53", - "gz_address": "fd00:1122:3344:1::2", - "gz_address_index": 0, - "http_address": "[fd00:1122:3344:1::1]:5353" - } - }, - { - "id": "fa5e0176-b4a8-4598-aa31-40fd562d246c", - "underlay_address": "fd00:1122:3344:101::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - } - ] - } - }, - "zones_in_service": [ - "084cac6e-44b5-4333-a2ff-b0993b534898", - "0d459323-e414-4f32-9944-76c7331da622", - "0db88baf-911d-47bb-af71-3aebd7c96934", - "11c527c5-0598-428e-9270-be5b74d3461b", - "1ebea0c3-1bfd-472c-9f84-ac9e23b32707", - "20be9299-495d-428d-b315-694c2c4b64af", - "213d7dd3-95a4-45a7-99ca-e4899991dab4", - "218f36a5-9e51-4b88-ad1a-da4d85c246c4", - "2902972b-3ae4-489d-b937-6480352e214a", - "2b29cb95-f8c6-4aff-acc0-1c0a627be392", - "2e9dfa8f-5371-48e5-b7f7-62a6af8283c1", - "2ee832de-af75-47ac-abac-f91304857ca4", - "30050a7e-7fc3-4965-b07b-1635212393eb", - "40c47ead-3be8-4724-a8ef-b66233fc5c65", - "425d9d2f-72ea-4f53-80b6-04e002771cdb", - "46a050b6-37b8-47b9-b4ae-ccb736ecd6d5", - "4ea8104f-2cfc-4599-9d2c-bcfd8f0b71fd", - "57c712a6-6429-44b7-a9b2-9957cb9054d4", - "59c4c9f0-bea9-46b7-ae9d-fb6dc1d658b9", - "73916098-788f-48d8-b745-e13fdcfb771b", - "7611a549-effc-41b6-b6cb-c03e0c70a31f", - "8494befe-6df6-42d1-9baa-599ba4228430", - "8d452bdd-e8b8-4108-a690-46fc59197db0", - "92cba955-3a5a-4d82-b0f2-30e89d4556d1", - "953019c0-8e85-4417-b231-d42820470125", - "99c635b9-8e97-414a-8316-8261d2d767d0", - "9ba4cda7-d2e4-4c44-b1a6-8ddfe676098b", - "9bb513e3-7505-416c-aa70-b26f1152bbdc", - "9c14c879-137b-4f5b-8068-1292bffc83ed", - "9cf90589-5da1-4b42-b09b-d784e4134637", - "af7ccead-2bd8-4a8a-9fbf-3b788d180139", - "cbe1abfa-0063-44b2-9ce7-7ad76b403a94", - "d4428e41-ad7b-41f0-bde6-7c7c955f20c1", - "d48b2dfa-c749-47dd-98b6-3f478cd63934", - "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded", - "dc7f703a-27d1-4802-b85d-5629ddb2d67c", - "e668e3f5-5457-4689-97da-b2af537787ac", - "f0ed9838-6f1b-4646-a478-9f74f2e6e802", - "f32fd972-7f40-4c58-9e00-7fc5c44273f4", - "f8c79ba4-194a-4cfe-8090-5315e297b780", - "fa5e0176-b4a8-4598-aa31-40fd562d246c", - "fd003bee-818a-4c95-aae5-e378ac601522" - ], - "parent_blueprint_id": null, - "internal_dns_version": 1, - "external_dns_version": 1, - "time_created": "2024-03-12T19:09:41.953854Z", - "creator": "0d459323-e414-4f32-9944-76c7331da622", - "comment": "from collection 3f61b723-cfe7-40ec-b22c-e3e1f35325f9" - }, - { - "id": "cd34e87b-d821-4768-b32f-f41c28db835e", - "omicron_zones": { - "1f34b5cc-6dac-40cc-9ea1-95f32c33e59b": { - "generation": 5, - "zones": [ - { - "id": "0db88baf-911d-47bb-af71-3aebd7c96934", - "underlay_address": "fd00:1122:3344:103::4", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.22", - "external_tls": false, - "internal_address": "[fd00:1122:3344:103::4]:12221", - "nic": { - "id": "8847a09c-cabc-429b-bf46-66d5e2e1140c", - "kind": { - "type": "service", - "id": "0db88baf-911d-47bb-af71-3aebd7c96934" - }, - "name": "nexus-0db88baf-911d-47bb-af71-3aebd7c96934", - "ip": "172.30.2.5", - "mac": "A8:40:25:FF:CC:DA", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "213d7dd3-95a4-45a7-99ca-e4899991dab4", - "underlay_address": "fd00:1122:3344:103::6", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::6]:32345", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "218f36a5-9e51-4b88-ad1a-da4d85c246c4", - "underlay_address": "fd00:1122:3344:3::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - }, - "dns_address": "[fd00:1122:3344:3::1]:53", - "gz_address": "fd00:1122:3344:3::2", - "gz_address_index": 2, - "http_address": "[fd00:1122:3344:3::1]:5353" - } - }, - { - "id": "40c47ead-3be8-4724-a8ef-b66233fc5c65", - "underlay_address": "fd00:1122:3344:103::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::7]:32345", - "dataset": { - "pool_name": "oxp_24b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "425d9d2f-72ea-4f53-80b6-04e002771cdb", - "underlay_address": "fd00:1122:3344:103::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::9]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "46a050b6-37b8-47b9-b4ae-ccb736ecd6d5", - "underlay_address": "fd00:1122:3344:103::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::8]:32345", - "dataset": { - "pool_name": "oxp_d452a7f5-b528-40fe-80ff-4e4189e2d52b" - } - } - }, - { - "id": "4ea8104f-2cfc-4599-9d2c-bcfd8f0b71fd", - "underlay_address": "fd00:1122:3344:103::5", - "zone_type": { - "type": "clickhouse", - "address": "[fd00:1122:3344:103::5]:8123", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "7611a549-effc-41b6-b6cb-c03e0c70a31f", - "underlay_address": "fd00:1122:3344:103::b", - "zone_type": { - "type": "internal_ntp", - "address": "[fd00:1122:3344:103::b]:123", - "dns_servers": [ - "fd00:1122:3344:1::1", - "fd00:1122:3344:2::1", - "fd00:1122:3344:3::1" - ], - "ntp_servers": [ - "8494befe-6df6-42d1-9baa-599ba4228430.host.control-plane.oxide.internal", - "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded.host.control-plane.oxide.internal" - ] - } - }, - { - "id": "af7ccead-2bd8-4a8a-9fbf-3b788d180139", - "underlay_address": "fd00:1122:3344:103::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:103::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - }, - { - "id": "d4428e41-ad7b-41f0-bde6-7c7c955f20c1", - "underlay_address": "fd00:1122:3344:103::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:103::a]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc85-ab45-49fb-a4b4-d351ae214c03" - } - } - } - ] - }, - "67a1268b-52d3-4159-b3ed-7a0777f1f340": { - "generation": 5, - "zones": [ - { - "id": "1ebea0c3-1bfd-472c-9f84-ac9e23b32707", - "underlay_address": "fd00:1122:3344:104::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "2e9dfa8f-5371-48e5-b7f7-62a6af8283c1", - "underlay_address": "fd00:1122:3344:104::4", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:104::4]:32221", - "dataset": { - "pool_name": "oxp_24b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "57c712a6-6429-44b7-a9b2-9957cb9054d4", - "underlay_address": "fd00:1122:3344:104::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "59c4c9f0-bea9-46b7-ae9d-fb6dc1d658b9", - "underlay_address": "fd00:1122:3344:104::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "73916098-788f-48d8-b745-e13fdcfb771b", - "underlay_address": "fd00:1122:3344:104::c", - "zone_type": { - "type": "internal_ntp", - "address": "[fd00:1122:3344:104::c]:123", - "dns_servers": [ - "fd00:1122:3344:1::1", - "fd00:1122:3344:2::1", - "fd00:1122:3344:3::1" - ], - "ntp_servers": [ - "8494befe-6df6-42d1-9baa-599ba4228430.host.control-plane.oxide.internal", - "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded.host.control-plane.oxide.internal" - ] - } - }, - { - "id": "9bb513e3-7505-416c-aa70-b26f1152bbdc", - "underlay_address": "fd00:1122:3344:104::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::9]:32345", - "dataset": { - "pool_name": "oxp_d462a7f7-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "9c14c879-137b-4f5b-8068-1292bffc83ed", - "underlay_address": "fd00:1122:3344:104::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:104::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "9cf90589-5da1-4b42-b09b-d784e4134637", - "underlay_address": "fd00:1122:3344:104::5", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.23", - "external_tls": false, - "internal_address": "[fd00:1122:3344:104::5]:12221", - "nic": { - "id": "fa76e7e1-dee6-4574-b71f-e07ea1cffd08", - "kind": { - "type": "service", - "id": "9cf90589-5da1-4b42-b09b-d784e4134637" - }, - "name": "nexus-9cf90589-5da1-4b42-b09b-d784e4134637", - "ip": "172.30.2.6", - "mac": "A8:40:25:FF:C4:6F", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "d48b2dfa-c749-47dd-98b6-3f478cd63934", - "underlay_address": "fd00:1122:3344:104::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:104::6]:17000" - } - }, - { - "id": "fd003bee-818a-4c95-aae5-e378ac601522", - "underlay_address": "fd00:1122:3344:104::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:104::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc87-ab46-49fb-a4b4-d361ae214c03" - } - } - } - ] - }, - "77851655-10a5-4e80-88b0-a001473cab7e": { - "generation": 5, - "zones": [ - { - "id": "084cac6e-44b5-4333-a2ff-b0993b534898", - "underlay_address": "fd00:1122:3344:102::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "11c527c5-0598-428e-9270-be5b74d3461b", - "underlay_address": "fd00:1122:3344:102::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:102::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "20be9299-495d-428d-b315-694c2c4b64af", - "underlay_address": "fd00:1122:3344:102::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:102::6]:17000" - } - }, - { - "id": "2b29cb95-f8c6-4aff-acc0-1c0a627be392", - "underlay_address": "fd00:1122:3344:102::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "8d452bdd-e8b8-4108-a690-46fc59197db0", - "underlay_address": "fd00:1122:3344:102::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "953019c0-8e85-4417-b231-d42820470125", - "underlay_address": "fd00:1122:3344:102::5", - "zone_type": { - "type": "oximeter", - "address": "[fd00:1122:3344:102::5]:12223" - } - }, - { - "id": "99c635b9-8e97-414a-8316-8261d2d767d0", - "underlay_address": "fd00:1122:3344:102::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "cbe1abfa-0063-44b2-9ce7-7ad76b403a94", - "underlay_address": "fd00:1122:3344:2::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "[fd00:1122:3344:2::1]:53", - "gz_address": "fd00:1122:3344:2::2", - "gz_address_index": 1, - "http_address": "[fd00:1122:3344:2::1]:5353" - } - }, - { - "id": "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded", - "underlay_address": "fd00:1122:3344:102::c", - "zone_type": { - "type": "boundary_ntp", - "address": "[fd00:1122:3344:102::c]:123", - "dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "nic": { - "id": "659f33f7-e7bd-4875-9140-bf8a8b2d964a", - "kind": { - "type": "service", - "id": "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded" - }, - "name": "ntp-d52e797a-8fff-4e1e-a5ff-0ab8c8293ded", - "ip": "172.30.3.6", - "mac": "A8:40:25:FF:B1:99", - "subnet": "172.30.3.0/24", - "vni": 100, - "primary": true, - "slot": 0 - }, - "ntp_servers": [ - "time.cloudflare.com" - ], - "snat_cfg": { - "ip": "198.51.100.26", - "first_port": 16384, - "last_port": 32767 - } - } - }, - { - "id": "dc7f703a-27d1-4802-b85d-5629ddb2d67c", - "underlay_address": "fd00:1122:3344:102::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:102::9]:32345", - "dataset": { - "pool_name": "oxp_d462a7f6-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "f0ed9838-6f1b-4646-a478-9f74f2e6e802", - "underlay_address": "fd00:1122:3344:102::4", - "zone_type": { - "type": "external_dns", - "dataset": { - "pool_name": "oxp_14b4dc86-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "198.51.100.21:53", - "http_address": "[fd00:1122:3344:102::4]:5353", - "nic": { - "id": "d4dd2f7a-8a3b-405e-8444-62f99a754a8a", - "kind": { - "type": "service", - "id": "f0ed9838-6f1b-4646-a478-9f74f2e6e802" - }, - "name": "external-dns-f0ed9838-6f1b-4646-a478-9f74f2e6e802", - "ip": "172.30.1.6", - "mac": "A8:40:25:FF:F4:5C", - "subnet": "172.30.1.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - } - ] - }, - "f122b3a2-e383-4e42-b2a5-74a69a9d110a": { - "generation": 5, - "zones": [ - { - "id": "0d459323-e414-4f32-9944-76c7331da622", - "underlay_address": "fd00:1122:3344:101::5", - "zone_type": { - "type": "nexus", - "external_dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "external_ip": "198.51.100.24", - "external_tls": false, - "internal_address": "[fd00:1122:3344:101::5]:12221", - "nic": { - "id": "514902b8-7a1a-42a3-95a6-d00861833b5c", - "kind": { - "type": "service", - "id": "0d459323-e414-4f32-9944-76c7331da622" - }, - "name": "nexus-0d459323-e414-4f32-9944-76c7331da622", - "ip": "172.30.2.7", - "mac": "A8:40:25:FF:DE:AC", - "subnet": "172.30.2.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "2902972b-3ae4-489d-b937-6480352e214a", - "underlay_address": "fd00:1122:3344:101::8", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::8]:32345", - "dataset": { - "pool_name": "oxp_24b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "2ee832de-af75-47ac-abac-f91304857ca4", - "underlay_address": "fd00:1122:3344:101::4", - "zone_type": { - "type": "external_dns", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "198.51.100.20:53", - "http_address": "[fd00:1122:3344:101::4]:5353", - "nic": { - "id": "fadff4ab-62d7-466a-9203-04080e4078ed", - "kind": { - "type": "service", - "id": "2ee832de-af75-47ac-abac-f91304857ca4" - }, - "name": "external-dns-2ee832de-af75-47ac-abac-f91304857ca4", - "ip": "172.30.1.5", - "mac": "A8:40:25:FF:B4:93", - "subnet": "172.30.1.0/24", - "vni": 100, - "primary": true, - "slot": 0 - } - } - }, - { - "id": "30050a7e-7fc3-4965-b07b-1635212393eb", - "underlay_address": "fd00:1122:3344:101::6", - "zone_type": { - "type": "crucible_pantry", - "address": "[fd00:1122:3344:101::6]:17000" - } - }, - { - "id": "8494befe-6df6-42d1-9baa-599ba4228430", - "underlay_address": "fd00:1122:3344:101::c", - "zone_type": { - "type": "boundary_ntp", - "address": "[fd00:1122:3344:101::c]:123", - "dns_servers": [ - "1.1.1.1", - "9.9.9.9" - ], - "nic": { - "id": "23041748-e3a6-4846-930d-5a348c316e91", - "kind": { - "type": "service", - "id": "8494befe-6df6-42d1-9baa-599ba4228430" - }, - "name": "ntp-8494befe-6df6-42d1-9baa-599ba4228430", - "ip": "172.30.3.5", - "mac": "A8:40:25:FF:D1:C4", - "subnet": "172.30.3.0/24", - "vni": 100, - "primary": true, - "slot": 0 - }, - "ntp_servers": [ - "time.cloudflare.com" - ], - "snat_cfg": { - "ip": "198.51.100.25", - "first_port": 0, - "last_port": 16383 - } - } - }, - { - "id": "92cba955-3a5a-4d82-b0f2-30e89d4556d1", - "underlay_address": "fd00:1122:3344:101::7", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::7]:32345", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "9ba4cda7-d2e4-4c44-b1a6-8ddfe676098b", - "underlay_address": "fd00:1122:3344:101::3", - "zone_type": { - "type": "cockroach_db", - "address": "[fd00:1122:3344:101::3]:32221", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "e668e3f5-5457-4689-97da-b2af537787ac", - "underlay_address": "fd00:1122:3344:101::b", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::b]:32345", - "dataset": { - "pool_name": "oxp_f4b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - }, - { - "id": "f32fd972-7f40-4c58-9e00-7fc5c44273f4", - "underlay_address": "fd00:1122:3344:101::9", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::9]:32345", - "dataset": { - "pool_name": "oxp_d462a4f4-b628-40fe-80ff-4e4189e2d62b" - } - } - }, - { - "id": "f8c79ba4-194a-4cfe-8090-5315e297b780", - "underlay_address": "fd00:1122:3344:1::1", - "zone_type": { - "type": "internal_dns", - "dataset": { - "pool_name": "oxp_14b4dc84-ab46-49fb-a4b4-d361ae214c03" - }, - "dns_address": "[fd00:1122:3344:1::1]:53", - "gz_address": "fd00:1122:3344:1::2", - "gz_address_index": 0, - "http_address": "[fd00:1122:3344:1::1]:5353" - } - }, - { - "id": "fa5e0176-b4a8-4598-aa31-40fd562d246c", - "underlay_address": "fd00:1122:3344:101::a", - "zone_type": { - "type": "crucible", - "address": "[fd00:1122:3344:101::a]:32345", - "dataset": { - "pool_name": "oxp_e4b4dc84-ab46-49fb-a4b4-d361ae214c03" - } - } - } - ] - } - }, - "zones_in_service": [ - "084cac6e-44b5-4333-a2ff-b0993b534898", - "0d459323-e414-4f32-9944-76c7331da622", - "0db88baf-911d-47bb-af71-3aebd7c96934", - "11c527c5-0598-428e-9270-be5b74d3461b", - "1ebea0c3-1bfd-472c-9f84-ac9e23b32707", - "20be9299-495d-428d-b315-694c2c4b64af", - "213d7dd3-95a4-45a7-99ca-e4899991dab4", - "218f36a5-9e51-4b88-ad1a-da4d85c246c4", - "2902972b-3ae4-489d-b937-6480352e214a", - "2b29cb95-f8c6-4aff-acc0-1c0a627be392", - "2e9dfa8f-5371-48e5-b7f7-62a6af8283c1", - "2ee832de-af75-47ac-abac-f91304857ca4", - "30050a7e-7fc3-4965-b07b-1635212393eb", - "40c47ead-3be8-4724-a8ef-b66233fc5c65", - "425d9d2f-72ea-4f53-80b6-04e002771cdb", - "46a050b6-37b8-47b9-b4ae-ccb736ecd6d5", - "4ea8104f-2cfc-4599-9d2c-bcfd8f0b71fd", - "57c712a6-6429-44b7-a9b2-9957cb9054d4", - "59c4c9f0-bea9-46b7-ae9d-fb6dc1d658b9", - "73916098-788f-48d8-b745-e13fdcfb771b", - "7611a549-effc-41b6-b6cb-c03e0c70a31f", - "8494befe-6df6-42d1-9baa-599ba4228430", - "8d452bdd-e8b8-4108-a690-46fc59197db0", - "92cba955-3a5a-4d82-b0f2-30e89d4556d1", - "953019c0-8e85-4417-b231-d42820470125", - "99c635b9-8e97-414a-8316-8261d2d767d0", - "9ba4cda7-d2e4-4c44-b1a6-8ddfe676098b", - "9bb513e3-7505-416c-aa70-b26f1152bbdc", - "9c14c879-137b-4f5b-8068-1292bffc83ed", - "9cf90589-5da1-4b42-b09b-d784e4134637", - "af7ccead-2bd8-4a8a-9fbf-3b788d180139", - "cbe1abfa-0063-44b2-9ce7-7ad76b403a94", - "d4428e41-ad7b-41f0-bde6-7c7c955f20c1", - "d48b2dfa-c749-47dd-98b6-3f478cd63934", - "d52e797a-8fff-4e1e-a5ff-0ab8c8293ded", - "dc7f703a-27d1-4802-b85d-5629ddb2d67c", - "e668e3f5-5457-4689-97da-b2af537787ac", - "f0ed9838-6f1b-4646-a478-9f74f2e6e802", - "f32fd972-7f40-4c58-9e00-7fc5c44273f4", - "f8c79ba4-194a-4cfe-8090-5315e297b780", - "fa5e0176-b4a8-4598-aa31-40fd562d246c", - "fd003bee-818a-4c95-aae5-e378ac601522" - ], - "parent_blueprint_id": null, - "internal_dns_version": 1, - "external_dns_version": 1, - "time_created": "2024-03-12T19:11:49.876621Z", - "creator": "0d459323-e414-4f32-9944-76c7331da622", - "comment": "from collection 5e1d6ae0-c5b4-4884-ac41-680cd4f5762d" - } - ] -} diff --git a/dev-tools/reconfigurator-cli/tests/test_basic.rs b/dev-tools/reconfigurator-cli/tests/test_basic.rs index f70fcb1366..6048aece1b 100644 --- a/dev-tools/reconfigurator-cli/tests/test_basic.rs +++ b/dev-tools/reconfigurator-cli/tests/test_basic.rs @@ -2,10 +2,7 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. -use anyhow::Context; -use camino::Utf8Path; use expectorate::assert_contents; -use nexus_types::deployment::UnstableReconfiguratorState; use omicron_test_utils::dev::test_cmds::assert_exit_code; use omicron_test_utils::dev::test_cmds::path_to_executable; use omicron_test_utils::dev::test_cmds::redact_variable; @@ -28,88 +25,3 @@ fn test_basic() { assert_contents("tests/output/cmd-stdout", &stdout_text); assert_contents("tests/output/cmd-stderr", &stderr_text); } - -// To do more interesting testing, we need more interesting data than we can -// currently cons up in the REPL environment. This test uses a file saved from -// the "madrid" rig using `omdb db reconfigurator-save`. -// -// This test may be broken if the format of this file changes (see the -// UnstableReconfiguratorState struct). To fix it, generate a new file from a -// real system with at least one inventory collection and at least two -// blueprints. You will also need to set EXPECTORATE=overwrite when running -// this for the first time with the new input file in order to generate the new -// output file. Check it. -// -// If this test becomes too burdensome, we could drop it. But for now it's -// useful to have a smoke test for the command. -#[test] -fn test_complex() { - let input_path = Utf8Path::new("tests/input/complex.json"); - let input_file = std::fs::File::open(input_path) - .with_context(|| format!("open {:?}", input_path)) - .unwrap(); - let input_data: UnstableReconfiguratorState = - serde_json::from_reader(&input_file) - .with_context(|| format!("read {:?}", input_path)) - .unwrap(); - assert!( - input_data.collections.len() > 0, - "input file must have at least one inventory collection" - ); - assert!( - input_data.blueprints.len() > 1, - "input file must have at least two blueprints" - ); - - let collection = input_data.collections.iter().next().unwrap().id; - let mut blueprints = input_data.blueprints.iter().rev(); - let blueprint2 = blueprints.next().unwrap().id; - let blueprint1 = blueprints.next().unwrap().id; - let tmpdir = camino_tempfile::tempdir().expect("failed to create tmpdir"); - let tmpfile = tmpdir.path().join("cmds.txt"); - - // We construct the list of commands dynamically to avoid having to re-do it - // when the input file has to be regenerated. - let input_cmds = [ - "sled-list", - "inventory-list", - "blueprint-list", - &format!("file-contents {}", input_path), - &format!("load {} {}", input_path, collection), - "sled-list", - "inventory-list", - "blueprint-list", - &format!("blueprint-show {}", blueprint2), - &format!("blueprint-diff-inventory {} {}", collection, blueprint2), - &format!("blueprint-diff {} {}", blueprint1, blueprint2), - &format!("blueprint-diff {} {}", blueprint2, blueprint1), - "sled-add dde1c0e2-b10d-4621-b420-f179f7a7a00a", - &format!("blueprint-plan {} {}", blueprint2, collection), - ] - .into_iter() - .map(|s| format!("{}\n", s)) - .collect::>() - .join("\n"); - - println!("will execute commands:\n{}", input_cmds); - - std::fs::write(&tmpfile, &input_cmds) - .with_context(|| format!("write {:?}", &tmpfile)) - .unwrap(); - - let exec = Exec::cmd(path_to_cli()).arg(&tmpfile); - let (exit_status, stdout_text, stderr_text) = run_command(exec); - assert_exit_code(exit_status, EXIT_SUCCESS, &stderr_text); - - // This is a much lighter form of redaction than `redact_variable()` does. - let stdout_text = - regex::Regex::new(r"generated blueprint .* based on parent blueprint") - .unwrap() - .replace_all( - &stdout_text, - "generated blueprint REDACTED_UUID based on parent blueprint", - ) - .to_string(); - - assert_contents("tests/output/cmd-complex-stdout", &stdout_text); -} From 272398c15a2f95f97587040a93bc3b856e60e233 Mon Sep 17 00:00:00 2001 From: Nils Nieuwejaar Date: Thu, 14 Mar 2024 22:26:34 -0400 Subject: [PATCH 4/5] bump lldp to pick up fix for a bench gimlet SMF crash (#5269) --- package-manifest.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-manifest.toml b/package-manifest.toml index a3e1fa133d..ef4e6dfb06 100644 --- a/package-manifest.toml +++ b/package-manifest.toml @@ -557,8 +557,8 @@ output.intermediate_only = true service_name = "lldp" source.type = "prebuilt" source.repo = "lldp" -source.commit = "e165090e393df90874329265799480e221884236" -source.sha256 = "004a6488a948d894fa203222aa42e159e1ae12c13751607852302d111e2c58e6" +source.commit = "daab8580d6994c29f3c45ffa5a76b1de765b30da" +source.sha256 = "15a9068fdd4521a77f7d32c80d1e6d3a6a4ad15accab77641ed8f14175ae0db6" output.type = "zone" output.intermediate_only = true From e825a085075421c4f6bc968f744f08594ce70a05 Mon Sep 17 00:00:00 2001 From: "Joshua M. Clulow" Date: Fri, 15 Mar 2024 01:34:20 -0700 Subject: [PATCH 5/5] zone bundle tests fail on ZFS pool with 4K sectors (ashift=12) (#5260) --- sled-agent/src/zone_bundle.rs | 97 ++++++++++++++++++++++++----------- 1 file changed, 68 insertions(+), 29 deletions(-) diff --git a/sled-agent/src/zone_bundle.rs b/sled-agent/src/zone_bundle.rs index 4c4cbf5490..7b0d9b8071 100644 --- a/sled-agent/src/zone_bundle.rs +++ b/sled-agent/src/zone_bundle.rs @@ -2176,9 +2176,12 @@ mod illumos_tests { use super::ZoneBundler; use super::ZFS; use anyhow::Context; + use chrono::DateTime; use chrono::TimeZone; + use chrono::Timelike; use chrono::Utc; use illumos_utils::zpool::ZpoolName; + use rand::RngCore; use sled_storage::disk::RawDisk; use sled_storage::disk::SyntheticDisk; use sled_storage::manager::{FakeStorageManager, StorageHandle}; @@ -2186,6 +2189,43 @@ mod illumos_tests { use slog::Logger; use tokio::process::Command; + /// An iterator that returns the date of consecutive days beginning with 1st + /// January 2020. The time portion of each returned date will be fixed at + /// midnight in UTC. + struct DaysOfOurBundles { + next: DateTime, + } + + impl DaysOfOurBundles { + fn new() -> DaysOfOurBundles { + DaysOfOurBundles { + next: Utc + // Set the start date to 1st January 2020: + .with_ymd_and_hms(2020, 1, 1, 0, 0, 0) + .single() + .unwrap(), + } + } + } + + impl Iterator for DaysOfOurBundles { + type Item = DateTime; + + fn next(&mut self) -> Option { + let out = self.next; + + // We promise that all returned dates are aligned with midnight UTC: + assert_eq!(out.hour(), 0); + assert_eq!(out.minute(), 0); + assert_eq!(out.second(), 0); + + self.next = + self.next.checked_add_days(chrono::Days::new(1)).unwrap(); + + Some(out) + } + } + #[tokio::test] async fn test_zfs_quota() { let path = @@ -2327,9 +2367,14 @@ mod illumos_tests { // Quota applied to test datasets. // - // This needs to be at least this big lest we get "out of space" errors when - // creating. Not sure where those come from, but could be ZFS overhead. - const TEST_QUOTA: u64 = 1024 * 32; + // ZFS will not allow a quota to be set that is smaller than the bytes + // presently stored for that dataset, either at dataset creation time or + // later by setting the "quota" property. The exact minimum number of bytes + // depends on many factors, including the block size of the underlying pool; + // i.e., the "ashift" value. An empty dataset is unlikely to contain more + // than one megabyte of overhead, so use that as a conservative test size to + // avoid issues. + const TEST_QUOTA: u64 = 1024 * 1024; async fn create_test_dataset( id: &Uuid, @@ -2441,9 +2486,7 @@ mod illumos_tests { // back. let info = insert_fake_bundle( &paths[0], - 2020, - 1, - 1, + DaysOfOurBundles::new().next().unwrap(), ZoneBundleCause::ExplicitRequest, ) .await?; @@ -2514,7 +2557,7 @@ mod illumos_tests { .await .context("failed to update cleanup context")?; - let mut day = 1; + let mut days = DaysOfOurBundles::new(); let mut info = Vec::new(); let mut utilization = ctx.bundler.utilization().await?; loop { @@ -2527,13 +2570,10 @@ mod illumos_tests { } let it = insert_fake_bundle( &ctx.resource_wrapper.dirs[0], - 2020, - 1, - day, + days.next().unwrap(), ZoneBundleCause::ExplicitRequest, ) .await?; - day += 1; info.push(it); utilization = ctx.bundler.utilization().await?; } @@ -2581,20 +2621,17 @@ mod illumos_tests { async fn test_list_with_filter_body( ctx: CleanupTestContext, ) -> anyhow::Result<()> { - let mut day = 1; + let mut days = DaysOfOurBundles::new(); let mut info = Vec::new(); const N_BUNDLES: usize = 3; for i in 0..N_BUNDLES { let it = insert_fake_bundle_with_zone_name( &ctx.resource_wrapper.dirs[0], - 2020, - 1, - day, + days.next().unwrap(), ZoneBundleCause::ExplicitRequest, format!("oxz_whatever_{i}").as_str(), ) .await?; - day += 1; info.push(it); } @@ -2641,16 +2678,12 @@ mod illumos_tests { async fn insert_fake_bundle( dir: &Utf8Path, - year: i32, - month: u32, - day: u32, + time_created: DateTime, cause: ZoneBundleCause, ) -> anyhow::Result { insert_fake_bundle_with_zone_name( dir, - year, - month, - day, + time_created, cause, "oxz_whatever", ) @@ -2659,21 +2692,20 @@ mod illumos_tests { async fn insert_fake_bundle_with_zone_name( dir: &Utf8Path, - year: i32, - month: u32, - day: u32, + time_created: DateTime, cause: ZoneBundleCause, zone_name: &str, ) -> anyhow::Result { + assert_eq!(time_created.hour(), 0); + assert_eq!(time_created.minute(), 0); + assert_eq!(time_created.second(), 0); + let metadata = ZoneBundleMetadata { id: ZoneBundleId { zone_name: String::from(zone_name), bundle_id: uuid::Uuid::new_v4(), }, - time_created: Utc - .with_ymd_and_hms(year, month, day, 0, 0, 0) - .single() - .context("invalid year/month/day")?, + time_created, cause, version: 0, }; @@ -2704,6 +2736,13 @@ mod illumos_tests { super::ZONE_BUNDLE_METADATA_FILENAME, contents.as_bytes(), )?; + + // Inject some ~incompressible ballast to ensure the bundles are, though + // fake, not also microscopic: + let mut ballast = vec![0; 64 * 1024]; + rand::thread_rng().fill_bytes(&mut ballast); + super::insert_data(&mut builder, "ballast.bin", &ballast)?; + let _ = builder.into_inner().context("failed to finish tarball")?; let bytes = tokio::fs::metadata(&path).await?.len(); Ok(ZoneBundleInfo { metadata, path, bytes })