Skip to content

Gate OpenBao upgrades on unsealed recovery proofs #4756

Open
3 of 4 issues completed
Open

Description

@devantler

🤖 Generated by the Agentic Engineer

User Story

As a platform operator,
I want OpenBao upgrades to prove that every required server is initialized, unsealed and healthy without blocking bootstrap or recovery,
So that an apparently Ready pod cannot authorize the next replacement while the secrets service is unavailable.

Acceptance Criteria

  • Regression tests reject sealed, uninitialized, missing, stale-version and incomplete member observations, including Kubernetes Ready responses that are not unsealed-health proof.
  • Exercise cold start and recovery, preserving the initialization dependency: do not make the bootstrap readiness check require an unseal operation that itself waits for readiness.
  • Render the proposed chart and actual production post-renderers; prove retained storage, security configuration, unseal behavior and replace-on-delete strategy are preserved. Do not update a pinned regression or checksum alone to permit an upgrade.
  • A reviewed protected rollout replaces at most one member at a time and requires fresh positive peer, unseal and configured storage-health proof before the next step. Retain an explicit recovery path.
  • Exact-head review and native CI pass; after merge, record two separated live readbacks for the approved release and tenant secret delivery. Missing API/quorum evidence remains unknown, never inferred from desired images or Ready alone.

Context

The released 2.6.3 repair tracked by #4391 is now present on all three running servers: separated OIDC-only reads on 11 October report version 2.6.3, initialized and unsealed, exactly one active member, and the latest StatefulSet revision. The original automatic partition plan was superseded by the reviewed replace-on-delete recovery in #4710. No additional replacement is needed to deliver that patch.

The separate next-chart upgrade in #4535 remains blocked on the bootstrap/recovery-safe health proof described in its existing hold. This issue preserves that unfinished obligation; it does not make the upgrade ready or claim fresh cold-start, negative-health or quorum API evidence.

Part of #2653. Reliability value: protect the secrets service and unblock controlled future upgrades. This is captured follow-up work, not a started implementation or a delivered safety gate.

Activity

  1. added theissue type on Oct 11, 2026
  2. moved this to 📥 Backlog in 🌊 Project Boardon Oct 11, 2026
  3. devantler commented on Oct 15, 2026

    @devantler
    ContributorAuthor

    🤖 Generated by the Agentic Engineer

    Source-backed refinement for the upgrade gate: keep bootstrap readiness separate from permission to replace a server. The current server configuration intentionally accepts sealed and uninitialized health responses so the downstream initialization job can run. The initialization job reaches individual members, initializes only the designated first member and then unseals peers. Making that Helm readiness probe strict would recreate the dependency cycle, not deliver this issue.

    Recommended implementation order:

    1. Add a read-only, bounded health evaluator with fresh per-member identity and version bindings. Reject sealed, uninitialized, missing, duplicate, stale, malformed and partial observations; HTTP success or Kubernetes Ready alone must not pass. Prove those negative cases before adding any replacement action.
    2. Exercise the evaluator against disposable native OpenBao processes with synthetic data and credentials: cold initialization, sealed restart, follower join, leader change and unavailable peer. Preserve the existing bootstrap path. This proves server behavior, not a production storage or quorum check.
    3. Integrate the evaluator into a separately reviewed protected main-only maintenance procedure. Before each single-member replacement, require current source/deployment binding, complete peer and retained-storage evidence, and a fresh authenticated membership/quorum observation. If the supported read path or its authorization is not established, remain HOLD; a health endpoint alone is not quorum proof. Verify recovery and tenant secret delivery before proceeding to another member.

    Keep the actual chart/post-renderer and pinned native regression in #4535 authoritative; changing their version or checksum alone remains insufficient. The same controlled rollout can later establish runtime adoption for #4912, whose config cleanup is already merged but whose running servers still use their startup copies.

    This is refinement of the existing blocker, not a started rollout or a change to its unchecked acceptance criteria. No production credential, server, probe, storage or authorization was changed.

  4. updated Priority Medium and Effort High on Oct 16, 2026
  5. devantler commented on Oct 16, 2026

    @devantler
    ContributorAuthor

    🤖 Generated by the Agentic Engineer (interactive Claude Code session)

    Refinement, 16 October: moved to Ready, first step split out as #4962

    • Outcome: an OpenBao server is replaced only after every server is proven initialized, unsealed and on the expected release. Kubernetes Ready alone stops counting as that proof.
    • Why now: two pieces of started work wait on this issue. The chart update in chore(deps): update helm release openbao to v0.30.6 #4535 has been held since early October, and the last criterion of Remove obsolete OpenBao memory-lock configuration warnings #4912 needs a controlled restart of the servers. Nothing else unblocks them.
    • Cost of waiting: it grows slowly. The servers run a current, patched release (2.6.3), but every later chart or server update hits the same wall.
    • Service class: Risk reduction. No incident and no deadline.
    • Priority: Medium. Effort: High for the whole issue (evaluator, native server exercise, protected procedure and a supervised rollout), so it is split into steps.

    First step, #4962: an offline judge of captured server health with negative controls. It takes no production action and adds no replacement path. It follows step 1 of the order recorded above. Steps 2 and 3 (exercising native servers, and the protected single-server procedure) will be filed once the judge's evidence format is settled.

    The acceptance criteria above are unchanged.

  6. moved this from 📥 Backlog to 🫴 Ready in 🌊 Project Boardon Oct 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Fields

    Priority

    Medium

    Effort

    High

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions