randomparity / randomparity/kdive
Epic: live-test framework — reusable harness for live local-libvirt testing
- Dominant language
- Python
- Stars
- 0
- Forks
- 0
- Avg merge
- 1h 26m
- Merged PRs (30d)
- 311
Description
## Goal
Give the `live_vm` test tier the shared, reusable harness the `live_stack` tier
already has, and make the live tests actually run in CI. Today every `live_vm`
provider test re-derives the same boot/wait/teardown sequence (copy-pasted
domain XML, three panic-loop copies, ~14 `libvirt.open` sites), and the
environment knowledge that makes them pass lives only in one test file and in
maintainer memory — so each new live test relearns it. The `live-vm` CI job is
`workflow_dispatch`-only, stages no image and sets no env, so it skips even when
triggered: the product's boot→crash→introspect boundary has no automated gate.
**Design:** `docs/design/2026-07-18-live-test-framework.md` · **ADR:** `docs/adr/0386-live-test-framework-runner-topology.md`
## Decisions
1. A thin, arch-parameterized `boot_throwaway_domain` harness is the single way
to boot a throwaway libvirt domain, wait (`active`/`panic`/`ssh`), and tear it
down. libvirt mode is a per-test parameter (session vs system), not a pin.
2. The `live_vm` marker spans two families — throwaway-domain (the harness) and
provisioned-System (live stack + S3). Additive `live_vm_throwaway` /
`live_vm_provisioned` sub-markers under the bare marker; a fail-loud preflight
fails the job on missing env for a declared family instead of skipping green.
3. `live_vm_tcg` rides the existing live-stack spine (ADR-0353), not the new
harness; needing no `/dev/kvm`, it runs on a hosted `ubuntu-latest` runner
with the compose backends + S3.
4. Arch-additive runner topology: hosted TCG for breadth; native-KVM on per-arch
self-hosted Rocky Linux 10 runners for depth — `[self-hosted, kvm, x64]` now,
`[self-hosted, kvm, ppc64le]` as the drop-in target. ppc64le native KVM is the
primary goal the design must not block; x86_64 is the cost-effective PoC.
5. The self-hosted nightly must run the provisioned-System family natively; the
self-hosted job stays on `schedule` + `workflow_dispatch`, never fork PRs.
## Sub-issues
| Sub | Issue | Depends on |
|-----|-------|------------|
| A | #1290 live_vm harness + environment contract | — |
| B | #1291 self-hosted Rocky 10 KVM runner (codified, arch-parameterized) | A |
| C | #1292 guest-image + debuginfo provisioning | A |
| D | #1293 CI wiring — TCG on hosted; finish self-hosted job; fail-loud preflight | A, B, C |
| E | #1294 migrate + prune live_vm tests onto the harness | A |
| F | #1295 discoverability — guide + AGENTS.md pointer + runbook | A–E |
## Non-goals
- No change to the `live_stack` HTTP tier (already factored well).
- No database migration (test infrastructure only).
- Standing up the ppc64le runner is out of scope; the design must not block it.
## Proof
- After A + E: no duplicated boot boilerplate; `-m live_vm` still selects both
families; the `test-live` recipe is unaffected.
- After D: the TCG gate runs on a PR; the self-hosted nightly runs both families
and fails loud on missing env.
Contributor guide
Research direction
Start with docs/design/2026-07-18-live-test-framework.md and docs/adr/0386-live-test-framework-runner-topology.md, then follow sub-issues #1290–#1295 in dependency order. Confirm the stated proof: shared boot boilerplate is removed, -m live_vm still selects both families, the hosted TCG gate runs on PRs, and the self-hosted nightly fails loudly when required environment is missing.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- github-actions, linux, python
- Domain
- ci-cd, infrastructure, testing
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100