PR 1178 review

harvester-ui-extension PR 1178 (abonillabeeche) at head 6e7d5b39, reviewed 2026-10-27. It lists Rancher's auth-user-session-ttl-minutes / auth-user-session-idle-ttl-minutes under Settings → UI on standalone Harvester (flag v1.10.0, with validation), and adds a Disconnected indicator when the harvester websocket is down for more than 10s.

Verdict: works as described; comment with one should-fix

Test it yourself

The preview is PR head 6e7d5b39 with one test-only change (sessionTimeoutSettings moved to v1.3.0 so it turns on for v1.9). Backend: Harvester .118 through the mf tunnel, so it needs the SUSE VPN tunnels from the Mac. Log in as admin (HARVESTER_PASSWORD).

  1. Open Settings → UI and try 0 or a value above the other setting. Don't save a valid value: it changes login sessions on the shared cluster.
  2. Indicator: on the VM list, run in DevTools s = document.querySelector('#app').__vue_app__.config.globalProperties.$store.state.harvester.socket; u = s.url; s.setUrl('wss://127.0.0.1:9/x'); s.socket.close(), wait ~10s, then s.setUrl(u).
Settings walkthrough
UI tab, edit routing, validation, and the TTL-form hint (finding 3). All writes blocked.
Findings
1

The new descriptions replace Rancher's own text for these two settings

Should fix

What it's about

The PR adds advancedSettings.descriptions.auth-user-session-ttl-minutes and …idle-ttl-minutes. These are the keys Rancher already uses for its own two settings, which are core Rancher settings (rancher/rancher pkg/settings/setting.go, used by every UI login), not Harvester ones. Extension translations are merged over the shell's for the whole UI.

What I found

With the PR build loaded into a Rancher 2.16 session, Rancher's main Global Settings list shows the Harvester text, with the <code> tags printed literally: Rancher renders the description as plain text. A real install merges the same way at startup. Nobody sees it today; it ships with the release that contains this PR. Standalone Harvester renders it fine.
Rancher 2.16 (mf): before, then the PR build loaded into the session only, same card after.
Rancher Global Settings with the PR loaded
Rancher Global Settings with the PR loaded
Standalone Harvester (where the text is meant to show)
Standalone Harvester (where the text is meant to show)

Fix

Harvester-only keys (e.g. a description key on the two HCI_SINGLE_CLUSTER_ALLOWED_SETTING entries, preferred by SettingList and the edit form), or drop the strings and let the shell's descriptions show.
2

Reload never appears on a default Harvester

Suggestion

What it's about

The "gave up" state (Reload + the gaveUp text) needs Steve's disconnect_error, which fires only when the socket has a maxTries. subscribe sets it to null when websocket notifications are off, which is the default (and the reason for this PR). Same in shell 3.0.14.

What I found

Default config (first clip): the socket keeps retrying (17+ attempts in the clip), Reload never shows, and the pill clears on the next retry once the network is back. Notifications on (second clip, emulated in the browser): Rancher growls "Websocket Reconnecting", then after 4 attempts (~9s) "Websocket Disconnected … reload the page", and the pill shows Reload at the same moment. After the network returns the socket stays disconnected, so Reload is real there, but it repeats the shell's message.
Default ui-performance: normal reconnect, outage, 40s more down with no Reload, recovery.
Websocket notifications on (emulated): Reload + Rancher's growls, socket never resumes.
Default: tooltip, no Reload (Prime cluster, token = SUSE Virtualization)
Default: tooltip, no Reload (Prime cluster, token = SUSE Virtualization)
Notifications on: Reload + Rancher's own growl
Notifications on: Reload + Rancher's own growl

Fix

Drop the gave-up branch (and fix the PR description), or keep it and say it only applies with notifications on.
3

The idle > TTL hint is backwards on the TTL form

Nit

What it's about

One message serves both settings.

What I found

Editing auth-user-session-ttl-minutes to 480 says "Increase auth-user-session-ttl-minutes first", the field being edited. The settings clip ends on it.

Fix

One hint per setting, or neutral wording ("keep the idle timeout at or below the session timeout").
4
Suggestion

What it's about

The repo now runs jest in CI (the PR's unit-tests check is green), but the PR adds no specs.

What I found

validateSessionTTL and the 10s grace timer are small enough to test with fake timers.

Fix

Specs for invalid values, idle > TTL from each form, blip < 10s, outage > 10s, reconnect clears.
5

The indicator isn't behind the flag and also runs in Rancher

Question

What it's about

The settings are gated by sessionTimeoutSettings (v1.10.0) and standalone only. The indicator checks only isVirtualCluster + the harvester product.

What I found

UI-only, so probably fine, but the PR only tested standalone. In Rancher, leaving the Harvester product unsubscribes the store.

Fix

Confirm it's meant for all versions and Rancher, and was tried switching between two Harvester clusters.
Checked
CaseResult
Settings → UI lists both settings with descriptionsYes (settings clip)
Edit opens the Harvester form, not BrandingYes
0 / idle 2000 > TTL 960Both rejected, no request sent
Normal reconnect (server up)No indicator
OutageIndicator after the 10s grace; tooltip on hover and focus; explanation inside the alert
New commit: [[Harvester]] token in the tooltipPrime cluster (.118) reads "SUSE Virtualization"; 1202's pre-2.16 fallback covers the new strings
RecoveryCleared on the next retry
Reload by defaultNever (finding 2)
Reload with websocket notifications on (emulated)Shows after ~9s, next to Rancher's "Websocket Disconnected … reload the page" growl; socket stays down after the network returns
Rancher 2.16 Global SettingsHarvester text with literal tags (finding 1)
Re-checked on shell 3.0.14 (main now)maxTries default, i18n merge, plain-text descriptions: unchanged
CI at 6e7d5b39lint, unit-tests, DCO green; no conflicts
Session expiring dialog (idle = 2)Not re-tested: needs a real write of an auth setting on the shared Harvester; the author's screenshots cover it