Files
computer-playbook/scripts/tests/workspace/utils/common.sh
T
kevinveenbirkenbachandClaude Opus 5 ac7b98f342 refactor(workspace): split the environment suite into base, compose and swarm tracks
scripts/tests/environment/ becomes scripts/tests/workspace/ with one
subdirectory per track. base/ prepares the workspace and is a prerequisite;
compose/ and swarm/ are independent of each other, so CI can run them as
separate jobs with a budget each. 00_orchestrator.sh runs the tracks named
by INFINITO_WORKSPACE_TRACKS and aborts on an unknown one.

The job count stays at five: cli.meta.ci.dev_runtime matrix assigns exactly
one track per distro and flips the split with the run number, so two
consecutive runs cover both tracks on every distro without doubling the
matrix. The workspace_track input (rotate|compose|swarm) pins it from manual
steer through the orchestrator for a targeted re-run.

Job names carry the track glyph from utils/symbol_glossary and the image
shortened to its last two segments, so quay.io/centos/centos:latest reads
as centos:latest.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 22:57:05 +02:00

120 lines
3.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# Shared bootstrap, constants, and generic helpers for the environment
# test suite. Sourcing this file loads the repository env modules and
# configures git's safe.directory for the mounted workflow checkout.
# Cache-specific helpers live in cache.sh.
set -euo pipefail
DASHBOARD_APP="web-app-dashboard"
MATOMO_APP="web-app-matomo"
MARIADB_APP="svc-db-mariadb"
POSTGRES_APP="svc-db-postgres"
DASHBOARD_URL="https://dashboard.infinito.example"
MATOMO_URL="https://matomo.infinito.example"
: "${DASHBOARD_APP}" "${MATOMO_APP}" "${MARIADB_APP}" "${POSTGRES_APP}" "${DASHBOARD_URL}" "${MATOMO_URL}"
UTILS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${UTILS_DIR}/../../../.." && pwd)"
ensure_git_safe_directory() {
local git_probe=""
if ! command -v git >/dev/null 2>&1; then
return 0
fi
if git -C "${REPO_ROOT}" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
return 0
fi
git_probe="$(git -C "${REPO_ROOT}" rev-parse --is-inside-work-tree 2>&1 || true)"
if [[ "${git_probe}" != *"detected dubious ownership"* ]]; then
return 0
fi
if ! git config --global --get-all safe.directory 2>/dev/null | grep -Fx "${REPO_ROOT}" >/dev/null 2>&1; then
echo "Configuring Git safe.directory for the mounted workflow checkout."
git config --global --add safe.directory "${REPO_ROOT}"
fi
}
load_repo_env() {
if ! command -v python3 >/dev/null 2>&1; then
return 0
fi
local previous_pwd
previous_pwd="$(pwd)"
cd "${REPO_ROOT}"
unset INFINITO_ENV_LOADED
unset PYTHON
unset PIP
# shellcheck source=scripts/meta/env/load.sh
source scripts/meta/env/load.sh
cd "${previous_pwd}"
}
load_repo_env
ensure_git_safe_directory
# Print the generated inventory and host_vars for debugging and verification.
#
# Matrix-variant deploys write `${INFINITO_INVENTORY_DIR}-0/devices.yml`,
# `${INFINITO_INVENTORY_DIR}-1/devices.yml`, ... never the unsuffixed
# `${INFINITO_INVENTORY_DIR}/devices.yml`. Discover every variant inside the
# infinito_nexus container (where the inventories actually live) and
# print each one; fall back to the unsuffixed path when no variants
# exist.
#
# cmd is executed via `sh -lc` (see scripts/tests/deploy/local/exec/container.sh)
# — keep the inner shell strictly POSIX (no bash arrays, no `shopt`, no `(( ))`).
inspect_glob_print() {
local glob_pattern="$1" fallback="$2"
make compose-exec cmd="set -eu; \
any=; \
for f in ${glob_pattern}; do \
[ -f \"\$f\" ] || continue; \
any=1; \
echo \"==> \$f\"; \
cat \"\$f\"; \
done; \
if [ -z \"\$any\" ]; then \
echo \"==> ${fallback}\"; \
cat \"${fallback}\"; \
fi"
}
inspect() {
echo "Printing the generated inventory to verify which roles were deployed."
inspect_glob_print "${INFINITO_INVENTORY_DIR}-*/devices.yml" "${INFINITO_INVENTORY_FILE}"
echo "Printing host_vars to verify per-host configuration."
inspect_glob_print "${INFINITO_INVENTORY_DIR}-*/host_vars/localhost.yml" "${INFINITO_INVENTORY_HOST_VARS_FILE}"
}
# Check that a URL responds with the expected HTTP status code.
# Usage: assert_http_status <expected_code> <url>
assert_http_status() {
local expected="${1}"
local url="${2}"
local actual
actual="$(curl -sS -o /dev/null -w '%{http_code}' "${url}" || true)"
if [ "${actual}" != "${expected}" ]; then
echo "[FAIL] ${url} returned HTTP ${actual}, expected ${expected}" >&2
exit 1
fi
echo "[OK] ${url} returned HTTP ${actual}"
}
# Print every group-conditional service key, comma-separated for `disable=`.
# Usage: variable_services [keep_key ...]
# Param keep_key: service keys the deploy under test needs, kept enabled.
variable_services() {
local out
out="$(cd "${REPO_ROOT}" && "${PYTHON}" -m cli.meta.roles.applications.dynamic_services --exclude "$@")"
[ -n "${out}" ] || {
echo "[FAIL] variable_services resolved to an empty disable set" >&2
exit 1
}
printf '%s' "${out}"
}