Skip to content

Commit 0abdd33

Browse files
Add contact_support on update status page (#3226)
New boolean `contact_support` field on update status added in oxidecomputer/omicron#10271. I tried it inside the properties table as `Contact support: Yes` and it felt terrible. <details> <summary> Robot notes on the API logic behind <code>contact_support</code> </summary> [omicron#10271](oxidecomputer/omicron#10271) adds a `contact_support: bool` field to the `system/update/status` API. It is the last piece of a minimal system health check tied to update status, intended as a stopgap until the fault management subsystem lands ([RFD 612](https://rfd.shared.oxide.computer/rfd/0612)). ## What it means When `contact_support` is `true`, Nexus has detected one or more known conditions in the latest inventory collection (plus a few additional checks) that require Oxide support to resolve. The field collapses several sub-checks into a single boolean because none of the individual conditions are actionable by the customer — the only action is to call support. The detailed breakdown is logged server-side and lands in support bundles. The intended usage maps to two cases: - **Before an update**: if `contact_support` is true, the customer should not start an update — resolve the issue with support first. - **After an update**: if `contact_support` is true, something went wrong; the customer should call support immediately. ## Conditions that trigger `contact_support: true` - **Unhealthy zpools** — any zpool not in `online` state (e.g., degraded). - **Enabled SMF services not online** — services that should be running but are in `maintenance`, `offline`, or `degraded`. - **Stuck sagas** — sagas that have been running longer than ~15 minutes. (A sample of 10,000 done sagas on dogfood showed only 3 exceeded 15 minutes from creation to completion.) - **Stale inventory collection** — no recent inventory collection (~15 min threshold), meaning Nexus has lost visibility into rack state. - **Stalled update** — an update is supposed to be in progress but the planner hasn't taken a step in ~30 minutes. The list is explicitly minimal and not exhaustive — `contact_support: false` does not guarantee the system is fully healthy. ## Suppression during an active update Health checks often fail transiently during an update, so the API suppresses `contact_support: true` while an update is genuinely in progress. The field only surfaces a true value when either (1) there is no update in progress, or (2) an in-progress update has stalled past the threshold (matching the [10–15 minute guidance](https://github.com/oxidecomputer/omicron/blob/main/docs/reconfigurator-ops-guide.adoc#debug-stuck)) in the Reconfigurator Ops Guide for when support considers an update stuck). In practice this means the field always presents in one of two contexts: the system is idle (pre-update or post-update), or the update has stalled long enough that the result is no longer a transient artifact. </details> ## Issues to resolve - Explain the situation without overdoing it - Tooltip looks terrible in message box, what if we link to docs instead - Should probably link to a way to actually contact support, probably the support email that goes to Zendesk <img width="808" height="381" alt="image" src="https://github.com/user-attachments/assets/bd8a75ed-7550-440f-81a3-6fc5319b79fb" /> --------- Co-authored-by: benjaminleonard <benji@oxide.computer>
1 parent aea6923 commit 0abdd33

3 files changed

Lines changed: 36 additions & 3 deletions

File tree

app/pages/system/UpdatePage.tsx

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88

99
import { differenceInMinutes } from 'date-fns'
1010
import { useMemo } from 'react'
11+
import { Link } from 'react-router'
1112
import * as R from 'remeda'
1213
import { lt as semverLt } from 'semver'
1314

1415
import {
1516
Images24Icon,
17+
OpenLink12Icon,
1618
SoftwareUpdate16Icon,
1719
SoftwareUpdate24Icon,
1820
} from '@oxide/design-system/icons/react'
@@ -38,6 +40,7 @@ import { CardBlock } from '~/ui/lib/CardBlock'
3840
import { DateTime } from '~/ui/lib/DateTime'
3941
import { Divider } from '~/ui/lib/Divider'
4042
import * as DropdownMenu from '~/ui/lib/DropdownMenu'
43+
import { Message } from '~/ui/lib/Message'
4144
import { PageHeader, PageTitle } from '~/ui/lib/PageHeader'
4245
import { PropertiesTable } from '~/ui/lib/PropertiesTable'
4346
import { TipIcon } from '~/ui/lib/TipIcon'
@@ -105,6 +108,21 @@ function calcProgress(status: UpdateStatus) {
105108
}
106109
}
107110

111+
// wrapper div keeps the link out of the Message content's [&>a]:tint-underline
112+
const ContactSupportCta = () => (
113+
<div>
114+
<Link
115+
className="text-mono-xs text-accent group mt-3 inline-flex items-center gap-1.5"
116+
to="https://support.oxide.computer"
117+
target="_blank"
118+
rel="noreferrer"
119+
>
120+
Contact Support
121+
<OpenLink12Icon />
122+
</Link>
123+
</div>
124+
)
125+
108126
export default function UpdatePage() {
109127
const { data: status } = usePrefetchedQuery(statusQuery)
110128
const { data: repos } = usePrefetchedQuery(reposQuery)
@@ -193,6 +211,21 @@ export default function UpdatePage() {
193211
</PropertiesTable.Row>
194212
</PropertiesTable>
195213

214+
{status.contactSupport && (
215+
<Message
216+
className="mt-4"
217+
variant="notice"
218+
title="Support required"
219+
content={
220+
<>
221+
The system has detected one or more known conditions that require Oxide
222+
support to resolve.
223+
<ContactSupportCta />
224+
</>
225+
}
226+
/>
227+
)}
228+
196229
<Divider className="my-8" />
197230

198231
<CardBlock>

app/ui/lib/Message.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@ export const Message = ({
6868
</div>
6969
)}
7070
<div className="flex-1">
71-
{title && <div className="text-sans-semi-md">{title}</div>}
71+
{title && <div className="text-sans-semi-md mb-1">{title}</div>}
7272
{/* group gives HL the right color */}
73-
<div className="text-sans-md text-accent-secondary [&>a]:tint-underline group">
73+
<div className="text-sans-md text-accent-secondary [&>a]:tint-underline group max-w-3xl">
7474
{content}
7575
</div>
7676

mock-api/system-update.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export const updateStatus: Json<UpdateStatus> = {
3636
'17.0.0': 12,
3737
'16.0.0': 5,
3838
},
39-
contact_support: false,
39+
contact_support: true,
4040
suspended: false,
4141
target_release: {
4242
version: '17.0.0',

0 commit comments

Comments
 (0)