Skip to content

Commit 5e66a38

Browse files
committed
move ereports into nexus-types
1 parent e186ab4 commit 5e66a38

File tree

7 files changed

+166
-154
lines changed

7 files changed

+166
-154
lines changed

dev-tools/omdb/src/bin/omdb/db/ereport.rs

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,17 @@ use clap::Args;
2121
use clap::Subcommand;
2222
use diesel::dsl::{count_distinct, min};
2323
use diesel::prelude::*;
24-
use ereport_types::Ena;
25-
use ereport_types::EreporterRestartUuid;
2624
use nexus_db_lookup::DbConnection;
2725
use nexus_db_model::SpType;
2826
use nexus_db_queries::db;
2927
use nexus_db_queries::db::DataStore;
3028
use nexus_db_queries::db::queries::ALLOW_FULL_TABLE_SCAN_SQL;
3129
use nexus_db_schema::schema::host_ereport::dsl as host_dsl;
3230
use nexus_db_schema::schema::sp_ereport::dsl as sp_dsl;
31+
use nexus_types::fm::ereport::{
32+
Ena, Ereport, EreportId, EreportMetadata, Reporter,
33+
};
34+
use omicron_uuid_kinds::EreporterRestartUuid;
3335
use omicron_uuid_kinds::GenericUuid;
3436
use omicron_uuid_kinds::SledUuid;
3537
use tabled::Tabled;
@@ -130,7 +132,7 @@ async fn cmd_db_ereport_list(
130132
ena: Ena,
131133
#[tabled(display_with = "display_option_blank")]
132134
class: Option<String>,
133-
source: db::model::Reporter,
135+
source: Reporter,
134136
#[tabled(display_with = "display_option_blank", rename = "S/N")]
135137
serial: Option<&'report str>,
136138
#[tabled(display_with = "display_option_blank", rename = "P/N")]
@@ -155,7 +157,7 @@ async fn cmd_db_ereport_list(
155157
restart_id: restart_id.into_untyped_uuid(),
156158
ena: ena.into(),
157159
class: class.clone(),
158-
source: db::model::Reporter::Sp {
160+
source: Reporter::Sp {
159161
sp_type: sp_type.into(),
160162
slot: sp_slot.0,
161163
},
@@ -181,7 +183,7 @@ async fn cmd_db_ereport_list(
181183
restart_id: restart_id.into_untyped_uuid(),
182184
ena: ena.into(),
183185
class: class.clone(),
184-
source: db::model::Reporter::HostOs { sled: sled_id.into() },
186+
source: Reporter::HostOs { sled: sled_id.into() },
185187
serial: Some(&sled_serial),
186188
part_number: None, // TODO(eliza): go get this from inventory?
187189
}
@@ -306,17 +308,18 @@ async fn cmd_db_ereport_info(
306308
let &InfoArgs { restart_id, ena } = args;
307309
let ereport_id = ereport_types::EreportId { restart_id, ena };
308310
let conn = datastore.pool_connection_for_tests().await?;
309-
let db::model::Ereport { id, metadata, reporter, report } =
310-
ereport_fetch(&conn, fetch_opts, ereport_id).await?;
311-
312-
let db::model::EreportMetadata {
313-
time_collected,
314-
time_deleted,
315-
collector_id,
311+
let Ereport {
312+
id,
316313
part_number,
317314
serial_number,
318315
class,
319-
} = metadata;
316+
metadata,
317+
reporter,
318+
report,
319+
} = ereport_fetch(&conn, fetch_opts, ereport_id).await?;
320+
321+
let EreportMetadata { time_collected, time_deleted, collector_id } =
322+
metadata;
320323
const ENA: &str = "ENA";
321324
const TIME_COLLECTED: &str = "collected at";
322325
const TIME_DELETED: &str = "deleted at";
@@ -347,12 +350,12 @@ async fn cmd_db_ereport_info(
347350
println!(" {TIME_COLLECTED:>WIDTH$}: {time_collected}");
348351
println!(" {COLLECTOR_ID:>WIDTH$}: {collector_id}");
349352
match reporter {
350-
db::model::Reporter::Sp { sp_type, slot } => {
353+
Reporter::Sp { sp_type, slot } => {
351354
println!(
352355
" {REPORTER:>WIDTH$}: {sp_type:?} {slot} (service processor)"
353356
)
354357
}
355-
db::model::Reporter::HostOs { sled } => {
358+
Reporter::HostOs { sled } => {
356359
println!(" {REPORTER:>WIDTH$}: sled {sled:?} (host OS)");
357360
}
358361
}
@@ -377,8 +380,8 @@ async fn cmd_db_ereport_info(
377380
async fn ereport_fetch(
378381
conn: &async_bb8_diesel::Connection<DbConnection>,
379382
fetch_opts: &DbFetchOptions,
380-
id: ereport_types::EreportId,
381-
) -> anyhow::Result<db::model::Ereport> {
383+
id: EreportId,
384+
) -> anyhow::Result<Ereport> {
382385
let restart_id = id.restart_id.into_untyped_uuid();
383386
let ena = db::model::DbEna::from(id.ena);
384387

@@ -530,7 +533,7 @@ async fn cmd_db_ereporters(
530533
#[tabled(display_with = "datetime_opt_rfc3339_concise")]
531534
first_seen: Option<DateTime<Utc>>,
532535
id: Uuid,
533-
identity: db::model::Reporter,
536+
identity: Reporter,
534537
#[tabled(display_with = "display_option_blank", rename = "S/N")]
535538
serial: Option<String>,
536539
#[tabled(display_with = "display_option_blank", rename = "P/N")]
@@ -551,7 +554,7 @@ async fn cmd_db_ereporters(
551554
)| {
552555
ReporterRow {
553556
first_seen,
554-
identity: db::model::Reporter::Sp {
557+
identity: Reporter::Sp {
555558
slot: slot.0,
556559
sp_type: sp_type.into(),
557560
},
@@ -565,7 +568,7 @@ async fn cmd_db_ereporters(
565568
let host_rows = host_ereporters.into_iter().map(
566569
|(restart_id, sled_id, serial, first_seen, ereports)| ReporterRow {
567570
first_seen,
568-
identity: db::model::Reporter::HostOs {
571+
identity: Reporter::HostOs {
569572
sled: SledUuid::from_untyped_uuid(sled_id),
570573
},
571574
serial: Some(serial),

nexus/db-model/src/ereport.rs

Lines changed: 64 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,13 @@ use diesel::pg::Pg;
1212
use diesel::prelude::*;
1313
use diesel::serialize::{self, ToSql};
1414
use diesel::sql_types;
15-
use ereport_types::{Ena, EreportId};
1615
use nexus_db_schema::schema::{host_ereport, sp_ereport};
17-
use omicron_uuid_kinds::{
18-
EreporterRestartKind, OmicronZoneKind, OmicronZoneUuid, SledKind, SledUuid,
16+
use nexus_types::fm::ereport::{
17+
Ena, Ereport, EreportId, EreportMetadata, Reporter,
1918
};
19+
use omicron_uuid_kinds::{EreporterRestartKind, OmicronZoneKind, SledKind};
2020
use serde::{Deserialize, Serialize};
2121
use std::convert::TryFrom;
22-
use std::fmt;
2322

2423
#[derive(
2524
Copy,
@@ -63,131 +62,6 @@ where
6362
}
6463
}
6564

66-
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
67-
pub struct Ereport {
68-
#[serde(flatten)]
69-
pub id: EreportId,
70-
#[serde(flatten)]
71-
pub metadata: EreportMetadata,
72-
pub reporter: Reporter,
73-
#[serde(flatten)]
74-
pub report: serde_json::Value,
75-
}
76-
77-
impl From<SpEreport> for Ereport {
78-
fn from(sp_report: SpEreport) -> Self {
79-
let SpEreport {
80-
restart_id,
81-
ena,
82-
time_collected,
83-
time_deleted,
84-
collector_id,
85-
part_number,
86-
serial_number,
87-
sp_type,
88-
sp_slot,
89-
class,
90-
report,
91-
} = sp_report;
92-
Ereport {
93-
id: EreportId { restart_id: restart_id.into(), ena: ena.into() },
94-
metadata: EreportMetadata {
95-
time_collected,
96-
time_deleted,
97-
collector_id: collector_id.into(),
98-
part_number,
99-
serial_number,
100-
class,
101-
},
102-
reporter: Reporter::Sp { sp_type: sp_type.into(), slot: sp_slot.0 },
103-
report,
104-
}
105-
}
106-
}
107-
108-
impl From<HostEreport> for Ereport {
109-
fn from(host_report: HostEreport) -> Self {
110-
let HostEreport {
111-
restart_id,
112-
ena,
113-
time_collected,
114-
time_deleted,
115-
collector_id,
116-
sled_serial,
117-
sled_id,
118-
class,
119-
report,
120-
part_number,
121-
} = host_report;
122-
Ereport {
123-
id: EreportId { restart_id: restart_id.into(), ena: ena.into() },
124-
metadata: EreportMetadata {
125-
time_collected,
126-
time_deleted,
127-
collector_id: collector_id.into(),
128-
part_number,
129-
serial_number: Some(sled_serial),
130-
class,
131-
},
132-
reporter: Reporter::HostOs { sled: sled_id.into() },
133-
report,
134-
}
135-
}
136-
}
137-
138-
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
139-
pub struct EreportMetadata {
140-
pub time_collected: DateTime<Utc>,
141-
pub time_deleted: Option<DateTime<Utc>>,
142-
pub collector_id: OmicronZoneUuid,
143-
pub part_number: Option<String>,
144-
pub serial_number: Option<String>,
145-
pub class: Option<String>,
146-
}
147-
148-
#[derive(
149-
Clone,
150-
Debug,
151-
Eq,
152-
PartialEq,
153-
Ord,
154-
PartialOrd,
155-
serde::Serialize,
156-
serde::Deserialize,
157-
)]
158-
pub enum Reporter {
159-
Sp { sp_type: nexus_types::inventory::SpType, slot: u16 },
160-
HostOs { sled: SledUuid },
161-
}
162-
163-
impl std::fmt::Display for Reporter {
164-
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
165-
match self {
166-
Self::Sp {
167-
sp_type: nexus_types::inventory::SpType::Sled,
168-
slot,
169-
} => {
170-
write!(f, "Sled (SP) {slot:02}")
171-
}
172-
Self::Sp {
173-
sp_type: nexus_types::inventory::SpType::Switch,
174-
slot,
175-
} => {
176-
write!(f, "Switch {slot}")
177-
}
178-
Self::Sp {
179-
sp_type: nexus_types::inventory::SpType::Power,
180-
slot,
181-
} => {
182-
write!(f, "PSC {slot}")
183-
}
184-
Self::HostOs { sled } => {
185-
write!(f, "Sled (OS) {sled:?}")
186-
}
187-
}
188-
}
189-
}
190-
19165
#[derive(Clone, Debug, Insertable, Queryable, Selectable)]
19266
#[diesel(table_name = sp_ereport)]
19367
pub struct SpEreport {
@@ -235,6 +109,37 @@ pub struct SpEreport {
235109
pub report: serde_json::Value,
236110
}
237111

112+
impl From<SpEreport> for Ereport {
113+
fn from(sp_report: SpEreport) -> Self {
114+
let SpEreport {
115+
restart_id,
116+
ena,
117+
time_collected,
118+
time_deleted,
119+
collector_id,
120+
part_number,
121+
serial_number,
122+
sp_type,
123+
sp_slot,
124+
class,
125+
report,
126+
} = sp_report;
127+
Ereport {
128+
id: EreportId { restart_id: restart_id.into(), ena: ena.into() },
129+
part_number,
130+
serial_number,
131+
class,
132+
metadata: EreportMetadata {
133+
time_collected,
134+
time_deleted,
135+
collector_id: collector_id.into(),
136+
},
137+
reporter: Reporter::Sp { sp_type: sp_type.into(), slot: sp_slot.0 },
138+
report,
139+
}
140+
}
141+
}
142+
238143
#[derive(Clone, Debug, Insertable, Queryable, Selectable)]
239144
#[diesel(table_name = host_ereport)]
240145
pub struct HostEreport {
@@ -261,3 +166,33 @@ pub struct HostEreport {
261166
// table's part_number column. Sad.
262167
pub part_number: Option<String>,
263168
}
169+
170+
impl From<HostEreport> for Ereport {
171+
fn from(host_report: HostEreport) -> Self {
172+
let HostEreport {
173+
restart_id,
174+
ena,
175+
time_collected,
176+
time_deleted,
177+
collector_id,
178+
sled_serial,
179+
sled_id,
180+
class,
181+
report,
182+
part_number,
183+
} = host_report;
184+
Ereport {
185+
id: EreportId { restart_id: restart_id.into(), ena: ena.into() },
186+
part_number,
187+
serial_number: Some(sled_serial),
188+
class,
189+
metadata: EreportMetadata {
190+
time_collected,
191+
time_deleted,
192+
collector_id: collector_id.into(),
193+
},
194+
reporter: Reporter::HostOs { sled: sled_id.into() },
195+
report,
196+
}
197+
}
198+
}

nexus/db-queries/src/db/datastore/ereport.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@ use crate::authz;
99
use crate::context::OpContext;
1010
use crate::db::datastore::RunnableQuery;
1111
use crate::db::model::DbEna;
12-
use crate::db::model::Ereport;
1312
use crate::db::model::HostEreport;
14-
use crate::db::model::Reporter;
1513
use crate::db::model::SpEreport;
1614
use crate::db::model::SpMgsSlot;
1715
use crate::db::model::SpType;
@@ -28,6 +26,7 @@ use nexus_db_errors::public_error_from_diesel;
2826
use nexus_db_lookup::DbConnection;
2927
use nexus_db_schema::schema::host_ereport::dsl as host_dsl;
3028
use nexus_db_schema::schema::sp_ereport::dsl as sp_dsl;
29+
use nexus_types::fm::ereport::{Ereport, Reporter};
3130
use omicron_common::api::external::CreateResult;
3231
use omicron_common::api::external::DataPageParams;
3332
use omicron_common::api::external::Error;

nexus/src/app/background/tasks/support_bundle_collector.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ use gateway_client::types::SpIgnition;
2323
use gateway_types::component::SpType;
2424
use internal_dns_resolver::Resolver;
2525
use internal_dns_types::names::ServiceName;
26-
use nexus_db_model::Ereport;
2726
use nexus_db_model::Sled;
2827
use nexus_db_model::SupportBundle;
2928
use nexus_db_model::SupportBundleState;
@@ -35,6 +34,7 @@ use nexus_db_queries::db::datastore::EreportFilters;
3534
use nexus_db_queries::db::pagination::Paginator;
3635
use nexus_reconfigurator_preparation::reconfigurator_state_load;
3736
use nexus_types::deployment::SledFilter;
37+
use nexus_types::fm::Ereport;
3838
use nexus_types::identity::Asset;
3939
use nexus_types::internal_api::background::SupportBundleCleanupReport;
4040
use nexus_types::internal_api::background::SupportBundleCollectionReport;
@@ -1248,7 +1248,6 @@ async fn write_ereport(ereport: Ereport, dir: &Utf8Path) -> anyhow::Result<()> {
12481248
// metadata --- we must check that it doesn't contain any characters
12491249
// unsuitable for use in a filesystem path.
12501250
let pn = ereport
1251-
.metadata
12521251
.part_number
12531252
.as_deref()
12541253
// If the part or serial numbers contain any unsavoury characters, it
@@ -1259,7 +1258,6 @@ async fn write_ereport(ereport: Ereport, dir: &Utf8Path) -> anyhow::Result<()> {
12591258
.filter(|&s| is_fs_safe_single_path_component(s))
12601259
.unwrap_or("unknown_part");
12611260
let sn = ereport
1262-
.metadata
12631261
.serial_number
12641262
.as_deref()
12651263
.filter(|&s| is_fs_safe_single_path_component(s))

0 commit comments

Comments
 (0)