Skip to content

Initial sush integration - #11034

Open
plotnick wants to merge 10 commits into
mainfrom
sush-integration
Open

Initial sush integration#11034
plotnick wants to merge 10 commits into
mainfrom
sush-integration

Conversation

@plotnick

@plotnick plotnick commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

This embeds the Oxide Support Shell (sush, RFD 620) in sled-agent and adds its switch zone proxy. It pairs with sush#31. Opened as early draft so CI builds TUF repos for racklette testing, and must stay as draft until the pin moves from a branch to a rev and we have a production cert. Nexus integration is forthcoming, and not addressed at all by this PR.

The proxy TLS key handling could use a review from a security person, please. Basic idea is that we mint a fresh key at switch zone startup and have the RoT sign a certificate for it. The client then verifies that the leaf chains to the production or staging platform identity roots.

🤖 Disclaimer: written with LLM assistance.

plotnick and others added 4 commits August 7, 2026 04:31
The Support Shell server in the global zone serves its API here. See RFD 620.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Callers had only a snapshot of the currently available datasets, so noticing
that one appeared meant polling. The debug datasets are encrypted and do not
mount until the keys are available, which makes waiting for one a useful
signal.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Run the Support Shell server in the global zone as a set of Tokio tasks, so
that Oxide support can run authorized jobs on a sled when the control plane is
down. The job manager starts during bootstrap, as soon as we know our
baseboard; the HTTP API starts later, once this sled has been told its underlay
address.

Job output is recorded on the ramdisk at first, with a small size limit, and
moves to an encrypted U.2 debug dataset with a larger limit once one is
mounted. Such a dataset cannot mount before trust quorum is established, so
waiting for one avoids having to know anything about trust quorum.

Jobs and sessions gossip between sleds over sprockets on the bootstrap
network, using the sled's own sprockets identity and reference measurements.
Peer addresses come from the same DDM poller that feeds the bootstore and
trust quorum. A sled whose gossip listener cannot start still serves local
jobs.

sush does not run unless it is configured, and the new [sush] section is absent
from every shipped config. Session state is not yet persisted, so a restart
forgets the current session.

sush declares sled-hardware-types as a git dependency on this repo, so without
the patch directive the graph holds two copies of the crate and its BaseboardId
is a different type from the one sled-agent derives.

We ask for sush's embedded feature, which refuses to compile if anything in the
build also turns on its test-support feature.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Give every shipped config a [sush] section trusting the Support Shell
sandbox root, so development racks can run signed jobs end to end.
Job execution requires a permission-slip signature chaining to this
root, so possession of the certificate alone grants nothing. The
sandbox key is "UNTRUSTED Support Shell Prototype", held by the
permslip development instance:

  permslip --url=https://permslip.inickles.0xeng.dev \
      get-cert "UNTRUSTED Support Shell Prototype"

This must not reach a customer rack: a trusted root cannot be
revoked, only replaced by an OS update. TODO: replace with the
production root before release.
/// Returns the sled addresses behind advertised underlay prefixes.
/// These are candidates that callers must probe: not every underlay
/// prefix is a sled subnet (RFD 63).
pub async fn derive_sled_addrs_from_prefixes(

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

If someone from the networking team could please check the prefix math here, that would be great.

@plotnick
plotnick force-pushed the sush-integration branch 2 times, most recently from e7ebe73 to f7ec06c Compare August 10, 2026 06:46
A proxy-only sush service in each switch zone (RFD 620). Sleds are
discovered by probing the addresses behind the bootstrap and underlay
prefixes DDM advertises, and the cubby numbering comes from MGS.
Sleds answer on their bootstrap addresses from startup, so the proxy
reaches them before RSS runs. The proxy serves TLS with the sled's
platform identity: at zone startup, sled-agent mints an ephemeral
key, has the RoT sign its certificate once over IPCC, and writes the
key and chain into the zone for the proxy to serve with. A failed
mint fails the proxy's SMF service alone, not the switch zone.

Note for review: someone from the networking team should check the
prefix math in derive_sled_addrs_from_prefixes, which assumes every
/64 that is not a bootstrap prefix is a sled subnet.
Cubby-targeted jobs need the cubby map on the sled that decides
whether to run them, not just at the proxy. Each sled-agent polls
MGS for the map and feeds it to the embedded sush server through a
watch channel: candidate switch zone addresses are derived from the
underlay subnets DDM advertises, and whatever answers is an MGS.
Per RFD 63 the derived subnets are candidates only (sleds also
advertise internal DNS subnets, and a services prefix is reserved),
so callers must probe, as both this loop and the sush proxy's sled
discovery do.
sprockets now gates IPCC behind a default-on cargo feature. Take the
workspace dependency off the default, and give sled-agent the feature
explicitly: it parses the ipcc config variants and mints the sush
proxy identity. Advance the sush pin, which opts out so the support
shell client no longer links libipcc.
@plotnick
plotnick marked this pull request as ready for review August 12, 2026 14:15
Pins by rev now that the branch is about to merge. Picks up the
codephrase wire format, the client overhaul, and warm gossip
connections. Old clients cannot authenticate across this change.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant