Skip to content

feat(breakfix): BFX break-fix suite (BFX01-BFX06) with NICo coverage - #562

Draft
abegnoche wants to merge 5 commits into
mainfrom
cursor/bfx-remediation-suite-4f18
Draft

feat(breakfix): BFX break-fix suite (BFX01-BFX06) with NICo coverage#562
abegnoche wants to merge 5 commits into
mainfrom
cursor/bfx-remediation-suite-4f18

Conversation

@abegnoche

@abegnoche abegnoche commented Jul 28, 2026

Copy link
Copy Markdown
Member

Summary

Adds the break-fix validation suite covering all 13 M8 tests (BFX01–BFX06), wired into
the existing bare_metal and k8s suites rather than a standalone suite.

  • isvtest/validations/breakfix.py — 12 new validation classes (BFX03-01 reuses the
    existing BmHardwareSerialCheck)
  • suites/bare_metal.yaml — 11 checks; suites/k8s.yaml — GPU reset + cordon
  • my-isv — demo stubs for every step, exercised by make demo-test
  • nico — 4 read-only implementations; the rest emit a structured skip with a
    gap: BFXxx-yy marker rather than a vacuous pass

Validated against live NICo

Run on two independent NICo deployments on az51-dev3 (management cluster, 6 CPU-only
machines) and az51-dev3-dh1 (18 GPU hosts).

Test Result
BFX03-01 hardware serials Pass — chassis/baseboard/CPU/NIC/GPU identifiers on all 18 GPU hosts
BFX02-03 repair history Pass — genuine Error history on 18/18 machines
BFX02-01 maintenance events Skip — neither site has any maintenance events to observe
BFX01-01/02/03/05, BFX02-02, BFX03-02/03, BFX04-01, BFX05-01, BFX06-01 Skip — NICo gaps

The 8 gaps reproduced with identical reasons on both deployments, so they are platform
gaps rather than one site's configuration. BFX02-01 is a missing-fixture problem, not a
NICo gap — it belongs in a different bucket.

Every break-fix step reads only the machine resource, so the suite runs with
infrastructure-scope access and needs no tenant-level API permissions.

Honest coverage note

On NICo, 9 of the 13 checks are placeholders that cannot pass or fail — they document
missing API surface. Only BFX03-01 and BFX02-03 currently prove anything about NICo. The
gap markers make that visible instead of hiding it behind green checkmarks.

Also in this PR

  • nico/config/key_access.yaml folded into bare_metal.yaml — both imported the same
    suite, which made --provider nico --suite bare_metal unresolvable. The
    key-provisioning steps carry skip: true so a routine run stays read-only.
  • BFX test-plan labels synced with the suite wiring (this was failing make test).
  • BFX02 checks now skip instead of passing when the provider returns no evidence, and
    InUse no longer counts as repair history.

Testing

make test (124 passed) · make demo-test · make lint · uvx pre-commit run -a ·
scripts/validate_suite_wiring.py --check

New checks are unreleased; run with ISVTEST_INCLUDE_UNRELEASED=1.

Follow-ups

Closes

Closes #207
Closes #208
Closes #210
Closes #211
Closes #212
Closes #213
Closes #214
Closes #215

@copy-pr-bot

copy-pr-bot Bot commented Jul 28, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 7ad8f2fe-0e35-4192-9a84-374fafb33175

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/bfx-remediation-suite-4f18

Comment @coderabbitai help to get the list of available commands.

@abegnoche
abegnoche force-pushed the cursor/bfx-remediation-suite-4f18 branch from 85d9bae to 52bc942 Compare July 30, 2026 15:23
@copy-pr-bot

copy-pr-bot Bot commented Jul 30, 2026

Copy link
Copy Markdown

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

Introduce suites/remediation.yaml covering all open M8 break-fix issues
(BFX01-BFX06): validation classes, my-isv demo stubs, and NICo provider
wiring. Move BFX03-01 (HardwareSerialCheck) out of bare_metal into the
new plain suite with capability gating per PR #561.

NICo implements read-only observability where the tenant REST API exposes
signals (maintenance events, repair history, serial inventory). Mutating
lifecycle actions, GPUd/Sentinel/Maestro agents, NV switch firmware,
retirement notices, and tenant notification channels emit structured
skips with documented gap IDs.

Stacks on PR #561 (capability/requires model).

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Alexandre Begnoche <abegnoche@users.noreply.github.com>
@abegnoche
abegnoche force-pushed the cursor/bfx-remediation-suite-4f18 branch from 52bc942 to 4a7e1b9 Compare August 4, 2026 20:10
Break-fix is mostly bare-metal plus k8s-only cordon/GPU reset, so a plain
remediation suite is not justified the way storage is. Wire BM BFX into
bare_metal, k8s actions into k8s, and rename scripts/modules to breakfix.

Signed-off-by: Alexandre Begnoche <abegnoche@nvidia.com>
Both nico configs imported suites/bare_metal.yaml, so `--provider nico
--suite bare_metal` could not resolve and demanded an explicit -f. This was
the only such collision in the repo.

Fold key_access.yaml's setup/teardown steps into bare_metal.yaml and delete
the file. The test step was already identical in both; only the throwaway-key
provisioning was unique. Those two steps carry `skip: true` so a routine run
stays read-only -- setup_key_access mutates the site (POST sshkey +
sshkeygroup, best-effort PATCH of the SSH-key SOL flag), which should not be
a side effect of ordinary bare-metal validation. Unskip both to make
AUTH-XX-03 pass without a pre-synced key.

Signed-off-by: Alexandre Begnoche <abegnoche@nvidia.com>
The test-plan coverage guardrail requires each plan entry's labels to equal
the union of labels across the suite wirings declaring that test_id. Folding
the BFX checks into bare_metal.yaml and k8s.yaml added platform labels to the
wiring but not to docs/test-plan.yaml, leaving `make test` red on all 13 BFX
entries.

Add bare_metal to the eleven bare-metal entries, and kubernetes to BFX01-01
and BFX01-04, which live in the k8s suite. Also apply the pre-commit import
ordering and whitespace fixes the BFX commits missed.

Signed-off-by: Alexandre Begnoche <abegnoche@nvidia.com>
… checks

Against a live NICo site both checks passed while proving nothing.
events_queryable and history_queryable are set by the provider script the
moment the machine-list call succeeds, so MaintenanceEventsCheck passed with
zero events -- it would pass identically against a site with no maintenance
capability at all.

Skip instead of passing when the evidence list is empty. An empty list cannot
distinguish a working query API from one that returns nothing, and a provider
should not clear BFX02 without demonstrating the capability. A failed or
absent API still fails, so the stricter reading only affects the vacuous case.

Also stop counting InUse as repair history. _REPAIR_STATUSES is
{Maintenance, Reset, Error, Repairing}, but the filter admitted InUse too --
a normal lifecycle state -- so machines that had never been repaired produced
repair records.

Verified on a NICo dev site: BFX02-01 now skips (site has no maintenance
events), BFX02-03 still passes on genuine Error history across all 6 machines.

Signed-off-by: Alexandre Begnoche <abegnoche@nvidia.com>
@abegnoche abegnoche changed the title feat(remediation): BFX break-fix suite (M8) with NICo gaps documented feat(breakfix): BFX break-fix suite (BFX01-BFX06) with NICo coverage Aug 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment