Files
computer-playbook/scripts/github/validate/selection.sh
T
kevinveenbirkenbachandClaude Opus 5 d9f8af9b16 fix(ci): refuse a mesh pin the row cannot take
A selection token may pin the mesh state as &vpn or &direct, but check_pins
had no arm for it. pinned_vpn_states intersects the pin with the states the
mode allows and only swarm meshes, so a token like @compose+clearnet&vpn left
an empty state list: the row produced no job at all and the run reported green
for a combination that never deployed. That is the outcome _reject exists to
prevent, and every sibling axis already refuses an impossible pin.

The new arm asks whether any candidate mode keeps a state rather than whether
the pin is reachable, so a held vpn axis still overrides the pin instead of
being refused. That behaviour has its own test and is unchanged.

An earlier check was removed with the compose-mesh revert of 2026-10-16
because it rested on meshable() and smallest_variant(), which that revert
deleted. This one reuses pinned_vpn_states, applies to the swarm-only axis the
revert restored, and covers both mesh states instead of only &vpn.

pin_vpn and vpn_mode now reach check_pins from all three callers. The run's
vpn axis reaches the validation job through call-orchestrator and
call-validation, which passed every other axis but this one. The priority
procedure and its skill state all eight axes a token carries, not six:
architecture and mesh were pinnable and, for architecture, already validated,
yet neither was documented.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-21 18:13:54 +02:00

36 lines
1.4 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# Validate a run's selection inputs against the branch it would deploy from,
# before any runner is spent on it.
#
# Inputs via env:
# INPUT_WHITELIST whitelist value of the run ('' = nothing to check)
# INPUT_PRIORITY priority line of the run ('' = nothing to check)
# INPUT_MODE deploy modes the run draws from
# INPUT_TOR tor axis of the run
# INPUT_VPN WireGuard mesh axis of the run
# INPUT_DISTROS distro pool of the run ('' = every declared distro)
# INPUT_FILESYSTEM filesystem pool of the run ('' = every declared kind)
# INPUT_ARCHITECTURES architecture pool of the run ('' = amd64 and arm64)
# INPUT_LIFECYCLES lifecycle envelope of the run
#
# Exits non-zero when a token names a row this branch does not have or pins an
# axis the row cannot take; cli.meta.ci.validate reports every offender at once,
# so a stale list is fixed in one pass rather than one CI round per entry.
set -euo pipefail
# shellcheck source=scripts/meta/env/load.sh
source scripts/meta/env/load.sh
"${PYTHON}" -m cli.meta.ci.validate \
--whitelist "${INPUT_WHITELIST:-}" \
--priority "${INPUT_PRIORITY:-}" \
--modes "${INPUT_MODE:-auto}" \
--tor "${INPUT_TOR:-auto}" \
--vpn "${INPUT_VPN:-auto}" \
--distros "${INPUT_DISTROS:-}" \
--filesystem "${INPUT_FILESYSTEM:-}" \
--architectures "${INPUT_ARCHITECTURES:-}" \
--lifecycles "${INPUT_LIFECYCLES:-}"