Skip to content

List and download Support Bundles - #3311

Open
charliepark wants to merge 7 commits into
mainfrom
support-bundles
Open

List and download Support Bundles#3311
charliepark wants to merge 7 commits into
mainfrom
support-bundles

Conversation

@charliepark

@charlieparkcharliepark commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

This PR creates a basic view at the System level for Support Bundles viewing and downloading, and creating new support bundles.
Screenshot 2026-08-06 at 4 37 33 PM

Support Bundles are listed newest-first. ACTIVE support bundles can be downloaded; download button is disabled for FAILED / COLLECTING / DESTROYING states.

This is a somewhat blunt page at the moment; talking with Sean, there are some enhancements we'll be able to do in the not-distant future, like filtering based on a time window or otherwise reducing the size of the bundle payload being downloaded. I did explore a file viewer partway through the building of this PR, but talking through it with Oliver, he suggested that the scope of files the user would have to manually go through in the client would be difficult, and the UX would be rough.

NOTE: Ben is working on a new icon for this.

@vercel

vercelBot commented Aug 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
consoleReadyReadyPreviewAug 7, 2026 12:00am

Request Review

@hawkw

hawkw commented Aug 6, 2026

Copy link
Copy Markdown
Member

This looks nice!

Though one note is that some of the UI looks weird on mobile if the screen is too narrow to contain it:

image

This may be a more widespread problem than just this page, though, given that we don't collapse the sidebar?

@charliepark

Copy link
Copy Markdown
ContributorAuthor

Yes, thanks for calling that out! Responsive issues are definitely a larger thing, though I think fault management scenarios highlight the issue where someone might be viewing the client on a non-standard screen / in a state of crisis, so we want to tighten that all up!

@fakemonsterfakemonster left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

code looks good. my only qualms:

  1. the icon, as you noted
  2. the double copy-id thing. fine to go in of course but has me wondering if we should try to migrate all the tables at once to keep the id-copying method predictable
  3. do we want some sort of indicator for pages that rely on the experimental API?

color={SUPPORT_BUNDLE_COLORS[props.state]}
className={cn(props.className, badgeClasses)}
>
{(props.state === 'collecting' || props.state === 'destroying') && (

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

really minor given the context, but i always like to use a match for this kind of thing, so the compiler can require our input if we add e.g. a rebuilding state in the future

// the generated handler type only allows status code returns for binary
// endpoints, but the dispatcher passes Response instances through untouched
// @ts-expect-error
supportBundleDownload({ path, cookies }) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

when i attempted a bundle download with the msw, i got thrown off by there being an implementation for bundle download when it isn't actually reachable (since we're navigating to the download link instead of fetching it). maybe somewhere it's worth a comment noting this only does something if you implement downloading as a fetch?

const bundle = lookupById(db.supportBundles, path.bundleId)
// https://github.com/oxidecomputer/omicron/blob/99249b4/nexus/db-queries/src/db/datastore/support_bundle.rs#L736-L742
// byte length, not string length, to match Nexus
if (body.user_comment && new TextEncoder().encode(body.user_comment).length > 4096) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

i'm not sure if it's against convention to pull constants from the api utils, but it wouldn't hurt to share this one

colHelper.accessor('id', {
header: 'ID',
cell: (info) => (
<Truncate text={info.getValue()} maxLength={14} position="middle" hasCopyButton />

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

feels redundant to be able to copy the ID here and in the quick actions

@charliepark

Copy link
Copy Markdown
ContributorAuthor

Great point on /experimental. Would feel more comfortable with pulling it to /v1 before rolling this out, though I'm not sure about the other reasons for keeping it in /experimental

Sign up for freeto 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.

3 participants

@charliepark@hawkw@fakemonster