Skip to content
Merged
Show file tree
Hide file tree
Changes from 29 commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
1bd54d4
ipv6 all the things
rcgoodfellow Dec 11, 2025
409e7b4
pull in bgp work
rcgoodfellow Jan 17, 2026
a4fb72c
bgp unnumbered plumbing
rcgoodfellow Jan 18, 2026
78c2f6a
bump maghemite
rcgoodfellow Jan 19, 2026
27b97ae
bump dendrite
rcgoodfellow Jan 19, 2026
390c231
bump softnpu
rcgoodfellow Jan 19, 2026
5a1a1a4
more bumps
rcgoodfellow Jan 19, 2026
7e04eff
comment out v6 unicast for the moment .....
rcgoodfellow Jan 20, 2026
25a161d
first swing at bootstrap agent lockstep api
rcgoodfellow Jan 20, 2026
34955d2
various fixes
rcgoodfellow Jan 20, 2026
8f19176
remove rack-init APIs from client-side versioned bootstrap agent api
rcgoodfellow Jan 21, 2026
745d1b7
bring rack network config into current versioning scheme
rcgoodfellow Jan 21, 2026
4d42838
the great type migration continues
rcgoodfellow Jan 21, 2026
6225e55
remove long dead compat types
rcgoodfellow Jan 22, 2026
62b248c
the final type shuffle?
rcgoodfellow Jan 22, 2026
c6bbb34
turn an ipv4addr into an ipaddr
rcgoodfellow Jan 22, 2026
44d7f58
update bootstore early networking serialization tests
rcgoodfellow Jan 26, 2026
83dd4f0
feed clippy
rcgoodfellow Jan 27, 2026
579524b
bump maghemite
internet-diglett Jan 29, 2026
7e66df8
Merge branch 'main' into ry/ipv6-all-the-things
internet-diglett Jan 29, 2026
07ae84b
fixup! Merge branch 'main' into ry/ipv6-all-the-things
internet-diglett Jan 29, 2026
2699f9b
bump mgd, fix openapi specs (broke them while merging main)
internet-diglett Jan 30, 2026
51bf1c3
fixup! bump mgd, fix openapi specs (broke them while merging main)
internet-diglett Jan 30, 2026
ee35acf
Merge branch 'main' into ry/ipv6-all-the-things
internet-diglett Jan 30, 2026
d9688c2
generate openapi
internet-diglett Jan 30, 2026
12bcf0d
oops I did it again
internet-diglett Jan 30, 2026
85ac5c7
bump mgd
internet-diglett Feb 2, 2026
6d8380d
Merge branch 'main' into ry/ipv6-all-the-things
internet-diglett Feb 2, 2026
281c3f4
fix api versioning
internet-diglett Feb 2, 2026
414b1f5
sync v6 v2p mappings
rcgoodfellow Feb 4, 2026
18caec5
ipv6 e2e integration tweaks (1/?): remove type/impl duplication (#9786)
jgallagher Feb 4, 2026
ee0435d
ipv6 e2e integration tweaks (2/?): avoid duplicated types in bootstra…
jgallagher Feb 4, 2026
b2b3477
ipv6 e2e integration tweaks (3/3): add `rack_init::impl` module (#9788)
jgallagher Feb 4, 2026
c27c91d
align UnnumberedBgpPeerConfig.interface name with switch zone interfa…
internet-diglett Feb 4, 2026
142e73a
WIP: enable link-local uplinks, enable v6 on v4-only fields
internet-diglett Feb 4, 2026
c2b5baf
plumb through ipv6 / unnumbered types
internet-diglett Feb 5, 2026
75cadb9
bump maghemite/dendrite
rcgoodfellow Feb 5, 2026
d4fa712
Merge remote-tracking branch 'origin/main' into ry/ipv6-all-the-things
jgallagher Feb 5, 2026
a1f38e6
add ipv6 link-local logic to uplink preflight check
internet-diglett Feb 5, 2026
a6e7902
fix openapi check failure
jgallagher Feb 5, 2026
fc626a9
allow ipv6 infra ips in wicket
internet-diglett Feb 6, 2026
7644966
ipv6 e2e tweaks from PR review (#9807)
jgallagher Feb 6, 2026
f32811c
allow unnumbered peers in wicket
internet-diglett Feb 6, 2026
00f17a0
fix ordering of new id column to be consistent with migrations
jgallagher Feb 6, 2026
7944c59
regnerate wicketd openapi
jgallagher Feb 6, 2026
bfdd3c6
ipv6 e2e tweak: use existing constants instead of integer literals fo…
jgallagher Feb 6, 2026
ca9360a
Merge branch 'main' into ry/ipv6-all-the-things
jgallagher Feb 6, 2026
e0e7fc8
pull in dendrite#216
internet-diglett Feb 6, 2026
20df046
WIP: add max_paths to BGP configuration
internet-diglett Feb 7, 2026
c47d065
fix unnumbered ifx names, no lot reserve for ll, bump dendrite/magehmite
rcgoodfellow Feb 7, 2026
2397044
bump maghemite
rcgoodfellow Feb 7, 2026
e387c9a
fix openapi error
internet-diglett Feb 7, 2026
e172b46
bump maghemite
rcgoodfellow Feb 7, 2026
53409b2
Merge branch 'main' into ry/ipv6-all-the-things
internet-diglett Feb 7, 2026
d0d2348
refresh openapi
internet-diglett Feb 7, 2026
b211fc9
don't perform range check for unspecified addresses
internet-diglett Feb 7, 2026
01e9a05
dont sync unspec addrs to asic, dont reconcile link locals
rcgoodfellow Feb 8, 2026
7e964c7
plumb router lifetime parameter
rcgoodfellow Feb 8, 2026
7734c1d
bump maghemite
rcgoodfellow Feb 8, 2026
8602165
fix bgp parameter plumbing
rcgoodfellow Feb 8, 2026
a1540d4
maghemite -> main, unnumbered communities, unnumbered status
rcgoodfellow Feb 9, 2026
8553288
add peer id to bgp peer status
rcgoodfellow Feb 9, 2026
2a5ffb0
clippy
rcgoodfellow Feb 9, 2026
db61b45
update bgp imported / exported to support ipv6
internet-diglett Feb 10, 2026
a43414c
max_paths should be greater than zero
internet-diglett Feb 10, 2026
2f71173
use RouterLifetimeConfig in more places instead of u16
internet-diglett Feb 10, 2026
fb531a9
don't filter ipv6 from mgadm bgp imported / exported requests
internet-diglett Feb 10, 2026
1bbcfbb
ipv6 e2e integration tweaks: stricter bounds validation (#9844)
jgallagher Feb 10, 2026
165d363
bump maghemite
internet-diglett Feb 10, 2026
c39d68b
provide switch location with exported prefixes
internet-diglett Feb 10, 2026
d97bf9a
Merge remote-tracking branch 'origin/main' into ry/ipv6-all-the-things
jgallagher Feb 11, 2026
cbd3a63
bump maghemite, review feedback
rcgoodfellow Feb 11, 2026
93248d3
fix openapi
internet-diglett Feb 11, 2026
f689bb6
pull in maghemite 639
rcgoodfellow Feb 12, 2026
4d35436
support v6 infra ip addresses for bootstore sync
internet-diglett Feb 13, 2026
acd95fb
render IpAddr::UNSPECIFIED as 'link-local'
internet-diglett Feb 13, 2026
8a54196
allow v6 static routing in early networking
internet-diglett Feb 13, 2026
72e1f85
check for unspecified addr in Option<IpX> fields
internet-diglett Feb 13, 2026
d50f4d4
Merge branch 'main' into ry/ipv6-all-the-things
internet-diglett Feb 14, 2026
9913c6a
regenerate openapi
internet-diglett Feb 14, 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
45 changes: 41 additions & 4 deletions Cargo.lock

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

12 changes: 9 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ members = [
"clickhouse-admin/test-utils",
"clickhouse-admin/types/versions",
"clients/bootstrap-agent-client",
"clients/bootstrap-agent-lockstep-client",
"clients/clickhouse-admin-keeper-client",
"clients/clickhouse-admin-server-client",
"clients/clickhouse-admin-single-client",
Expand Down Expand Up @@ -134,6 +135,7 @@ members = [
"sled-agent",
"sled-agent/api",
"sled-agent/bootstrap-agent-api",
"sled-agent/bootstrap-agent-lockstep-api",
"sled-agent/config-reconciler",
"sled-agent/health-monitor",
"sled-agent/measurements",
Expand Down Expand Up @@ -179,6 +181,7 @@ default-members = [
"clickhouse-admin/types/versions",
"clickhouse-admin/test-utils",
"clients/bootstrap-agent-client",
"clients/bootstrap-agent-lockstep-client",
"clients/clickhouse-admin-keeper-client",
"clients/clickhouse-admin-server-client",
"clients/clickhouse-admin-single-client",
Expand Down Expand Up @@ -307,6 +310,7 @@ default-members = [
"sled-agent",
"sled-agent/api",
"sled-agent/bootstrap-agent-api",
"sled-agent/bootstrap-agent-lockstep-api",
"sled-agent/config-reconciler",
"sled-agent/health-monitor",
"sled-agent/measurements",
Expand Down Expand Up @@ -405,7 +409,9 @@ bcs = "0.1.6"
bincode = "1.3.3"
bootstore = { path = "bootstore" }
bootstrap-agent-api = { path = "sled-agent/bootstrap-agent-api" }
bootstrap-agent-lockstep-api = { path = "sled-agent/bootstrap-agent-lockstep-api" }
bootstrap-agent-client = { path = "clients/bootstrap-agent-client" }
bootstrap-agent-lockstep-client = { path = "clients/bootstrap-agent-lockstep-client" }
buf-list = { version = "1.0.3", features = ["tokio1"] }
byteorder = "1.5.0"
bytes = "1.10.1"
Expand Down Expand Up @@ -569,8 +575,8 @@ ntp-admin-api = { path = "ntp-admin/api" }
ntp-admin-client = { path = "clients/ntp-admin-client" }
ntp-admin-types = { path = "ntp-admin/types" }
ntp-admin-types-versions = { path = "ntp-admin/types/versions" }
mg-admin-client = { git = "https://github.com/oxidecomputer/maghemite", rev = "3abfb8eb7f6d4ca4658981b4a7a76759a0a3f8ec" }
ddm-admin-client = { git = "https://github.com/oxidecomputer/maghemite", rev = "3abfb8eb7f6d4ca4658981b4a7a76759a0a3f8ec" }
mg-admin-client = { git = "https://github.com/oxidecomputer/maghemite", rev = "bbac08797b9ebbae5781f6d29756aa7882ae76bd" }
ddm-admin-client = { git = "https://github.com/oxidecomputer/maghemite", rev = "bbac08797b9ebbae5781f6d29756aa7882ae76bd" }
multimap = "0.10.1"
nexus-auth = { path = "nexus/auth" }
nexus-background-task-interface = { path = "nexus/background-task-interface" }
Expand Down Expand Up @@ -700,7 +706,7 @@ rats-corim = { git = "https://github.com/oxidecomputer/rats-corim.git", rev = "f
raw-cpuid = { git = "https://github.com/oxidecomputer/rust-cpuid.git", rev = "a4cf01df76f35430ff5d39dc2fe470bcb953503b" }
rayon = "1.10"
rcgen = "0.12.1"
rdb-types = { git = "https://github.com/oxidecomputer/maghemite", rev = "3abfb8eb7f6d4ca4658981b4a7a76759a0a3f8ec" }
rdb-types = { git = "https://github.com/oxidecomputer/maghemite", rev = "bbac08797b9ebbae5781f6d29756aa7882ae76bd" }
reconfigurator-cli = { path = "dev-tools/reconfigurator-cli" }
reedline = "0.40.0"
ref-cast = "1.0"
Expand Down
2 changes: 1 addition & 1 deletion clients/bootstrap-agent-client/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
//! Interface for making API requests to a Bootstrap Agent

progenitor::generate_api!(
spec = "../../openapi/bootstrap-agent/bootstrap-agent-1.0.0-127591.json",
spec = "../../openapi/bootstrap-agent/bootstrap-agent-2.0.0-632b71.json",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this right? I was under the impression we needed to stay on bootstrap-agent 1.0.0 this release so that we could upgrade through this change from R17.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please double-check, but we think this is okay:

  • The only API changes here are to remove calls that now live in bootstrap-agent-lockstep, because those calls were only ever made by lockstep clients (during RSS).
  • The type changes made to types that are kept in the bootstore (slightly different than the bootstrap API, although there's overlap), under common/src/api/internal/shared/*/v2.rs, only made wire-compatible changes, allowing us to still deserialize the old bootstore. The kinds of changes made are:
    • adding new fields tagged with #[serde(default)] (e.g., BgpPeerConfig::router_lifetime) - still deserializes thanks to the default tag
    • making required fields optional (e.g., UplinkAddressConfig::address) - still deserializes and will show up as Some(_)
    • changing IP types that were ipv4-only to be generic IP (e.g., RackNetworkConfig::infra_ip_{first,last}) - still deserializes because we can parse an IPv4 string as a generic IpAddr

This is obviously all very manual and error prone, hence filing #9801, which we basically must do before any more changes need to happen to these types.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What I thought the issue was is that older bootstrap agent server will 404 any responses from clients that are generated from the 2.0.0 spec, because the server isn't aware of that version yet.

But if that's okay, then that all seems fine.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

... I completely forgot about this. I think we only tested bootstore compatibility via mupdate, which wouldn't run into problems here. 🤦

That said, I think we're okay, but please double check this too! The only endpoints left in the bootstrap API are baseboard_get() and components_get(). I don't think there are any callers of components_get(). There's one caller of baseboard_get(): other sled-agent instances to service a "sled add". This would fail mid-online-update, but it's probably okay to note that adding a sled during an update from R17 to R18 needs to wait until after all the OS updates are done?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that makes sense, but I will admit to not having double-checked it. I suppose if there is a show-stopper we will catch it in upgrade testing (we should definitely make sure we perform online upgrade of a racklette from 17.1 to 18).

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified online-update from 17.2 to 18 on a racklet and it worked just fine for me.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correction: Upgrade to this commit turned out to cause bgp config to be lost (which manifests itself during a cold boot or in the next update). The fix is in #9863.

interface = Positional,
inner_type = slog::Logger,
pre_hook = (|log: &slog::Logger, request: &reqwest::Request| {
Expand Down
22 changes: 22 additions & 0 deletions clients/bootstrap-agent-lockstep-client/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
[package]
name = "bootstrap-agent-lockstep-client"
version = "0.1.0"
edition.workspace = true
license = "MPL-2.0"

[lints]
workspace = true

[dependencies]
omicron-common.workspace = true
omicron-uuid-kinds.workspace = true
omicron-workspace-hack.workspace = true
oxnet.workspace = true
progenitor.workspace = true
regress.workspace = true
reqwest.workspace = true
schemars.workspace = true
serde.workspace = true
serde_json.workspace = true
sled-hardware-types.workspace = true
slog.workspace = true
72 changes: 72 additions & 0 deletions clients/bootstrap-agent-lockstep-client/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
// 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 API requests to the Bootstrap Agent Lockstep API

progenitor::generate_api!(
spec = "../../openapi/bootstrap-agent-lockstep.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 = {
"omicron-uuid-kinds" = "*",
"oxnet" = "0.1.0",
},
replace = {
AllowedSourceIps = omicron_common::api::external::AllowedSourceIps,
ImportExportPolicy = omicron_common::api::external::ImportExportPolicy,
},
);

impl omicron_common::api::external::ClientError for types::Error {
fn message(&self) -> String {
self.message.clone()
}
}

impl From<types::Baseboard> for sled_hardware_types::Baseboard {
fn from(value: types::Baseboard) -> Self {
match value {
types::Baseboard::Gimlet { identifier, model, revision } => {
sled_hardware_types::Baseboard::new_gimlet(
identifier, model, revision,
)
}
types::Baseboard::Unknown => {
sled_hardware_types::Baseboard::unknown()
}
types::Baseboard::Pc { identifier, model } => {
sled_hardware_types::Baseboard::new_pc(identifier, model)
}
}
}
}

impl From<sled_hardware_types::Baseboard> for types::Baseboard {
fn from(value: sled_hardware_types::Baseboard) -> Self {
match value {
sled_hardware_types::Baseboard::Gimlet {
identifier,
model,
revision,
} => types::Baseboard::Gimlet { identifier, model, revision },
sled_hardware_types::Baseboard::Unknown => {
types::Baseboard::Unknown
}
sled_hardware_types::Baseboard::Pc { identifier, model } => {
types::Baseboard::Pc { identifier, model }
}
}
}
}
2 changes: 1 addition & 1 deletion clients/sled-agent-client/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ progenitor::generate_api!(
LldpPortConfig = { derives = [Eq, Hash, PartialOrd, Ord] },
TxEqConfig = { derives = [Eq, Hash] },
OmicronPhysicalDiskConfig = { derives = [Eq, Hash, PartialOrd, Ord] },
PortConfigV2 = { derives = [Eq, Hash] },
PortConfig = { derives = [Eq, Hash] },
RouteConfig = { derives = [Eq, Hash] },
UplinkAddressConfig = { derives = [Eq, Hash] },
VirtualNetworkInterfaceHost = { derives = [Eq, Hash] },
Expand Down
6 changes: 4 additions & 2 deletions common/src/api/external/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3251,8 +3251,10 @@ pub struct BgpPeer {
/// could be vlan47 to refer to a VLAN interface.
pub interface_name: Name,

/// The address of the host to peer with.
pub addr: IpAddr,
/// The address of the host to peer with. If not provided, this is an
/// unnumbered BGP session that will be established over the interface
/// specified by `interface_name`.
pub addr: Option<IpAddr>,

/// How long to hold peer connections between keepalives (seconds).
pub hold_time: u32,
Expand Down
1 change: 1 addition & 0 deletions common/src/api/internal/shared/external_ip/v1.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// 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/.

Expand Down
Loading