Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e43d46e
[reconfigurator-cli script test changes]
iliana Jul 8, 2026
9cadc66
tufaceous v2 for nexus
iliana Jul 8, 2026
5a34123
add schema migration test
iliana Jul 9, 2026
0b217af
Merge remote-tracking branch 'origin/main' into iliana/tufaceous-v2/3…
iliana Jul 9, 2026
9d336f6
Merge remote-tracking branch 'origin/main' into iliana/tufaceous-v2/3…
iliana Jul 15, 2026
341b060
Merge remote-tracking branch 'origin/main' into iliana/tufaceous-v2/3…
iliana Jul 15, 2026
3631ea1
Merge remote-tracking branch 'origin/main' into iliana/tufaceous-v2/3…
iliana Jul 20, 2026
4b38325
update tufaceous
iliana Jul 21, 2026
2299c8e
Merge remote-tracking branch 'origin/main' into iliana/tufaceous-v2/3…
iliana Jul 22, 2026
3737945
expectorate
iliana Jul 22, 2026
19c25e5
Merge remote-tracking branch 'origin/main' into iliana/tufaceous-v2/3…
iliana Jul 27, 2026
eb18cec
clearer function names: `fn from_*` -> `fn new`
iliana Jul 27, 2026
e6c5c25
clarify why we don't paginate repo contents
iliana Jul 27, 2026
de39dea
clarify artifacts with same content but different tags
iliana Jul 27, 2026
1fdf71e
eq_any is wonderful
iliana Jul 27, 2026
8f92c09
select slot B correctly in the example system
iliana Jul 27, 2026
258ca43
FAKE_SIGN -> FAKE_ROT_RKTH
iliana Jul 27, 2026
8d1170e
Merge remote-tracking branch 'origin/main' into iliana/tufaceous-v2/3…
iliana Jul 29, 2026
80d9dcf
comments
iliana Jul 29, 2026
25fe8df
split up multi-column drops
iliana Jul 29, 2026
512f5e9
be kind, rewind
iliana Jul 29, 2026
ef5b488
ugh cockroach
iliana Jul 29, 2026
e3d3774
find the correct tag count in the migration test
iliana Jul 29, 2026
2bf4fc8
inline and paginate tuf_list_repo_artifacts_without_tags
iliana Jul 29, 2026
b07d946
separate error for metadata mismatch
iliana Jul 29, 2026
ed34009
bump generation number on repo re-upload
iliana Jul 29, 2026
d301cd7
avoid having invariants in TufArtifactDescription
iliana Jul 30, 2026
7e6af3c
fix InsertError::ByteCountRangeError
iliana Jul 30, 2026
92e43d5
comment on ArtifactHash::v1_json_schema
iliana Jul 30, 2026
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
164 changes: 108 additions & 56 deletions Cargo.lock

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -614,6 +614,7 @@ linear-map = "1.2.0"
live-tests-macros = { path = "live-tests/macros" }
lldpd_client = { git = "https://github.com/oxidecomputer/lldp", rev = "54b266174d4de9628bca9c97b0db176e16f12154", package = "lldpd-client" }
lldp_protocol = { git = "https://github.com/oxidecomputer/lldp", rev = "54b266174d4de9628bca9c97b0db176e16f12154", package = "protocol" }
lpc55_areas = { git = "https://github.com/oxidecomputer/lpc55_support" }
omicron-deployment-graph = { path = "dev-tools/omicron-deployment-graph" }
macaddr = { version = "1.0.1", features = ["serde_std"] }
maplit = "1.0.2"
Expand Down Expand Up @@ -878,7 +879,8 @@ tufaceous-artifact = { git = "https://github.com/oxidecomputer/tufaceous", branc
tufaceous-brand-metadata = { git = "https://github.com/oxidecomputer/tufaceous", branch = "v1" }
tufaceous-lib = { git = "https://github.com/oxidecomputer/tufaceous", branch = "v1" }
tufaceous-v2 = { git = "https://github.com/oxidecomputer/tufaceous", branch = "main", package = "tufaceous" }
tufaceous-artifact-v2 = { git = "https://github.com/oxidecomputer/tufaceous", branch = "main", package = "tufaceous-artifact" }
tufaceous-artifact-v2 = { git = "https://github.com/oxidecomputer/tufaceous", branch = "main", package = "tufaceous-artifact", features = ["proptest", "schemars"] }
tufaceous-brand-metadata-v2 = { git = "https://github.com/oxidecomputer/tufaceous", branch = "main", package = "tufaceous-brand-metadata" }
tui-tree-widget = "0.23.1"
typed-rng = { path = "typed-rng" }
typify = "0.3.0"
Expand Down
1 change: 1 addition & 0 deletions common/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ progenitor-extras.workspace = true
omicron-workspace-hack.workspace = true
regress.workspace = true
tufaceous-artifact.workspace = true
tufaceous-artifact-v2.workspace = true

[dev-dependencies]
camino-tempfile.workspace = true
Expand Down
83 changes: 2 additions & 81 deletions common/src/api/external/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ mod error;
pub mod http_pagination;
pub use crate::address::IpVersion;
pub use crate::api::internal::shared::AllowedSourceIps;
use crate::update::ArtifactId;
use api_identity::ObjectIdentity;
use chrono::DateTime;
use chrono::Utc;
Expand All @@ -28,7 +27,6 @@ use parse_display::Display;
use parse_display::FromStr;
use rand::Rng;
use schemars::JsonSchema;
use semver::Version;
use serde::Deserialize;
use serde::Serialize;
use serde_with::{DeserializeFromStr, SerializeDisplay};
Expand All @@ -45,7 +43,6 @@ use std::num::{NonZeroU16, NonZeroU32};
use std::ops::Deref;
use std::ops::RangeInclusive;
use std::str::FromStr;
use tufaceous_artifact::ArtifactHash;
use uuid::Uuid;

// The type aliases below exist primarily to ensure consistency among return
Expand Down Expand Up @@ -591,6 +588,8 @@ impl Display for ByteCount {
// TODO-cleanup This could use the experimental std::num::IntErrorKind.
#[derive(
Debug,
Clone,
Copy,
Eq,
thiserror::Error,
Ord,
Expand Down Expand Up @@ -2506,84 +2505,6 @@ pub struct ServiceIcmpConfig {
pub enabled: bool,
}

// TODO: move these TUF repo structs out of this file. They're not external
// anymore after refactors that use views::TufRepo in the external API. They are
// still used extensively in internal services.

/// A description of an uploaded TUF repository.
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, JsonSchema)]
pub struct TufRepoDescription {
/// Information about the repository.
pub repo: TufRepoMeta,

/// Information about the artifacts present in the repository.
pub artifacts: Vec<TufArtifactMeta>,
}

impl TufRepoDescription {
/// Sorts the artifacts so that descriptions can be compared.
pub fn sort_artifacts(&mut self) {
self.artifacts.sort_by(|a, b| a.id.cmp(&b.id));
}
}

/// Metadata about a TUF repository.
///
/// Found within a `TufRepoDescription`.
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, JsonSchema)]
pub struct TufRepoMeta {
/// The hash of the repository.
///
/// This is a slight abuse of `ArtifactHash`, since that's the hash of
/// individual artifacts within the repository. However, we use it here for
/// convenience.
pub hash: ArtifactHash,

/// The version of the targets role.
pub targets_role_version: u64,

/// The time until which the repo is valid.
pub valid_until: DateTime<Utc>,

/// The system version in artifacts.json.
pub system_version: Version,

/// The file name of the repository.
///
/// This is purely used for debugging and may not always be correct (e.g.
/// with wicket, we read the file contents from stdin so we don't know the
/// correct file name).
pub file_name: String,
}

/// Metadata about an individual TUF artifact.
///
/// Found within a `TufRepoDescription`.
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, JsonSchema)]
pub struct TufArtifactMeta {
/// The artifact ID.
pub id: ArtifactId,

/// The hash of the artifact.
pub hash: ArtifactHash,

/// The size of the artifact in bytes.
pub size: u64,

/// Contents of the `BORD` field of a Hubris archive caboose. Only
/// applicable to artifacts that are Hubris archives.
///
/// This field should always be `Some(_)` if `sign` is `Some(_)`, but the
/// opposite is not true (SP images will have a `board` but not a `sign`).
pub board: Option<String>,

/// Contents of the `SIGN` field of a Hubris archive caboose, i.e.,
/// an identifier for the set of valid signing keys. Currently only
/// applicable to RoT image and bootloader artifacts, where it will
/// be an LPC55 Root Key Table Hash (RKTH).
pub sign: Option<Vec<u8>>,
}

/// A networking probe
#[derive(
Clone, Debug, Deserialize, JsonSchema, Serialize, PartialEq, ObjectIdentity,
Expand Down
16 changes: 16 additions & 0 deletions common/src/update/install_manifest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,22 @@ pub struct OmicronInstallMetadata {
pub hash: ArtifactHash,
}

impl OmicronInstallMetadata {
// TODO(iliana): remove when cleaning up Tufaceous v1
pub fn new_v2(
file_name: String,
file_size: u64,
hash: tufaceous_artifact_v2::ArtifactHash,
) -> Self {
Self { file_name, file_size, hash: ArtifactHash(hash.0) }
}

// TODO(iliana): remove when cleaning up Tufaceous v1
pub fn hash_v2(&self) -> tufaceous_artifact_v2::ArtifactHash {
tufaceous_artifact_v2::ArtifactHash(self.hash.0)
}
}

Comment thread
iliana marked this conversation as resolved.
impl IdOrdItem for OmicronInstallMetadata {
type Key<'a> = &'a str;

Expand Down
1 change: 0 additions & 1 deletion dev-tools/omdb/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,6 @@ tabled.workspace = true
textwrap.workspace = true
tokio = { workspace = true, features = ["full"] }
trust-quorum-types.workspace = true
tufaceous-artifact.workspace = true
unicode-width.workspace = true
oxide-update-engine-types.workspace = true
oxide-update-engine-display.workspace = true
Expand Down
7 changes: 3 additions & 4 deletions dev-tools/reconfigurator-cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ sled-agent-types.workspace = true
omicron-common.workspace = true
omicron-repl-utils.workspace = true
omicron-uuid-kinds.workspace = true
oxide-tokio-rt.workspace = true
# See omicron-rpaths for more about the "pq-sys" dependency.
pq-sys = "*"
semver.workspace = true
Expand All @@ -45,10 +46,8 @@ swrite.workspace = true
tabled.workspace = true
tokio.workspace = true
toml.workspace = true
tufaceous.workspace = true
tufaceous-artifact.workspace = true
tufaceous-lib.workspace = true
update-common.workspace = true
tufaceous-artifact-v2.workspace = true
tufaceous-v2.workspace = true
uuid.workspace = true
omicron-workspace-hack.workspace = true

Expand Down
Loading
Loading