Skip to content
Merged
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
ca81f6f
[spr] initial version
sunshowers Jul 17, 2026
c9e80d9
[spr] changes to main this commit is based on
sunshowers Jul 17, 2026
ed5bbcf
a bunch of updates
sunshowers Jul 20, 2026
48679e0
[spr] changes introduced through rebase
sunshowers Jul 20, 2026
081b310
rebase
sunshowers Jul 21, 2026
06703f2
[spr] changes introduced through rebase
sunshowers Jul 21, 2026
7fcfa59
more updates
sunshowers Jul 21, 2026
40dfffb
[spr] changes introduced through rebase
sunshowers Jul 21, 2026
9b48da1
rebase
sunshowers Jul 21, 2026
15a8287
[spr] changes introduced through rebase
sunshowers Jul 21, 2026
f24509c
rebase, transceiver stuff
sunshowers Jul 21, 2026
747bcc8
[spr] changes introduced through rebase
sunshowers Jul 21, 2026
fe7c221
rustfmt
sunshowers Jul 21, 2026
a516281
lots more updates
sunshowers Jul 23, 2026
0b0907d
[spr] changes introduced through rebase
sunshowers Jul 23, 2026
1aeab59
more fixes
sunshowers Jul 23, 2026
538d2ab
[spr] changes introduced through rebase
sunshowers Jul 23, 2026
b23fe78
more fixes
sunshowers Jul 23, 2026
65e92d6
rustfmt
sunshowers Jul 23, 2026
3c0c201
a few more fixes
sunshowers Jul 23, 2026
ff4ec90
[spr] changes introduced through rebase
sunshowers Jul 23, 2026
9c94c5f
openapi
sunshowers Jul 23, 2026
78a19a5
start addressing review feedback
sunshowers Jul 23, 2026
de2ef61
[spr] changes introduced through rebase
sunshowers Jul 24, 2026
962c5fd
accidentally dropped a line
sunshowers Jul 24, 2026
4c7248d
rebase on main, review feedback from andrew and opus
sunshowers Jul 24, 2026
76020a8
wording tweaks
sunshowers Jul 24, 2026
5b5abbd
hopefully the final version
sunshowers Jul 25, 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
40 changes: 39 additions & 1 deletion Cargo.lock

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

6 changes: 6 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ members = [
"clients/repo-depot-client",
"clients/sled-agent-client",
"clients/wicketd-client",
"clients/wicketd-commission-client",
"cockroach-admin",
"cockroach-admin/api",
"cockroach-admin/types",
Expand Down Expand Up @@ -184,6 +185,7 @@ members = [
"wicket",
"wicketd",
"wicketd-api",
"wicketd-commission-api",
"wicketd-commission-types",
"wicketd-commission-types/versions",
"workspace-hack",
Expand Down Expand Up @@ -217,6 +219,7 @@ default-members = [
"clients/repo-depot-client",
"clients/sled-agent-client",
"clients/wicketd-client",
"clients/wicketd-commission-client",
"cockroach-admin",
"cockroach-admin/api",
"cockroach-admin/types",
Expand Down Expand Up @@ -378,6 +381,7 @@ default-members = [
"wicket",
"wicketd",
"wicketd-api",
"wicketd-commission-api",
"wicketd-commission-types",
"wicketd-commission-types/versions",
"workspace-hack",
Expand Down Expand Up @@ -897,6 +901,8 @@ wicket = { path = "wicket" }
wicket-common = { path = "wicket-common" }
wicketd-api = { path = "wicketd-api" }
wicketd-client = { path = "clients/wicketd-client" }
wicketd-commission-api = { path = "wicketd-commission-api" }
wicketd-commission-client = { path = "clients/wicketd-commission-client" }
wicketd-commission-types = { path = "wicketd-commission-types" }
wicketd-commission-types-versions = { path = "wicketd-commission-types/versions" }
x509-cert = { version = "0.2.5", default-features = false }
Expand Down
21 changes: 21 additions & 0 deletions clients/wicketd-commission-client/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
[package]
name = "wicketd-commission-client"
version = "0.1.0"
edition.workspace = true
license = "MPL-2.0"

[lints]
workspace = true

[dependencies]
iddqd.workspace = true
omicron-uuid-kinds.workspace = true
oxnet.workspace = true
progenitor.workspace = true
regress.workspace = true
reqwest = { workspace = true, features = ["json", "rustls", "stream"] }
schemars.workspace = true
serde.workspace = true
slog.workspace = true
wicketd-commission-types-versions.workspace = true
omicron-workspace-hack.workspace = true
122 changes: 122 additions & 0 deletions clients/wicketd-commission-client/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
// 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/.

//! Interface for making requests to the wicketd commissioning API.

progenitor::generate_api!(
spec = "../../openapi/wicketd-commission/wicketd-commission-latest.json",
interface = Positional,
inner_type = slog::Logger,
pre_hook = (|log: &slog::Logger, request: &reqwest::Request| {
slog::debug!(log, "client request";
"method" => %request.method(),
"uri" => %request.url(),
"body" => ?&request.body(),
);
}),
post_hook = (|log: &slog::Logger, result: &Result<_, _>| {
slog::debug!(log, "client response"; "result" => ?result);
}),
derives = [schemars::JsonSchema],
crates = {
"iddqd" = "*",
"omicron-uuid-kinds" = "*",
"oxnet" = "0.1.0",
},
replace = {
AllowedSourceIps = wicketd_commission_types_versions::latest::rack_setup::AllowedSourceIps,
BgpAuthKey = wicketd_commission_types_versions::latest::rack_setup::BgpAuthKey,
BgpAuthKeyId = wicketd_commission_types_versions::latest::rack_setup::BgpAuthKeyId,
BaseboardId = wicketd_commission_types_versions::latest::inventory::BaseboardId,
BgpConfig = wicketd_commission_types_versions::latest::rack_setup::BgpConfig,
BootstrapSled = wicketd_commission_types_versions::latest::inventory::BootstrapSled,
BootstrapSledState = wicketd_commission_types_versions::latest::inventory::BootstrapSledState,
Caboose = wicketd_commission_types_versions::latest::inventory::Caboose,
CertificatePem = wicketd_commission_types_versions::latest::rack_setup::CertificatePem,
CertificateUploadResponse = wicketd_commission_types_versions::latest::rack_setup::CertificateUploadResponse,
ClearUpdateStateParams = wicketd_commission_types_versions::latest::update::ClearUpdateStateParams,
ClearUpdateStateResponse = wicketd_commission_types_versions::latest::update::ClearUpdateStateResponse,
CmisDatapath = wicketd_commission_types_versions::latest::inventory::CmisDatapath,
CmisDatapathState = wicketd_commission_types_versions::latest::inventory::CmisDatapathState,
CmisLaneStatus = wicketd_commission_types_versions::latest::inventory::CmisLaneStatus,
FaultFlag = wicketd_commission_types_versions::latest::inventory::FaultFlag,
FetchError = wicketd_commission_types_versions::latest::inventory::FetchError,
GetBootstrapSledsResponse = wicketd_commission_types_versions::latest::inventory::GetBootstrapSledsResponse,
GetUpdateProgressResponse = wicketd_commission_types_versions::latest::update::GetUpdateProgressResponse,
IgnitionControllerDetect = wicketd_commission_types_versions::latest::inventory::IgnitionControllerDetect,
IgnitionFaults = wicketd_commission_types_versions::latest::inventory::IgnitionFaults,
Inventory = wicketd_commission_types_versions::latest::inventory::Inventory,
InventoryParams = wicketd_commission_types_versions::latest::inventory::InventoryParams,
IpRange = wicketd_commission_types_versions::latest::rack_setup::IpRange,
LaneMonitors = wicketd_commission_types_versions::latest::inventory::LaneMonitors,
Ipv4Range = wicketd_commission_types_versions::latest::rack_setup::Ipv4Range,
Ipv6Range = wicketd_commission_types_versions::latest::rack_setup::Ipv6Range,
LinkFec = wicketd_commission_types_versions::latest::rack_setup::LinkFec,
LinkSpeed = wicketd_commission_types_versions::latest::rack_setup::LinkSpeed,
LldpAdminStatus = wicketd_commission_types_versions::latest::rack_setup::LldpAdminStatus,
LldpPortConfig = wicketd_commission_types_versions::latest::rack_setup::LldpPortConfig,
LocationInfo = wicketd_commission_types_versions::latest::inventory::LocationInfo,
ManualPortConfig = wicketd_commission_types_versions::latest::rack_setup::ManualPortConfig,
MaxPathConfig = wicketd_commission_types_versions::latest::rack_setup::MaxPathConfig,
PowerState = wicketd_commission_types_versions::latest::inventory::PowerState,
PrivateKeyPem = wicketd_commission_types_versions::latest::rack_setup::PrivateKeyPem,
PutRecoveryUserPasswordHash = wicketd_commission_types_versions::latest::rack_setup::PutRecoveryUserPasswordHash,
PutRssUserConfigInsensitive = wicketd_commission_types_versions::latest::rack_setup::PutRssUserConfigInsensitive,
RackOperation = wicketd_commission_types_versions::latest::rack_setup::RackOperation,
RackOperationState = wicketd_commission_types_versions::latest::rack_setup::RackOperationState,
RackSetupStatus = wicketd_commission_types_versions::latest::rack_setup::RackSetupStatus,
RackState = wicketd_commission_types_versions::latest::rack_setup::RackState,
ReceiverPower = wicketd_commission_types_versions::latest::inventory::ReceiverPower,
RepositoryDescription = wicketd_commission_types_versions::latest::update::RepositoryDescription,
RotImageError = wicketd_commission_types_versions::latest::inventory::RotImageError,
RotImageValidity = wicketd_commission_types_versions::latest::inventory::RotImageValidity,
RotInfo = wicketd_commission_types_versions::latest::inventory::RotInfo,
RotSlot = wicketd_commission_types_versions::latest::inventory::RotSlot,
RotSlotInfo = wicketd_commission_types_versions::latest::inventory::RotSlotInfo,
RotStage0Info = wicketd_commission_types_versions::latest::inventory::RotStage0Info,
RouteConfig = wicketd_commission_types_versions::latest::rack_setup::RouteConfig,
RouterLifetimeConfig = wicketd_commission_types_versions::latest::rack_setup::RouterLifetimeConfig,
RssStepInfo = wicketd_commission_types_versions::latest::rack_setup::RssStepInfo,
RunRackSetupResponse = wicketd_commission_types_versions::latest::rack_setup::RunRackSetupResponse,
RunningProgress = wicketd_commission_types_versions::latest::update::RunningProgress,
SetBgpAuthKeyStatus = wicketd_commission_types_versions::latest::rack_setup::SetBgpAuthKeyStatus,
Sff8636LaneFaults = wicketd_commission_types_versions::latest::inventory::Sff8636LaneFaults,
SlotCaboose = wicketd_commission_types_versions::latest::inventory::SlotCaboose,
SpIdentifier = wicketd_commission_types_versions::latest::inventory::SpIdentifier,
SpIgnitionInfo = wicketd_commission_types_versions::latest::inventory::SpIgnitionInfo,
SpInfo = wicketd_commission_types_versions::latest::inventory::SpInfo,
SpStateInfo = wicketd_commission_types_versions::latest::inventory::SpStateInfo,
SpType = wicketd_commission_types_versions::latest::inventory::SpType,
Stage0Caboose = wicketd_commission_types_versions::latest::inventory::Stage0Caboose,
SpUpdateProgress = wicketd_commission_types_versions::latest::update::SpUpdateProgress,
StartUpdateOptions = wicketd_commission_types_versions::latest::update::StartUpdateOptions,
StartUpdateParams = wicketd_commission_types_versions::latest::update::StartUpdateParams,
StepOutcome = wicketd_commission_types_versions::latest::update::StepOutcome,
StepProgress = wicketd_commission_types_versions::latest::update::StepProgress,
SwitchSlot = wicketd_commission_types_versions::latest::inventory::SwitchSlot,
SwitchTransceivers = wicketd_commission_types_versions::latest::inventory::SwitchTransceivers,
Transceiver = wicketd_commission_types_versions::latest::inventory::Transceiver,
TransceiverDatapath = wicketd_commission_types_versions::latest::inventory::TransceiverDatapath,
TransceiverMonitors = wicketd_commission_types_versions::latest::inventory::TransceiverMonitors,
TransceiverPower = wicketd_commission_types_versions::latest::inventory::TransceiverPower,
TransceiverPowerMode = wicketd_commission_types_versions::latest::inventory::TransceiverPowerMode,
TransceiverStatus = wicketd_commission_types_versions::latest::inventory::TransceiverStatus,
TransceiverVendor = wicketd_commission_types_versions::latest::inventory::TransceiverVendor,
TxEqConfig = wicketd_commission_types_versions::latest::rack_setup::TxEqConfig,
UnmatchedBootstrapPeer = wicketd_commission_types_versions::latest::inventory::UnmatchedBootstrapPeer,
UpdateProgress = wicketd_commission_types_versions::latest::update::UpdateProgress,
UpdateState = wicketd_commission_types_versions::latest::update::UpdateState,
UpdateStep = wicketd_commission_types_versions::latest::update::UpdateStep,
UpdateTargets = wicketd_commission_types_versions::latest::update::UpdateTargets,
UpdateStepStatus = wicketd_commission_types_versions::latest::update::UpdateStepStatus,
UserSpecifiedBgpPeerConfig = wicketd_commission_types_versions::latest::rack_setup::UserSpecifiedBgpPeerConfig,
UserSpecifiedImportExportPolicy = wicketd_commission_types_versions::latest::rack_setup::UserSpecifiedImportExportPolicy,
UserSpecifiedPortConfig = wicketd_commission_types_versions::latest::rack_setup::UserSpecifiedPortConfig,
UserSpecifiedRackNetworkConfig = wicketd_commission_types_versions::latest::rack_setup::UserSpecifiedRackNetworkConfig,
UserSpecifiedRouterPeerAddr = wicketd_commission_types_versions::latest::rack_setup::UserSpecifiedRouterPeerAddr,
UserSpecifiedUplinkAddressConfig = wicketd_commission_types_versions::latest::rack_setup::UserSpecifiedUplinkAddressConfig,
},
);

pub type ClientError = crate::Error<crate::types::Error>;
1 change: 1 addition & 0 deletions common/src/address.rs
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,7 @@ pub const DDMD_PORT: u16 = 8000;
pub const MGS_PORT: u16 = 12225;
pub const WICKETD_PORT: u16 = 12226;
pub const BOOTSTRAP_ARTIFACT_PORT: u16 = 12227;
pub const WICKETD_COMMISSION_PORT: u16 = 12234;
pub const CRUCIBLE_PANTRY_PORT: u16 = 17000;
pub const TFPORTD_PORT: u16 = 12231;
pub const NEXUS_INTERNAL_PORT: u16 = 12221;
Expand Down
1 change: 1 addition & 0 deletions dev-tools/dropshot-apis/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ serde.workspace = true
serde_json.workspace = true
sled-agent-api.workspace = true
wicketd-api.workspace = true
wicketd-commission-api.workspace = true

[lints]
workspace = true
17 changes: 17 additions & 0 deletions dev-tools/dropshot-apis/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ use repo_depot_api::*;
use serde::{Deserialize, Serialize};
use sled_agent_api::*;
use wicketd_api::*;
use wicketd_commission_api::*;

fn environment() -> anyhow::Result<Environment> {
// The workspace root is two levels up from this crate's directory.
Expand Down Expand Up @@ -339,6 +340,22 @@ fn all_apis() -> anyhow::Result<ManagedApis> {
api_description: wicketd_api_mod::stub_api_description,
ident: "wicketd",
}),
ManagedApi::from(ManagedApiConfig {
title: "Wicketd Commission API",
versions: Versions::new_versioned(
wicketd_commission_api::supported_versions(),
),
metadata: ManagedApiMetadata {
description: Some(
"Stable API for rack commissioning (RFD 710)",
),
contact_url: Some("https://oxide.computer"),
contact_email: Some("api@oxide.computer"),
extra: to_value(ApiBoundary::Internal),
},
api_description: wicketd_commission_api_mod::stub_api_description,
ident: "wicketd-commission",
}),
];

let apis = ManagedApis::new(apis)
Expand Down
11 changes: 11 additions & 0 deletions dev-tools/ls-apis/api-manifest.toml
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,17 @@ notes = """
wicketd-client is only used by wicket, which is deployed in a unit with wicketd.
"""

[[apis]]
client_package_name = "wicketd-commission-client"
label = "Wicketd Commission"
server_package_name = "wicketd-commission-api"
versioned_how = "server"
notes = """
Stable rack commissioning API (RFD 710), served by wicketd on its own port. The
production consumer is rkdeploy, which lives outside this workspace and is
not currently modeled by ls-apis.
"""

[[apis]]
client_package_name = "crucible-control-client"
label = "Crucible Control (for testing only)"
Expand Down
1 change: 1 addition & 0 deletions dev-tools/ls-apis/tests/api_check.out
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ Server-managed APIs:
Propolis (propolis-client, exposed by propolis-server)
Sled Agent (sled-agent-client, exposed by omicron-sled-agent)
Wicketd (wicketd-client, exposed by wicketd)
Wicketd Commission (wicketd-commission-client, exposed by wicketd)


Client-managed API:
Expand Down
4 changes: 3 additions & 1 deletion dev-tools/ls-apis/tests/api_dependencies.out
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ Bootstrap Agent (client: bootstrap-agent-client)
consumed by: wicketd (omicron/wicketd) via 1 path

Bootstrap Agent Lockstep API (client: bootstrap-agent-lockstep-client)
consumed by: wicketd (omicron/wicketd) via 2 paths
consumed by: wicketd (omicron/wicketd) via 1 path

Clickhouse Cluster Admin for Keepers (client: clickhouse-admin-keeper-client)
consumed by: omicron-nexus (omicron/nexus) via 3 paths
Expand Down Expand Up @@ -108,3 +108,5 @@ Sled Agent (client: sled-agent-client)

Wicketd (client: wicketd-client)

Wicketd Commission (client: wicketd-commission-client)

1 change: 1 addition & 0 deletions gateway-types/versions/src/initial/component.rs
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ pub struct SpState {
Copy,
PartialEq,
Eq,
Hash,
PartialOrd,
Ord,
Serialize,
Expand Down
2 changes: 2 additions & 0 deletions gateway-types/versions/src/initial/rot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ pub enum RotState {
Copy,
PartialEq,
Eq,
Hash,
PartialOrd,
Ord,
Deserialize,
Expand Down Expand Up @@ -107,6 +108,7 @@ pub struct ImageVersion {
Copy,
PartialEq,
Eq,
Hash,
PartialOrd,
Ord,
Deserialize,
Expand Down
Loading
Loading