refactor(#2427): extract shared hive-CA trust bind-mount helper
hive-ci and hive-forge both bind the runtime-generated hive CA cert
read-only and order their container@ unit after hive-tls-ca.service so
the bind source exists before nspawn sets the mount up — the same
bind-mount + ordering + rationale duplicated verbatim in two modules.
Extract that language-agnostic half into a pure helper,
nix/host-modules/lib/hive-ca-trust.nix, taking a container name and
returning { useSelfSigned, caContainerPath, bindMount, containerOrdering }.
The per-runtime consumption stays at each call site (hive-ci's additive
NODE_EXTRA_CA_CERTS, hive-forge's Go SSL_CERT_FILE concat). hive-ci folds
containerOrdering into its existing mkMerge alongside the TimeoutStartSec
bump.
The helper is a pure function, not a module: host-modules/default.nix is
an explicit aggregator (not a glob) and the docs eval imports that same
aggregator, so the lib/ file is never picked up as a module. A third
outbound-TLS-trusting container no longer means a third copy-paste.
This commit is contained in:
parent
edf9fd036e
commit
6c4ef5f798
3 changed files with 92 additions and 49 deletions
60
nix/host-modules/lib/hive-ca-trust.nix
Normal file
60
nix/host-modules/lib/hive-ca-trust.nix
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
# Shared hive-CA trust plumbing for containers that must trust the
|
||||
# self-signed gateway/forge leaf for *outbound* TLS (webhook delivery,
|
||||
# CI artifact upload, …). The hive CA is generated at runtime by the host
|
||||
# `hive-tls-ca.service` (see `hive-tls.nix`) — it can't be baked into a
|
||||
# derivation — so each such container binds the public `ca.pem` read-only
|
||||
# and orders its `container@<name>` unit after `hive-tls-ca.service` so the
|
||||
# bind source exists before nspawn sets the mount up.
|
||||
#
|
||||
# This is the language-agnostic half (bind-mount + systemd ordering). The
|
||||
# *consumption* differs per runtime and stays at each call site: Node's
|
||||
# `NODE_EXTRA_CA_CERTS` is additive (hive-ci), Go's `SSL_CERT_FILE` replaces
|
||||
# the bundle so it needs a system-CAs+hive-CA concat step (hive-forge).
|
||||
#
|
||||
# Pure function — NOT a NixOS module (don't add it to the host-modules
|
||||
# aggregator). Call it from a module's `let`:
|
||||
#
|
||||
# caTrust = import ./lib/hive-ca-trust.nix { inherit lib tlsCfg gatewayCfg; };
|
||||
# # then, in the container:
|
||||
# # bindMounts = { … } // caTrust.bindMount;
|
||||
# # systemd.services."container@hive-ci" = lib.mkMerge [ caTrust.containerOrdering … ];
|
||||
# # environment.NODE_EXTRA_CA_CERTS = caTrust.caContainerPath; # consumption, per-caller
|
||||
#
|
||||
# `tlsCfg` = config.services.hyperhive.tls
|
||||
# `gatewayCfg` = config.services.hyperhive.gateway
|
||||
{
|
||||
lib,
|
||||
tlsCfg,
|
||||
gatewayCfg,
|
||||
}:
|
||||
let
|
||||
# `gateway.useSelfSigned` is the single source of truth for the
|
||||
# self-signed condition — no duplicated derivation.
|
||||
useSelfSigned = gatewayCfg.useSelfSigned;
|
||||
caHostPath = "${tlsCfg.stateDir}/ca.pem";
|
||||
caContainerPath = "/run/hive-ca/ca.pem";
|
||||
in
|
||||
{
|
||||
inherit useSelfSigned caContainerPath;
|
||||
|
||||
# Fold into the container's `bindMounts` via `//`. Binds ONLY the public
|
||||
# CA cert (never the `hive-tls` state dir — it holds the CA + leaf private
|
||||
# keys), read-only. Empty when not self-signed, so the whole trust path
|
||||
# drops out cleanly.
|
||||
bindMount = lib.optionalAttrs useSelfSigned {
|
||||
${caContainerPath} = {
|
||||
hostPath = caHostPath;
|
||||
isReadOnly = true;
|
||||
};
|
||||
};
|
||||
|
||||
# Fold into the caller's `container@<name>` unit (via `lib.mkMerge` if the
|
||||
# caller adds its own keys, e.g. hive-ci's `TimeoutStartSec`). Orders the
|
||||
# container after the host `hive-tls-ca.service` so the bind source exists
|
||||
# before nspawn sets the mount up — a condition-skipped/late CA would
|
||||
# otherwise fail the container start.
|
||||
containerOrdering = lib.mkIf useSelfSigned {
|
||||
after = [ "hive-tls-ca.service" ];
|
||||
requires = [ "hive-tls-ca.service" ];
|
||||
};
|
||||
}
|
||||
Loading…
Reference in a new issue