forked from heavy-duty/box
test+docs: strip staging specifics for the slim carve; changelog for #81
The staging template itself returns as a thin seed once rig#31's staging role exists; what ships here is only the mint-time box surface — the two box.env keys and the dynamic template suite. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
dd1166e1ed
commit
8d1824551c
2 changed files with 16 additions and 19 deletions
16
CHANGELOG.md
16
CHANGELOG.md
|
|
@ -7,6 +7,22 @@ which records not just what changed but what each drill run proved.
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
|
- **Server-posture template keys** (#81, carved from #69) — two optional
|
||||||
|
`box.env` allowlist keys. `BOX_REQUIRE_VM=1` refuses both the silent
|
||||||
|
container fallback (no `/dev/kvm`, exit 1) and an explicit `--container`
|
||||||
|
(exit 2): such a template's trust boundary is the VM. `BOX_AUTOSTART=1`
|
||||||
|
stamps `boot.autostart=true` at launch, per-instance like `limits.*`, so
|
||||||
|
the box returns from a host reboot without an operator; clones inherit it
|
||||||
|
via `incus copy`. Still no key for a network or a `security.*` flag, on
|
||||||
|
purpose.
|
||||||
|
- **Dynamic template test suite** (#81, carved from #69) — `test/cli.sh`
|
||||||
|
discovers `templates/*/` instead of hardcoding the list, so a new template
|
||||||
|
cannot ship unseen. Per template: `box.env` is driven through the real,
|
||||||
|
extracted `load_template` (unknown keys and missing `BOX_IMAGE`/`BOX_USER`
|
||||||
|
fail, fixtures proving both dies); `user-data.yaml` exists, declares
|
||||||
|
`#cloud-config`, parses as YAML, and installs tmux (#65). Grep guards pin
|
||||||
|
the `cmd_new` half: the `REQUIRE_VM` refusal orders after `pick_mode`, and
|
||||||
|
`boot.autostart` is stamped only under the `T_AUTOSTART` guard.
|
||||||
- **`box export` / `box import`** (#70) — a box's state that survives the box
|
- **`box export` / `box import`** (#70) — a box's state that survives the box
|
||||||
_and_ the host, unblocking #66's humane upgrade flow (down, export, rm,
|
_and_ the host, unblocking #66's humane upgrade flow (down, export, rm,
|
||||||
upgrade, re-import). `box export <box> [<file>]` wraps `incus export` into
|
upgrade, re-import). `box export <box> [<file>]` wraps `incus export` into
|
||||||
|
|
|
||||||
19
test/cli.sh
19
test/cli.sh
|
|
@ -198,25 +198,6 @@ for d in "$ROOT"/templates/*/; do
|
||||||
grep -qE '^[[:space:]]*-[[:space:]]+tmux$' "$d/user-data.yaml"
|
grep -qE '^[[:space:]]*-[[:space:]]+tmux$' "$d/user-data.yaml"
|
||||||
done
|
done
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# The staging template (#68) — server-class, still creds-free. Its posture in
|
|
||||||
# full: both boot demands set (proven through the real parser, not a grep),
|
|
||||||
# docker + rig preinstalled, and NOTHING that joins or admits — tailscale,
|
|
||||||
# auth keys and ssh in any spelling are rig's to install at bootstrap time,
|
|
||||||
# inside the guest, so their absence from the shipped cloud-init IS the
|
|
||||||
# creds-free contract. Comments may name them (to say why they are absent);
|
|
||||||
# effective lines must not.
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
STG="$ROOT/templates/staging"
|
|
||||||
check "staging: demands VM mode and autostart (via the real parser)" \
|
|
||||||
0 "REQUIRE_VM=1 AUTOSTART=1" tpl "$ROOT" staging
|
|
||||||
check "staging: installs docker (get.docker.com)" 0 "" \
|
|
||||||
grep -qF 'get.docker.com' "$STG/user-data.yaml"
|
|
||||||
check "staging: preinstalls rig" 0 "" \
|
|
||||||
grep -qF 'rig/main/install.sh' "$STG/user-data.yaml"
|
|
||||||
# shellcheck disable=SC2016 # $1 expands in the child shell, by design
|
|
||||||
check "staging: no tailscale/authkey/ssh outside comments (creds-free)" 1 "" \
|
|
||||||
bash -c 'grep -v "^[[:space:]]*#" "$1" | grep -qiE "tailscale|authkey|ssh"' _ "$STG/user-data.yaml"
|
|
||||||
rm -f "$TPLFN"
|
rm -f "$TPLFN"
|
||||||
|
|
||||||
# The keys' cmd_new half, grepped the way the expose guard is (line order —
|
# The keys' cmd_new half, grepped the way the expose guard is (line order —
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue