Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
64d23d1
Add CRDB schema changes required for trust quorum
andrewjstone Dec 4, 2025
cc3bc37
Fix a bunch of stupid mistakes and add back migrations
andrewjstone Dec 6, 2025
4830679
add some constraints and remove unnecessary index
andrewjstone Dec 8, 2025
1d4b12a
add diesel schema (ewwww)
andrewjstone Dec 8, 2025
1946d7c
fix db-schema
andrewjstone Dec 8, 2025
db5b2ed
add initial db models
andrewjstone Dec 8, 2025
a338b00
fix bytes
andrewjstone Dec 8, 2025
c9f8f9a
An query
andrewjstone Dec 9, 2025
e418dba
simplify schema
andrewjstone Dec 9, 2025
4236fa3
update db-model to reflect schema simplification
andrewjstone Dec 9, 2025
0680906
another query
andrewjstone Dec 9, 2025
bc23316
wip
andrewjstone Dec 9, 2025
b7f085b
more queries
andrewjstone Dec 10, 2025
5cd8c30
another test
andrewjstone Dec 10, 2025
86a8aa7
more test
andrewjstone Dec 10, 2025
9477f7f
more test and a constraint
andrewjstone Dec 10, 2025
486eb30
wip
andrewjstone Dec 11, 2025
5f1b61d
stop unwrapping for epoch conversions
andrewjstone Dec 11, 2025
1a6f0c1
wip
andrewjstone Dec 12, 2025
438ced8
wip
andrewjstone Dec 12, 2025
1bce851
wip
andrewjstone Dec 12, 2025
b7be6cc
wip
andrewjstone Dec 12, 2025
684ad4c
wip
andrewjstone Dec 15, 2025
2fecb67
wip
andrewjstone Dec 15, 2025
3e07675
know thy Self::
andrewjstone Dec 15, 2025
bea39cb
wip
andrewjstone Dec 17, 2025
63cd4d0
wip
andrewjstone Dec 17, 2025
fcf919d
wip
andrewjstone Dec 17, 2025
1af9e98
wip
andrewjstone Dec 17, 2025
d54c686
wip
andrewjstone Dec 17, 2025
27760e4
use new TransactionError API
andrewjstone Dec 17, 2025
954a4f7
clippy
andrewjstone Dec 17, 2025
4f5aef9
Only one type of `BaseboardId`
andrewjstone Dec 18, 2025
b79fddd
fix docs
andrewjstone Dec 18, 2025
406761b
Add some comments and a filter
andrewjstone Dec 18, 2025
f129033
Remove data migrations related to LRTQ
andrewjstone Dec 18, 2025
c15214c
fix schema migration
andrewjstone Dec 18, 2025
0c732e4
fix nexus-lockstep
andrewjstone Dec 18, 2025
37bff29
test cleanup
andrewjstone Dec 18, 2025
a01e813
Add rack_id/epoch query and test
andrewjstone Dec 19, 2025
134bb2c
Schema fixes
andrewjstone Dec 19, 2025
e543ef3
A couple of review fixes
andrewjstone Dec 20, 2025
f7f893a
more review fixes
andrewjstone Dec 20, 2025
ee6c50a
Committing -> Committed
andrewjstone Dec 20, 2025
9847448
cleanup
andrewjstone Dec 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dev-tools/omdb/src/bin/omdb/nexus.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ use nexus_types::internal_api::background::TufArtifactReplicationCounters;
use nexus_types::internal_api::background::TufArtifactReplicationRequest;
use nexus_types::internal_api::background::TufArtifactReplicationStatus;
use nexus_types::internal_api::background::TufRepoPrunerStatus;
use nexus_types::inventory::BaseboardId;
use omicron_uuid_kinds::BlueprintUuid;
use omicron_uuid_kinds::CollectionUuid;
use omicron_uuid_kinds::DemoSagaUuid;
Expand All @@ -92,6 +91,7 @@ use quiesce::cmd_nexus_quiesce;
use reconfigurator_config::ReconfiguratorConfigArgs;
use reconfigurator_config::cmd_nexus_reconfigurator_config;
use serde::Deserialize;
use sled_agent_types::sled::BaseboardId;
use slog_error_chain::InlineErrorChain;
use std::collections::BTreeMap;
use std::collections::BTreeSet;
Expand Down
1 change: 1 addition & 0 deletions dev-tools/reconfigurator-sp-updater/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ omicron-repl-utils.workspace = true
oxide-tokio-rt.workspace = true
qorb.workspace = true
serde_json.workspace = true
sled-agent-types.workspace = true
slog.workspace = true
swrite.workspace = true
tokio = { workspace = true, features = [ "full" ] }
Expand Down
2 changes: 1 addition & 1 deletion dev-tools/reconfigurator-sp-updater/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ use nexus_types::deployment::PendingMgsUpdateRotDetails;
use nexus_types::deployment::PendingMgsUpdateSpDetails;
use nexus_types::deployment::PendingMgsUpdates;
use nexus_types::internal_api::views::MgsUpdateDriverStatus;
use nexus_types::inventory::BaseboardId;
use nexus_types::inventory::SpType;
use omicron_common::disk::M2Slot;
use omicron_repl_utils::run_repl_on_stdin;
use qorb::resolver::Resolver;
use qorb::resolvers::fixed::FixedResolver;
use sled_agent_types::sled::BaseboardId;
use slog::{info, o, warn};
use std::collections::BTreeMap;
use std::net::SocketAddr;
Expand Down
1 change: 1 addition & 0 deletions nexus/db-model/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ slog-error-chain.workspace = true
steno.workspace = true
strum.workspace = true
thiserror.workspace = true
trust-quorum-protocol.workspace = true
tokio.workspace = true
uuid.workspace = true

Expand Down
2 changes: 1 addition & 1 deletion nexus/db-model/src/deployment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ use nexus_types::deployment::{
OmicronZoneExternalFloatingAddr, OmicronZoneExternalFloatingIp,
OmicronZoneExternalSnatIp,
};
use nexus_types::inventory::BaseboardId;
use omicron_common::address::Ipv6Subnet;
use omicron_common::address::SLED_PREFIX;
use omicron_common::api::internal::shared::NetworkInterface;
Expand All @@ -69,6 +68,7 @@ use omicron_uuid_kinds::{
PhysicalDiskKind, SledKind, SledUuid, ZpoolKind, ZpoolUuid,
};
use sled_agent_types::inventory::OmicronZoneDataset;
use sled_agent_types::sled::BaseboardId;
use std::net::{IpAddr, SocketAddrV6};
use std::sync::Arc;
use uuid::Uuid;
Expand Down
10 changes: 5 additions & 5 deletions nexus/db-model/src/inventory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,8 @@ use nexus_db_schema::schema::{
};
use nexus_types::inventory::HostPhase1ActiveSlot;
use nexus_types::inventory::{
BaseboardId, Caboose, CockroachStatus, Collection,
InternalDnsGenerationStatus, NvmeFirmware, PowerState, RotPage, RotSlot,
TimeSync,
Caboose, CockroachStatus, Collection, InternalDnsGenerationStatus,
NvmeFirmware, PowerState, RotPage, RotSlot, TimeSync,
};
use omicron_common::api::external;
use omicron_common::api::internal::shared::NetworkInterface;
Expand Down Expand Up @@ -94,6 +93,7 @@ use sled_agent_types::inventory::{
ConfigReconcilerInventoryResult, OmicronSledConfig, OmicronZoneConfig,
OmicronZoneDataset, OmicronZoneImageSource, OmicronZoneType,
};
use sled_agent_types::sled::BaseboardId;
use std::collections::BTreeSet;
use std::net::{IpAddr, SocketAddrV6};
use std::time::Duration;
Expand Down Expand Up @@ -489,8 +489,8 @@ impl<'a> From<&'a Collection> for InvCollection {
}
}

/// See [`nexus_types::inventory::BaseboardId`].
#[derive(Queryable, Insertable, Clone, Debug, Selectable)]
/// See [`sled_agent_types::sled::BaseboardId`].
#[derive(Queryable, Insertable, Clone, Debug, Selectable, PartialEq, Eq)]
#[diesel(table_name = hw_baseboard_id)]
pub struct HwBaseboardId {
pub id: Uuid,
Expand Down
2 changes: 2 additions & 0 deletions nexus/db-model/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ mod silo_auth_settings;
mod switch_interface;
mod switch_port;
mod target_release;
mod trust_quorum;
mod v2p_mapping;
mod vmm_state;
mod webhook_delivery;
Expand Down Expand Up @@ -262,6 +263,7 @@ pub use switch::*;
pub use switch_interface::*;
pub use switch_port::*;
pub use target_release::*;
pub use trust_quorum::*;
pub use tuf_repo::*;
pub use typed_uuid::DbTypedUuid;
pub use typed_uuid::to_db_typed_uuid;
Expand Down
3 changes: 2 additions & 1 deletion nexus/db-model/src/schema_versions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use std::{collections::BTreeMap, sync::LazyLock};
///
/// This must be updated when you change the database schema. Refer to
/// schema/crdb/README.adoc in the root of this repository for details.
pub const SCHEMA_VERSION: Version = Version::new(215, 0, 0);
pub const SCHEMA_VERSION: Version = Version::new(216, 0, 0);

/// List of all past database schema versions, in *reverse* order
///
Expand All @@ -28,6 +28,7 @@ static KNOWN_VERSIONS: LazyLock<Vec<KnownVersion>> = LazyLock::new(|| {
// | leaving the first copy as an example for the next person.
// v
// KnownVersion::new(next_int, "unique-dirname-with-the-sql-files"),
KnownVersion::new(216, "add-trust-quorum"),
KnownVersion::new(215, "support-up-to-12-disks"),
KnownVersion::new(214, "separate-transit-ips-by-version"),
KnownVersion::new(213, "fm-cases"),
Expand Down
115 changes: 115 additions & 0 deletions nexus/db-model/src/trust_quorum.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
// 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/.

//! Database representations for trust quorum types

use super::impl_enum_type;
use crate::SqlU8;
use crate::typed_uuid::DbTypedUuid;
use nexus_db_schema::schema::{
trust_quorum_configuration, trust_quorum_member,
};
use nexus_types::trust_quorum::{
TrustQuorumConfigState, TrustQuorumMemberState,
};
use omicron_uuid_kinds::RackKind;
use serde::{Deserialize, Serialize};
use uuid::Uuid;

impl_enum_type!(
TrustQuorumConfigurationStateEnum:

#[derive(Clone, Copy, Debug, AsExpression, FromSqlRow, Serialize, Deserialize, PartialEq)]
pub enum DbTrustQuorumConfigurationState;

// Enum values
Preparing => b"preparing"
PreparingLrtqUpgrade => b"preparing-lrtq-upgrade"
Committing => b"committing"
Committed => b"committed"
Aborted => b"aborted"
);

impl From<DbTrustQuorumConfigurationState> for TrustQuorumConfigState {
fn from(value: DbTrustQuorumConfigurationState) -> Self {
match value {
DbTrustQuorumConfigurationState::Preparing => Self::Preparing,
DbTrustQuorumConfigurationState::PreparingLrtqUpgrade => {
Self::PreparingLrtqUpgrade
}
DbTrustQuorumConfigurationState::Committing => Self::Committing,
DbTrustQuorumConfigurationState::Committed => Self::Committed,
DbTrustQuorumConfigurationState::Aborted => Self::Aborted,
}
}
}

impl From<TrustQuorumConfigState> for DbTrustQuorumConfigurationState {
fn from(value: TrustQuorumConfigState) -> Self {
match value {
TrustQuorumConfigState::Preparing => Self::Preparing,
TrustQuorumConfigState::PreparingLrtqUpgrade => {
Self::PreparingLrtqUpgrade
}
TrustQuorumConfigState::Committing => Self::Committing,
TrustQuorumConfigState::Committed => Self::Committed,
TrustQuorumConfigState::Aborted => Self::Aborted,
}
}
}

impl_enum_type!(
TrustQuorumMemberStateEnum:

#[derive(Clone, Copy, Debug, AsExpression, FromSqlRow, Serialize, Deserialize, PartialEq)]
pub enum DbTrustQuorumMemberState;

// Enum values
Unacked => b"unacked"
Prepared => b"prepared"
Committed => b"committed"
);

impl From<DbTrustQuorumMemberState> for TrustQuorumMemberState {
fn from(value: DbTrustQuorumMemberState) -> Self {
match value {
DbTrustQuorumMemberState::Unacked => Self::Unacked,
DbTrustQuorumMemberState::Prepared => Self::Prepared,
DbTrustQuorumMemberState::Committed => Self::Committed,
}
}
}

impl From<TrustQuorumMemberState> for DbTrustQuorumMemberState {
fn from(value: TrustQuorumMemberState) -> Self {
match value {
TrustQuorumMemberState::Unacked => Self::Unacked,
TrustQuorumMemberState::Prepared => Self::Prepared,
TrustQuorumMemberState::Committed => Self::Committed,
}
}
}

#[derive(Queryable, Insertable, Clone, Debug, Selectable)]
#[diesel(table_name = trust_quorum_configuration)]
pub struct TrustQuorumConfiguration {
pub rack_id: DbTypedUuid<RackKind>,
pub epoch: i64,
pub state: DbTrustQuorumConfigurationState,
pub threshold: SqlU8,
pub commit_crash_tolerance: SqlU8,
pub coordinator: Uuid,
pub encrypted_rack_secrets_salt: Option<String>,
pub encrypted_rack_secrets: Option<Vec<u8>>,
}

#[derive(Queryable, Insertable, Clone, Debug, Selectable)]
#[diesel(table_name = trust_quorum_member)]
pub struct TrustQuorumMember {
pub rack_id: DbTypedUuid<RackKind>,
pub epoch: i64,
pub hw_baseboard_id: Uuid,
pub state: DbTrustQuorumMemberState,
pub share_digest: Option<String>,
}
1 change: 1 addition & 0 deletions nexus/db-queries/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ swrite.workspace = true
thiserror.workspace = true
tokio = { workspace = true, features = ["full"] }
tufaceous-artifact.workspace = true
trust-quorum-protocol.workspace = true
url.workspace = true
usdt.workspace = true
uuid.workspace = true
Expand Down
4 changes: 2 additions & 2 deletions nexus/db-queries/src/db/datastore/deployment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ use nexus_types::deployment::PendingMgsUpdateRotBootloaderDetails;
use nexus_types::deployment::PendingMgsUpdateRotDetails;
use nexus_types::deployment::PendingMgsUpdateSpDetails;
use nexus_types::deployment::PendingMgsUpdates;
use nexus_types::inventory::BaseboardId;
use omicron_common::api::external::DataPageParams;
use omicron_common::api::external::Error;
use omicron_common::api::external::Generation;
Expand All @@ -105,6 +104,7 @@ use omicron_uuid_kinds::GenericUuid;
use omicron_uuid_kinds::OmicronZoneUuid;
use omicron_uuid_kinds::SledUuid;
use omicron_uuid_kinds::TypedUuid;
use sled_agent_types::sled::BaseboardId;
use slog::Logger;
use slog_error_chain::InlineErrorChain;
use std::collections::BTreeMap;
Expand Down Expand Up @@ -3097,7 +3097,6 @@ mod tests {
use nexus_types::external_api::views::PhysicalDiskState;
use nexus_types::external_api::views::SledPolicy;
use nexus_types::external_api::views::SledState;
use nexus_types::inventory::BaseboardId;
use nexus_types::inventory::Collection;
use omicron_common::address::IpRange;
use omicron_common::address::Ipv6Subnet;
Expand All @@ -3116,6 +3115,7 @@ mod tests {
use omicron_uuid_kinds::ZpoolUuid;
use pretty_assertions::assert_eq;
use rand::Rng;
use sled_agent_types::sled::BaseboardId;
use std::collections::BTreeSet;
use std::mem;
use std::net::Ipv6Addr;
Expand Down
Loading
Loading