Skip to content

Commit 9d95e0c

Browse files
authored
inventory: Add sled-agent instance manager status to db table (PR 2/2) (#11226)
This adds the new inventory field(s) from #11225 to the database. Closes #11121.
1 parent 7da3cfe commit 9d95e0c

17 files changed

Lines changed: 243 additions & 35 deletions

File tree

dev-tools/reconfigurator-cli/tests/output/cmds-example-stdout

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1750,6 +1750,7 @@ LEDGERED SLED CONFIG
17501750
all datasets reconciled successfully
17511751
all zones reconciled successfully
17521752
reconciler task status: idle (finished at <REDACTED_TIMESTAMP> after running for <REDACTED_DURATION>s)
1753+
instance manager status: available (0 registered VMMs)
17531754
reference measurements:
17541755
(measurement set is empty)
17551756
fmd:
@@ -1904,6 +1905,7 @@ LEDGERED SLED CONFIG
19041905
all datasets reconciled successfully
19051906
all zones reconciled successfully
19061907
reconciler task status: idle (finished at <REDACTED_TIMESTAMP> after running for <REDACTED_DURATION>s)
1908+
instance manager status: available (0 registered VMMs)
19071909
reference measurements:
19081910
(measurement set is empty)
19091911
fmd:
@@ -2151,6 +2153,7 @@ LEDGERED SLED CONFIG
21512153
all datasets reconciled successfully
21522154
all zones reconciled successfully
21532155
reconciler task status: idle (finished at <REDACTED_TIMESTAMP> after running for <REDACTED_DURATION>s)
2156+
instance manager status: available (0 registered VMMs)
21542157
reference measurements:
21552158
(measurement set is empty)
21562159
fmd:

dev-tools/reconfigurator-cli/tests/output/cmds-mupdate-update-flow-stdout

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ LEDGERED SLED CONFIG
301301
all datasets reconciled successfully
302302
all zones reconciled successfully
303303
reconciler task status: idle (finished at <REDACTED_TIMESTAMP> after running for <REDACTED_DURATION>s)
304+
instance manager status: available (0 registered VMMs)
304305
reference measurements:
305306
(measurement set is empty)
306307
fmd:
@@ -440,6 +441,7 @@ LEDGERED SLED CONFIG
440441
all datasets reconciled successfully
441442
all zones reconciled successfully
442443
reconciler task status: idle (finished at <REDACTED_TIMESTAMP> after running for <REDACTED_DURATION>s)
444+
instance manager status: available (0 registered VMMs)
443445
reference measurements:
444446
(measurement set is empty)
445447
fmd:
@@ -566,6 +568,7 @@ LEDGERED SLED CONFIG
566568
all datasets reconciled successfully
567569
all zones reconciled successfully
568570
reconciler task status: idle (finished at <REDACTED_TIMESTAMP> after running for <REDACTED_DURATION>s)
571+
instance manager status: available (0 registered VMMs)
569572
reference measurements:
570573
(measurement set is empty)
571574
fmd:

dev-tools/reconfigurator-cli/tests/output/cmds-nexus-generation-autobump-stdout

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,7 @@ LEDGERED SLED CONFIG
734734
all datasets reconciled successfully
735735
all zones reconciled successfully
736736
reconciler task status: idle (finished at <REDACTED_TIMESTAMP> after running for <REDACTED_DURATION>s)
737+
instance manager status: available (0 registered VMMs)
737738
reference measurements:
738739
(measurement set is empty)
739740
fmd:
@@ -932,6 +933,7 @@ LEDGERED SLED CONFIG
932933
all datasets reconciled successfully
933934
all zones reconciled successfully
934935
reconciler task status: idle (finished at <REDACTED_TIMESTAMP> after running for <REDACTED_DURATION>s)
936+
instance manager status: available (0 registered VMMs)
935937
reference measurements:
936938
(measurement set is empty)
937939
fmd:
@@ -1130,6 +1132,7 @@ LEDGERED SLED CONFIG
11301132
all datasets reconciled successfully
11311133
all zones reconciled successfully
11321134
reconciler task status: idle (finished at <REDACTED_TIMESTAMP> after running for <REDACTED_DURATION>s)
1135+
instance manager status: available (0 registered VMMs)
11331136
reference measurements:
11341137
(measurement set is empty)
11351138
fmd:

dev-tools/reconfigurator-cli/tests/output/cmds-target-release-stdout

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,7 @@ LEDGERED SLED CONFIG
714714
all datasets reconciled successfully
715715
all zones reconciled successfully
716716
reconciler task status: idle (finished at <REDACTED_TIMESTAMP> after running for <REDACTED_DURATION>s)
717+
instance manager status: available (0 registered VMMs)
717718
reference measurements:
718719
(measurement set is empty)
719720
fmd:
@@ -912,6 +913,7 @@ LEDGERED SLED CONFIG
912913
all datasets reconciled successfully
913914
all zones reconciled successfully
914915
reconciler task status: idle (finished at <REDACTED_TIMESTAMP> after running for <REDACTED_DURATION>s)
916+
instance manager status: available (0 registered VMMs)
915917
reference measurements:
916918
(measurement set is empty)
917919
fmd:
@@ -1110,6 +1112,7 @@ LEDGERED SLED CONFIG
11101112
all datasets reconciled successfully
11111113
all zones reconciled successfully
11121114
reconciler task status: idle (finished at <REDACTED_TIMESTAMP> after running for <REDACTED_DURATION>s)
1115+
instance manager status: available (0 registered VMMs)
11131116
reference measurements:
11141117
(measurement set is empty)
11151118
fmd:

dev-tools/reconfigurator-cli/tests/output/cmds-unsafe-zone-mgs-stdout

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,7 @@ LEDGERED SLED CONFIG
768768
all datasets reconciled successfully
769769
all zones reconciled successfully
770770
reconciler task status: idle (finished at <REDACTED_TIMESTAMP> after running for <REDACTED_DURATION>s)
771+
instance manager status: available (0 registered VMMs)
771772
reference measurements:
772773
(measurement set is empty)
773774
fmd:
@@ -966,6 +967,7 @@ LEDGERED SLED CONFIG
966967
all datasets reconciled successfully
967968
all zones reconciled successfully
968969
reconciler task status: idle (finished at <REDACTED_TIMESTAMP> after running for <REDACTED_DURATION>s)
970+
instance manager status: available (0 registered VMMs)
969971
reference measurements:
970972
(measurement set is empty)
971973
fmd:
@@ -1164,6 +1166,7 @@ LEDGERED SLED CONFIG
11641166
all datasets reconciled successfully
11651167
all zones reconciled successfully
11661168
reconciler task status: idle (finished at <REDACTED_TIMESTAMP> after running for <REDACTED_DURATION>s)
1169+
instance manager status: available (0 registered VMMs)
11671170
reference measurements:
11681171
(measurement set is empty)
11691172
fmd:

nexus/db-model/src/inventory.rs

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,15 @@ use sled_agent_types::disk::SharedDatasetConfig;
9393
use sled_agent_types::inventory::BootImageHeader;
9494
use sled_agent_types::inventory::BootPartitionDetails;
9595
use sled_agent_types::inventory::ConfigReconcilerInventoryStatus;
96+
use sled_agent_types::inventory::CurrentUpdateDisposition;
9697
use sled_agent_types::inventory::ExternalDnsAddrs;
9798
use sled_agent_types::inventory::FmdHostCase;
9899
use sled_agent_types::inventory::FmdInventory;
99100
use sled_agent_types::inventory::FmdInventoryError;
100101
use sled_agent_types::inventory::FmdResource;
101102
use sled_agent_types::inventory::HostPhase2DesiredContents;
102103
use sled_agent_types::inventory::HostPhase2DesiredSlots;
104+
use sled_agent_types::inventory::InstanceManagerStatus;
103105
use sled_agent_types::inventory::ManifestBootInventory;
104106
use sled_agent_types::inventory::ManifestInventory;
105107
use sled_agent_types::inventory::ManifestNonBootInventory;
@@ -949,6 +951,71 @@ pub struct InvSledAgent {
949951

950952
#[diesel(embed)]
951953
pub file_source_resolver: InvOmicronFileSourceResolver,
954+
955+
instance_manager_update_disposition: Option<DbInvSledUpdateDisposition>,
956+
instance_manager_num_registered_vmms: SqlU32,
957+
}
958+
959+
/// Helper for breaking an [`InstanceManagerStatus`] up into its DB columns.
960+
#[derive(Debug, Clone, Copy)]
961+
pub struct InvInstanceManagerStatusCols {
962+
pub update_disposition: Option<DbInvSledUpdateDisposition>,
963+
pub num_registered_vmms: SqlU32,
964+
}
965+
966+
impl TryFrom<InstanceManagerStatus> for InvInstanceManagerStatusCols {
967+
type Error = anyhow::Error;
968+
969+
fn try_from(status: InstanceManagerStatus) -> Result<Self, Self::Error> {
970+
let InstanceManagerStatus { update_disposition, num_registered_vmms } =
971+
status;
972+
973+
// "no config" becomes NULL; `Known(_)` becomes non-NULL.
974+
let update_disposition = match update_disposition {
975+
CurrentUpdateDisposition::ConfigNotAvailable => None,
976+
CurrentUpdateDisposition::Known(disposition) => {
977+
Some(disposition.into())
978+
}
979+
};
980+
981+
// We never expect this to fail; there are many practial limits to the
982+
// number of VMMs registered on a sled far lower than `u32::MAX`.
983+
let num_registered_vmms =
984+
SqlU32::new(u32::try_from(num_registered_vmms).map_err(|_| {
985+
anyhow!(
986+
"inventory claims there are {num_registered_vmms} \
987+
on a sled; this doesn't fit in a SqlU32"
988+
)
989+
})?);
990+
991+
Ok(Self { update_disposition, num_registered_vmms })
992+
}
993+
}
994+
995+
impl From<InvInstanceManagerStatusCols> for InstanceManagerStatus {
996+
fn from(cols: InvInstanceManagerStatusCols) -> Self {
997+
let InvInstanceManagerStatusCols {
998+
update_disposition,
999+
num_registered_vmms,
1000+
} = cols;
1001+
1002+
// See the comments in the `From<InstanceManagerStatus>` impl; we do the
1003+
// reverse here.
1004+
let update_disposition = match update_disposition {
1005+
None => CurrentUpdateDisposition::ConfigNotAvailable,
1006+
Some(disposition) => {
1007+
CurrentUpdateDisposition::Known(disposition.into())
1008+
}
1009+
};
1010+
1011+
// usize can always contain a u32; saturate instead of unwrapping to
1012+
// suppress the error branch.
1013+
let num_registered_vmms: u32 = *num_registered_vmms;
1014+
let num_registered_vmms =
1015+
usize::try_from(num_registered_vmms).unwrap_or(usize::MAX);
1016+
1017+
InstanceManagerStatus { update_disposition, num_registered_vmms }
1018+
}
9521019
}
9531020

9541021
/// See [`sled_agent_types::inventory::ConfigReconcilerInventoryStatus`].
@@ -1338,6 +1405,11 @@ impl InvSledAgent {
13381405
non-null baseboard id"
13391406
))
13401407
} else {
1408+
let InvInstanceManagerStatusCols {
1409+
update_disposition: instance_manager_update_disposition,
1410+
num_registered_vmms: instance_manager_num_registered_vmms,
1411+
} = sled_agent.instance_manager_status.try_into()?;
1412+
13411413
Ok(InvSledAgent {
13421414
inv_collection_id: collection_id.into(),
13431415
time_collected: sled_agent.time_collected,
@@ -1360,9 +1432,21 @@ impl InvSledAgent {
13601432
ledgered_sled_config: ledgered_sled_config.map(From::from),
13611433
reconciler_status,
13621434
file_source_resolver,
1435+
instance_manager_update_disposition,
1436+
instance_manager_num_registered_vmms,
13631437
})
13641438
}
13651439
}
1440+
1441+
/// Reassemble an [`InstanceManagerStatus`] from the database
1442+
/// representation held by `self`.
1443+
pub fn instance_manager_status(&self) -> InstanceManagerStatus {
1444+
InvInstanceManagerStatusCols {
1445+
update_disposition: self.instance_manager_update_disposition,
1446+
num_registered_vmms: self.instance_manager_num_registered_vmms,
1447+
}
1448+
.into()
1449+
}
13661450
}
13671451

13681452
#[derive(Queryable, Clone, Debug, Selectable, Insertable)]

nexus/db-model/src/schema_versions.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use std::{collections::BTreeMap, sync::LazyLock};
1616
///
1717
/// This must be updated when you change the database schema. Refer to
1818
/// schema/crdb/README.adoc in the root of this repository for details.
19-
pub const SCHEMA_VERSION: Version = Version::new(299, 0, 0);
19+
pub const SCHEMA_VERSION: Version = Version::new(300, 0, 0);
2020

2121
/// List of all past database schema versions, in *reverse* order
2222
///
@@ -28,6 +28,7 @@ pub static KNOWN_VERSIONS: LazyLock<Vec<KnownVersion>> = LazyLock::new(|| {
2828
// | leaving the first copy as an example for the next person.
2929
// v
3030
// KnownVersion::new(next_int, "unique-dirname-with-the-sql-files"),
31+
KnownVersion::new(300, "inv-instance-manager-status"),
3132
KnownVersion::new(299, "blueprint-pruner-config"),
3233
KnownVersion::new(298, "blueprint-zone-multiple-external-ips"),
3334
KnownVersion::new(297, "inventory-zone-multiple-external-ips"),

0 commit comments

Comments
 (0)