Commit Graph

7779 Commits

Author SHA1 Message Date
rcourtman f509b79caa Point integration docs at the update-flow spec
tests/integration/README.md and QUICK_START.md referenced the retired
.github/workflows/test-updates.yml; update-flow coverage now runs as
tests/79-update-flow.spec.ts inside the main suite via test-e2e.yml.
2026-07-08 01:07:20 +01:00
rcourtman 4d6935f4fa Restore update-flow coverage as a v6 Playwright spec, retire test-updates workflow
The Update Integration Tests workflow lost its Go test
(tests/integration/api) in the v6 release commit and was reduced to a
diagnostic smoke test that duplicated the test-e2e stack boot. Replace
it with tests/79-update-flow.spec.ts in the main suite, which runs via
test-e2e.yml on the same trigger paths:

- stable-channel check returns the mock v99.0.0 release and filters
  the v99.1.0-rc.1 prerelease (regression guard for the auto-update
  prerelease bug); rc-channel check surfaces the prerelease
- update plan reports honest manual instructions for the docker
  deployment with readiness attached
- apply refuses prerelease download URLs on the stable channel (409)
- apply of an unsigned artifact fails closed at SSHSIG verification;
  a completed update against the unsigned mock artifact would mean
  the pinned-key trust root was bypassed

The old happy-path apply test is intentionally not revived: v6 made
SSHSIG verification against the pinned pulse-installer key mandatory,
so completing an apply would require shipping the real signing key to
the harness or weakening the trust root.

mock-github-server now serves v-prefixed asset names and download
paths like real Pulse releases (pulse-v99.0.0-linux-amd64.tar.gz);
the in-app updater only recognizes v-prefixed versions in download
URLs, so the old unprefixed shape made every apply fail validation
before reaching the paths under test. Unknown non-tarball sidecar
files (e.g. .sshsig) now 404 instead of falling back to tarball bytes.

The spec self-skips when the update check is not served by the mock
server, so managed-local-backend runs are unaffected.
2026-07-08 01:06:00 +01:00
rcourtman de109b65d8 Lint nested Go modules from their own module root in pre-commit
golangci-lint was invoked from the repo root for every staged Go
package, so files in nested modules like
tests/integration/mock-github-server failed typechecking with 'main
module does not contain package' and could never be committed. Group
staged package dirs by their nearest enclosing go.mod and lint nested
modules from their own root.
2026-07-08 01:04:36 +01:00
rcourtman b052e59d24 Exclude nested node_modules from the Docker build context
.dockerignore only matched the root node_modules, so a locally
installed frontend-modern/node_modules entered the build context and
collided with the npm ci layer during COPY frontend-modern/, failing
local image builds. CI checkouts never hit this because they build
from a clean tree.
2026-07-08 00:57:35 +01:00
rcourtman cbd72d3186 Make physical disk temperature thresholds configurable per disk type
Settings > Alerts > Systems gains a 'Disk temperature by type' editor
(NVMe/SAS/SATA trigger degC) backing the existing per-type alert
thresholds that were previously hardcoded server-side. Saving alert
settings now round-trips diskTempByType and diskFillByType instead of
silently resetting them to defaults.

Disk temperature colors in the physical disks table, pool detail linked
disks, disk detail cards, and the Machines temperature fallback now
resolve from the live alert config per disk type (warning at trigger
minus the 5 degC hysteresis margin) instead of hardcoded 50/60 cutoffs.

Closes #1540
2026-07-07 23:18:15 +01:00
rcourtman b6fd06c63d Let explicit disk temperature overrides beat per-type defaults
DiskTempByType unconditionally replaced the resolved host threshold, so a
host-level (or inherited linked-resource) diskTemperature override never
applied to nvme/sas/sata disks. Explicit overrides now win; the per-type
map still beats the global agent default.

Refs #1540
2026-07-07 23:15:59 +01:00
rcourtman f8e5642ae7 Point update integration smoke test at surviving v6 coverage
The workflow still invoked TestUpdateFlowIntegration from
tests/integration/api, but that package was removed in the v6 release
commit, and the remaining Playwright diagnostic spec skips itself
unless PULSE_E2E_DIAGNOSTIC is set, so the step ran zero tests and
then failed on the missing Go package. Enable the diagnostic spec so
the step actually exercises the pulse:test stack and drop the dead Go
test invocation.
2026-07-07 23:00:09 +01:00
rcourtman 23a930e849 fix(discovery): bring hosts into the fingerprint model so they auto-discover (#1479)
Hosts (PVE nodes and host agents) were entirely outside the discovery
fingerprint model. Two consequences, one root:

1. collectFingerprints only covered docker/lxc/vm/k8s, so a host never
   appeared in GetChangedResources and automatic discovery never ran for
   it. Only the per-resource manual trigger worked, which is exactly the
   v6.0.5-rc.3 behaviour reported in #1479.

2. cleanupOrphanedData built its keep-set from the same four types, so
   CleanupOrphanedDiscoveries swept every agent:* discovery as an orphan
   on the next fingerprint cycle (default 5 minutes). Manually discovered
   hosts silently reverted to undiscovered.

Fix: add GenerateHostFingerprint (identity, OS, kernel, arch, tags;
status excluded so online/offline flapping cannot trigger rediscovery),
fingerprint snap.Hosts under the canonical agent:<id>:<id> key, and keep
host/node discovery keys (canonical, hostname-alias, and legacy host:
prefix forms) out of orphan cleanup. Also purge the store's in-memory
cache when an orphaned discovery file is removed, so deletions are not
masked for the cache TTL.
2026-07-07 22:55:04 +01:00
rcourtman 292baf308b Fix PBS backup discovery regression from bounded polling
The RC3 memory bound for PBS backup polling summarized any group with
more than 8 snapshots into a single synthesized entry built from group
metadata. A synthesized entry has no verification, size, file, or
per-snapshot time data, so most real deployments saw every backup as
Unverified with no size, PBS files not listed, and a backup timeline
collapsed onto the latest backup day.

Keep the issue #1524 memory bounds but derive them from real data:
always fetch snapshots for stale groups, retain the newest bounded set
per group (limit raised from 8 to 100 to cover real keep policies), and
keep the newest-first global live-state cap. Remove the synthesized
group placeholder path entirely and update the monitoring subsystem
contract and tests to pin real-snapshot bounding.

Fixes #1541
Refs #1524
2026-07-07 22:48:34 +01:00
rcourtman 0ad22fe2d5 Mirror the canonical workspace layout in governance CI
The release-control audits resolve repo identity from the checkout
directory name and expect evidence repos as siblings under one repos
root. The hosted runner checked the repo out at Pulse/Pulse, so
canonical_repo_id returned Pulse instead of pulse and the registry
audit treated every local file reference as untracked (2655 errors).
Check out the main repo at repos/pulse and the evidence repos as
repos/pulse-pro, repos/pulse-enterprise, and repos/pulse-mobile, run
all steps from repos/pulse, and point the PULSE_REPO_ROOT_* env vars
at the new paths.
2026-07-07 22:41:38 +01:00
rcourtman 6c181f5f82 Restore pulse:test image build in update integration tests
The dual-key revert (1490a6e6e) removed the docker build line for the
pulse:test image instead of restoring the single-key version, leaving
the step with a bare cd and nothing building the image. Compose then
tried to pull pulse:test from Docker Hub and every run failed before
test execution. Build the runtime target the same way test-e2e.yml
does. The PULSE_LICENSE_PUBLIC_KEY env on the step was dead config:
env vars do not reach docker build and the Dockerfile no longer
declares that ARG.
2026-07-07 22:32:36 +01:00
rcourtman 6f5771d973 Authenticate governance evidence repo checkouts with WORKFLOW_PAT
The Canonical Governance workflow checked out the private pulse-pro,
pulse-enterprise, and pulse-mobile evidence repos with the default
workflow token, which cannot see other private repos, so every run
failed at the pulse-pro checkout. Use the existing WORKFLOW_PAT
secret (already used by create-release.yml to dispatch private Pro
workflows) and avoid persisting the credential in the checkout.
2026-07-07 22:32:25 +01:00
rcourtman c6fdd9058c Allow clearing SSO provider restriction fields from Settings
Empty allowedGroups, allowedDomains, allowedEmails, groupsClaim and
groupRoleMappings in a provider PUT were silently restored from the
existing config, so an admin could never clear them. The guards
shielded against lossy round-trips that no longer exist: the detail
GET and the flat list response both carry these fields, so an empty
value is an intentional clear. Nested OIDC/SAML config and the client
secret stay preserved since toggle payloads omit them and secrets are
never echoed in reads.

Also expose groupsClaim and groupRoleMappings in the shared extensions
list response so the enterprise list matches the core one, and make
the Settings enable/disable toggle send only writable fields; the old
list-item spread included computed response fields that the enterprise
strict PUT decoder rejects.
2026-07-07 22:04:46 +01:00
rcourtman 887513c020 Move report schedule selects onto shared FormSelect primitive
The MSP report scheduling form used raw native <select> elements,
failing the settings architecture guardrail that keeps Settings
selects on the shared labelled primitive. Cadence, Weekday, Format,
and Delivery now render through FormSelect, which also links each
label to its control.
2026-07-07 21:53:41 +01:00
rcourtman 8355335e08 Clarify v5 migration recovery states 2026-07-07 21:46:07 +01:00
rcourtman 89d9f51258 Record OIDC scope fix resolution in handoff spec 2026-07-07 21:44:23 +01:00
rcourtman 87aac4e575 Add OIDC scope editing to SSO provider settings
Settings never rendered the oidc.scopes field, so admins could not
request an extra group scope and the authorization request stayed at
the default openid profile email. Adds the Scopes input to the OIDC
create/edit modal, points the Groups Claim help text at it, and covers
the create/edit round-trip with model and panel tests.

References #1535.
2026-07-07 21:41:17 +01:00
rcourtman 4b645f4dd2 Add OIDC scope group auth fix spec 2026-07-07 21:09:13 +01:00
rcourtman 4043c466f6 Extend MSP install proof for portal rollups 2026-07-07 20:49:55 +01:00
rcourtman 4382919447 Add MSP report scheduling and alert rollup 2026-07-07 20:37:18 +01:00
rcourtman d43255889d Point relay pairing at the Pulse Mobile install page
A Relay customer who enables Remote Access and generates a pairing QR
has nothing to scan it with: Pulse Mobile is early access and its
install links live on the authenticated download page, which nothing
in the pairing flow mentioned. Add the pointer to the pairing help
text, pin it in the panel contract test, and give docs/RELAY.md the
same install path instead of 'join early access when available'.
2026-07-07 20:04:36 +01:00
rcourtman 8113f3e8c3 Ensure Helm Pages publishes release chart 2026-07-07 19:21:48 +01:00
rcourtman 155023d86a Add mobile impact gate to release dispatch 2026-07-07 18:21:20 +01:00
rcourtman 1fad0948d4 Clear expired work claim 2026-07-07 18:01:02 +01:00
rcourtman 0ff922ca16 Prepare v6.0.5 RC3 release packet
Refs #1535
v6.0.5-rc.3 helm-chart-6.0.5-rc.3
2026-07-07 16:48:12 +01:00
rcourtman eb99d7a6b3 Fix SSO session display labels
Refs #1535
2026-07-07 16:35:07 +01:00
rcourtman 57139c65c5 Fix mobile onboarding URL handoff sanitization 2026-07-07 15:12:59 +01:00
rcourtman e1cddca2d1 Prepare v6.0.5 RC2 release packet
Refs #1470

Refs #1471

Refs #1476

Refs #1483

Refs #1511

Refs #1515

Refs #1516

Refs #1524

Refs #1533

Refs #1534
v6.0.5-rc.2 helm-chart-6.0.5-rc.2
2026-07-07 10:50:49 +01:00
rcourtman 022f170dff Prefer route-aware Proxmox host URLs 2026-07-07 10:37:10 +01:00
rcourtman 3dd2ecd198 Add Proxmox token smoke diagnostics
Refs #1476
2026-07-07 10:10:16 +01:00
rcourtman ffd50a0052 Complete threshold-aware temperature displays
Refs #1534
2026-07-07 10:00:33 +01:00
rcourtman 1c8a9346ef Fix legacy OIDC SSO discovery and CSP nonce
Refs #1533
2026-07-07 09:54:14 +01:00
rcourtman a8ce7a2919 Prove bounded PBS backup polling
Refs #1524
2026-07-07 09:52:10 +01:00
rcourtman d52231855d Fix Proxmox token preservation regressions
Refs #1470, #1476, #1511
2026-07-07 09:49:26 +01:00
rcourtman 58ece3c1b8 Fix physical disk SMART/Proxmox merge identity
Refs #1516

Refs #1483

Refs #1471
2026-07-07 09:46:51 +01:00
rcourtman 8eed26d653 Bound PBS backup polling memory
Refs #1524
2026-07-07 09:42:54 +01:00
rcourtman 6d17e117bb Fix threshold-aware temperature severity
Refs #1534
2026-07-07 09:38:29 +01:00
rcourtman b503ee6fd3 Fix legacy agent update token recovery
Refs #1515
2026-07-07 09:31:21 +01:00
rcourtman dded079297 Prepare v6.0.5 RC1 release packet
Refs #1530

Refs #1531

Refs #1471
v6.0.5-rc.1 helm-chart-6.0.5-rc.1
2026-07-07 00:12:09 +01:00
rcourtman 4b669ad9b5 Fix SAT SMART temperature collection
Refs #1471
2026-07-06 23:42:00 +01:00
rcourtman 41a99c1a03 Prepare v6.0.5 patch release
Refs #1530

Refs #1531
2026-07-06 23:29:17 +01:00
rcourtman 5b6e7dc35e Harden release validator portability
Make release validation resolve repository paths before entering external release directories, and execute extracted Linux release binaries through Docker when the host cannot run them directly.
2026-07-06 23:23:09 +01:00
rcourtman af7f7c5d11 Fix Gemini Patrol tool-call readiness
Refs #1530
2026-07-06 23:01:16 +01:00
rcourtman 6f9f310ba6 Fix login remember-me submit state
Refs #1531
2026-07-06 22:41:27 +01:00
rcourtman 1d7fa6c4bf Prepare v6.0.4 release v6.0.4 helm-chart-6.0.4 2026-07-06 16:50:59 +01:00
rcourtman 4a597fa425 Fix legacy audit monotonic timestamps
Refs #1464
2026-07-06 16:20:55 +01:00
rcourtman 7ddc2fcb47 Fix Docker app-container percent normalization
Refs #1525
2026-07-06 16:11:36 +01:00
rcourtman 7edfa1bb86 Fix Docker container URL metadata identity
Refs #1490
2026-07-06 15:48:26 +01:00
rcourtman 92951532e3 Fix host agent clock-skew liveness
Refs #1519
2026-07-06 15:07:12 +01:00
rcourtman 6f582671b0 Fix Proxmox live chart CPU fallback
Refs #1525
2026-07-06 15:05:18 +01:00