Skip to content

Define clean-install HA qualification - #889

Closed
ankitgoswami wants to merge 38 commits into
ankitg/ha-debian-installfrom
ankitg/ha-clean-install-qualification
Closed

Define clean-install HA qualification#889
ankitgoswami wants to merge 38 commits into
ankitg/ha-debian-installfrom
ankitg/ha-clean-install-qualification

Conversation

@ankitgoswami

@ankitgoswami ankitgoswami commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Reviewable diff: +218/-22 across 5 files (excludes generated, test, and story files).

Summary

Defines the evidence required before the fixed three-host Fleet application, database, DCS, and VIP profile is called supported at a recorded fleet scale and topology. The packaged release must pass the complete procedure separately on Debian arm64 Raspberry Pi hardware, Ubuntu amd64, and 64-bit Raspberry Pi OS arm64. The release server and client images use digest-pinned base images so the qualified artifacts can be reproduced against the same upstream contents.

Stack: #887 -> #888 -> #889 -> #890 -> #891 -> #892. This diff is relative to guided installer PR #888. Application updates are implemented in #890 and #891; adjacent-release update qualification is in #892.

How it works

For each required platform, operators install the same packaged release concurrently on three dedicated hosts and record the release bundle and deployment-manifest digests, container image identities, host-package versions, host hardware, miner count, plugin mix, connection topology, command backlog, and timing evidence. The packaged Fleet images are built from digest-pinned Alpine and nginx bases so the recorded artifact identity is not changed by an upstream tag moving. Results from different platforms cannot be combined into one passing report.

The checklist verifies reboot persistence, Fleet and database host loss, acknowledged-write durability, writer exclusivity, passive request rejection, demotion cancellation, firewall behavior, interrupted-command recovery, active curtailment through failover, repeated failovers, and a 24-hour soak. Any evidence gap, overlapping old/new-holder work, or failed gate leaves that exact artifact and host profile unsupported.

flowchart LR
  P["Select one required platform"] --> I["Install one pinned release on three hosts"]
  I --> R["Verify reboot recovery"]
  R --> F["Run failure matrix"]
  F --> C["Verify commands and curtailment"]
  C --> S["Repeat failovers and soak"]
  S --> V{"Every gate passes?"}
  V -->|yes| N["Record this platform as qualified"]
  V -->|no| U["Keep this platform unsupported"]
Loading

Areas of the code involved

Area / package / file What changed Why it matters for review
deployment-files/ha/QUALIFICATION.md Adds the redacted qualification checklist, platform matrix, evidence requirements, and result tables Check that every support claim requires durable platform-specific evidence
deployment-files/ha/README.md Distinguishes installer-compatible targets from qualified hardware profiles Check that compatibility is not presented as proven support
docs/rfcs/0002-active-passive-fleet-ha.md Aligns the support contract with deferred Fleet Node, scheduler-recovery, and alert-delivery work Check the boundary of the first supported profile
deployment-files/server/Dockerfile and deployment-files/client/Dockerfile Pin release base images by digest Check that qualification records a reproducible image input rather than a moving tag

Key technical decisions & trade-offs

  • Qualification uses packaged release artifacts rather than a source checkout.
  • Base image tags remain readable but are paired with digests so qualification is tied to fixed upstream contents.
  • Each required operating-system, architecture, and hardware combination gets its own complete report; passing one target does not make an architecture-wide claim.
  • Support is limited to the exact artifact identities, host-package versions, recorded hardware, fleet scale and topology, and a trusted three-host HA segment.
  • PROCESSING-command recovery covers server state; exactly-once device effects and device-side fencing remain outside the support claim.
  • Every injected Fleet, PostgreSQL, etcd, or VIP fault carries an active curtailment target and separate 180-second shed and restoration bounds.
  • Fleet Node reconnect scale, scheduler recovery, and alert delivery remain deferred.
  • The procedure records outcomes and timings without adding test-only runtime behavior.

Testing & validation

  • ./deployment-files/ha/tests/test-profile.sh
  • git diff --check
  • Real Debian arm64 Raspberry Pi, Ubuntu amd64, and Raspberry Pi OS arm64 qualification runs are pending.
  • Hardware failovers, the 180-second curtailment target, repetition counts, and the 24-hour soak are pending, so the qualification verdict remains pending.

@github-actions github-actions Bot added documentation Improvements or additions to documentation review-policy: needs-review Managed by the Review Policy workflow. labels Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown

🔐 Codex Security Review

Note: This is an automated security-focused code review generated by Codex.
It should be used as a supplementary check alongside human review.
False positives are possible - use your judgment.

Scope summary

  • Reviewed pull request diff only (9109c001d6dda403677645876ae6faa5a213deaf...b4255da76bcb565339124a0f0e3e2a2cc31ec68a, exact PR three-dot diff)
  • Model: gpt-5.6-sol

💡 Click "edited" above to see previous reviews for this PR.


Review Summary

Overall Risk: MEDIUM

Findings

[MEDIUM] Qualification instructions contradict the supported installer workflow

  • Category: Reliability
  • Location: deployment-files/ha/QUALIFICATION.md:61
  • Description: The procedure instructs operators to copy node.env, secret directories, and the etcd root password separately, then run all three installations concurrently. The released installer instead requires ha-a to generate protected per-host bundles first; those bundles contain the configuration, scoped secrets, and the ha-a root password.
  • Impact: The documented clean-install gate cannot be reproduced through the supported entrypoint. Manual staging could bypass bundle validation, mishandle cluster credentials, or produce an invalid qualification report.
  • Recommendation: Follow the README workflow explicitly: run the ha-a wizard through bundle export, transfer each protected bundle with its release archive, then install the peers concurrently. Remove instructions for manually copying generated configuration, secrets, or the root password.

[MEDIUM] Server image remains mutable despite the digest pin

  • Category: Infrastructure
  • Location: deployment-files/server/Dockerfile:1
  • Description: Pinning the Alpine base digest does not make the resulting image reproducible because the subsequent apk add --no-cache nmap gcompat resolves packages from mutable repositories. The HA installer rebuilds this image independently on each database host.
  • Impact: Identical release bundles installed at different times can contain different, unqualified package code or fail to reproduce the image identities recorded by this qualification procedure.
  • Recommendation: Build and bundle the complete API image in CI and verify its digest during installation, as done for the database image. Alternatively, use an immutable package snapshot and pin every installed package input.

Notes

The diff contains no runtime authentication, authorization, protobuf, plugin, or mining-pool configuration changes.


Generated by Codex Security Review |
Triggered by: @ankitgoswami |
Review workflow run

@ankitgoswami ankitgoswami changed the title test(ha): define clean install qualification Define clean-install HA qualification Aug 7, 2026
@ankitgoswami
ankitgoswami force-pushed the ankitg/ha-debian-install branch from a5a9558 to 19afb50 Compare August 7, 2026 18:44
@ankitgoswami
ankitgoswami force-pushed the ankitg/ha-clean-install-qualification branch from be18ad0 to 1e137c7 Compare August 7, 2026 18:44
@ankitgoswami
ankitgoswami force-pushed the ankitg/ha-debian-install branch from 19afb50 to 10499c6 Compare August 7, 2026 18:59
@ankitgoswami
ankitgoswami force-pushed the ankitg/ha-clean-install-qualification branch 2 times, most recently from ea992c4 to eed7b91 Compare August 7, 2026 19:11
@ankitgoswami
ankitgoswami force-pushed the ankitg/ha-debian-install branch 2 times, most recently from 1db9142 to 32a6e7a Compare August 7, 2026 19:16
@ankitgoswami
ankitgoswami force-pushed the ankitg/ha-clean-install-qualification branch 2 times, most recently from 1450e54 to dece2e5 Compare August 7, 2026 19:36
@ankitgoswami
ankitgoswami force-pushed the ankitg/ha-debian-install branch from 32a6e7a to a27e256 Compare August 7, 2026 19:36
@ankitgoswami
ankitgoswami force-pushed the ankitg/ha-clean-install-qualification branch 2 times, most recently from 305bce3 to 664159b Compare August 7, 2026 19:47
@ankitgoswami
ankitgoswami force-pushed the ankitg/ha-debian-install branch from a27e256 to 020ab1e Compare August 7, 2026 19:47
@ankitgoswami
ankitgoswami force-pushed the ankitg/ha-clean-install-qualification branch from 664159b to fd51051 Compare August 7, 2026 19:52
@ankitgoswami
ankitgoswami force-pushed the ankitg/ha-debian-install branch from 020ab1e to 0e77ebf Compare August 7, 2026 20:00
@ankitgoswami
ankitgoswami force-pushed the ankitg/ha-clean-install-qualification branch 2 times, most recently from 4f4fb38 to d567ef7 Compare August 7, 2026 20:11
@ankitgoswami
ankitgoswami force-pushed the ankitg/ha-debian-install branch from 0e77ebf to df8ed5d Compare August 7, 2026 20:11
@ankitgoswami
ankitgoswami force-pushed the ankitg/ha-clean-install-qualification branch from d567ef7 to 788fbde Compare August 7, 2026 20:19
@ankitgoswami
ankitgoswami force-pushed the ankitg/ha-debian-install branch from df8ed5d to a24a164 Compare August 7, 2026 20:19

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b4255da76b

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

| Commit SHA | Pending |
| Release bundle SHA-256 | Pending |
| `deployment-manifest.sha256` SHA-256 | Pending |
| Deployed API, client, and Patroni image IDs/digests on every host | Pending |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Include DCS image evidence in qualification reports

When qualifying the three-host HA profile, the witness host runs the etcd/DCS container from deployment-files/ha/compose.yaml and does not run API, client, or Patroni, so this evidence field both asks for impossible image evidence on ha-c and omits the only image that provides quorum there. A report could therefore mark the fixed database/DCS/VIP profile as qualified without recording the deployed etcd image identity; please record the etcd image per host and scope API/client/Patroni evidence to the hosts that actually run them.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

automation client documentation Improvements or additions to documentation review-policy: needs-review Managed by the Review Policy workflow. server

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants