Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

mikronova/draupnir

.nornir/container-consolidation-plan.md

Container engine consolidation — jera → draupnir (status + deferred gaps)

Decided 2026-07-12. The nordisk consolidation law (workspace_nordisk/.nornir/ consolidation-panels-maps-design.md §1.1): the app→jera→draupnir chain must own provisioning in exactly ONE place. KVM was already unified (jera's DraupnirVmBootRunner boots via draupnir::Boot). Containers were NOT: jera had its own BollardEngine duplicating draupnir's backend-oci (both pin bollard 0.20). This doc records what landed and what is deliberately deferred.

What landed (this pass, additive, no regression)

draupnir (the one engine now lives here):

jera (delegates through draupnir, mirrors vm.rs):

DONE — the duplicate engines are removed; one engine, in draupnir

The consolidation is complete (2026-07-12). Every duplicate bollard container engine in the constellation has been deleted now that draupnir owns the one true engine; the removals were gated on the shared draupnir path being green + tested.

  1. jera's run_container repointed + BollardEngine DELETED (edda e7c02cc, jera 0.1.4). run_container / run_container_with_reports now route through draupnir::container::run_to_completion (map RunOutcome → ContainerOutcome, forward the Health reporter). With the last reference gone, jera's BollardEngine, BollardBootRunner, BollardProc, the ContainerEngine trait, EngineState, and ContainerRunSpec were all deleted. DraupnirContainerBootRunner

    • StubContainerBootRunner are the only container runners left. A generic run_container_on<B: Boot + ContainerControl> keeps it mock-testable (no daemon). cargo test -p jera GREEN on default / --features container-oci / --no-default-features (39 each).
  2. Default feature flipped OFF bollard. jera now ships default = [] (lean std build, no engine linked); the live OCI engine is opt-in behind container-oci = ["draupnir/backend-oci"]. The bollard/futures deps and the bollard feature were dropped. A single build has ONE engine (draupnir's), never two. nornir-jobs forwards container-oci to jera.

  3. nornir's THIRD copy repointed (nornir repo). nornir/src/viz/test_boot.rs dropped its own independent BollardEngine / BollardBootRunner / ContainerEngine / EngineState / ContainerRunSpec for a DraupnirContainerBootRunner<B> that maps a ContainerBuild → draupnir::BootSpec and drives the lifecycle over draupnir's Boot + ContainerControl. nornir's direct dep:bollard is gone; the feature test-boot-container-bollard now forwards to draupnir/backend-oci (name kept for back-compat). The podman-subprocess ContainerBootRunner stays as the no-socket fallback. cargo test -p nornir (default) GREEN; the container tests are driven by a mock draupnir backend (no daemon).

Constellation grep — one container RUN engine (2026-07-12)

grep -r 'bollard::' across the constellation source now shows the container run/lifecycle engine in exactly ONE place — draupnir. The other two bollard users are not container run engines and are deliberately left:

Behavior notes (parity preserved)