Lyncoln ec2077f979 Freeze lab-tested PostgreSQL plugin engine
Extract PostgreSQL, Podman runtime and systemd lifecycle adapters while preserving existing lifecycle and scoring behavior. Update RPM layout and add guarded operator-run lab harnesses.

Record successful manual stop/start, promotion, demotion and rewind-only rejoin with pinned installed hashes. The unfenced lab does not validate automatic failover, Pacemaker-managed transitions or divergent-data rewind.

Validation: 103 offline tests, original-function differential checks, checksum manifest and whitespace checks passed.
2026-09-13 01:57:04 -04:00

PostgreSQL HA OCF resource agent

A modular PostgreSQL HA implementation of ocf:loxthelion:managed-container. Pacemaker invokes the agent to manage a rootless systemd/Quadlet maintenance container. PostgreSQL is started and stopped independently with pg_ctl.

This branch extracts the frozen implementation into a PostgreSQL plugin, Podman runtime adapter and systemd lifecycle adapter. It is installed on ELITEDESK in the test cluster only. Basic lifecycle checks and manual promotion, demotion and rewind-only rejoin tests passed according to operator-supplied output. The lab has no fencing. See the engine contract and validation plan. The production test report applies to the earlier freeze, not automatically to this extraction.

Project layout

  • reference/: original agent and immutable known-good reference copy.
  • refactored/: executable agent, application/runtime/lifecycle modules, and a Python state helper.
  • tests/: offline structural and behavioral comparison checks.
  • cluster-context/ and runtime-context/: saved lab configuration and state; these snapshots are not live status. Environment credentials are redacted.
  • notes/: refactor plan, validation report, and file hashes.
  • HANDOFF.md: scope, architecture, and behavior that must be preserved.

Validation

Requires Bash, Python 3, and the OCF shell library (normally /usr/lib/ocf/lib/heartbeat/ocf-shellfuncs). From the repository root:

python3 tests/verify_refactor.py
python3 tests/test_plugin_engine.py
python3 tests/test_promotion_scores.py
python3 tests/test_promotion_scheduler.py
python3 tests/test_disconnected_state.py
python3 tests/test_promotion_cleanup.py
sha256sum -c notes/REFACTOR-SHA256SUMS

The tests retain all 29 original functions and verify exact equivalence after reversing only adapter-call substitutions. They exercise the added promotion-scoring layer without operating the live cluster. The operator has reported successful production SBD fencing, automatic promotion, VIP movement, and former-primary rewind/rejoin in a three-node cluster.

Read operations, testing and snapshot provenance, and the review findings. Historical lab snapshots and notes are not current production configuration. Keep target-role=Promoted, single-primary limits, and the VIP's Promoted-role colocation and promotion-before-start ordering.

The public entrypoint remains /usr/lib/ocf/resource.d/loxthelion/managed-container. No production changes are part of this documentation freeze.

Clone

git clone ssh://git@gitea.loxthelion.com:2222/david/ocf-managed-container.git

RPM builds

Gitea Actions builds development RPMs on main pushes and pull requests using an ubuntu-latest runner with a Fedora 43 job container. See packaging instructions for local builds and artifacts. License provenance remains pending; release publishing and automated deployment are not configured.

Promotion scoring

Scores are 1000 for a healthy primary, 100 for a strictly verified streaming standby, 50 for a recently verified eligible disconnected standby, and -INFINITY otherwise. See the scoring design for identity, local state ownership, the 300-second default freshness policy and limitations. Fencing remains mandatory; scores do not authorize unfenced manual promotion.

S
Description
No description provided
Readme
241 KiB
Languages
Shell 95.2%
Python 4.7%