Commit Graph
14682 Commits
Author SHA1 Message Date
kevinveenbirkenbachandClaude Opus 4.8 29184e38da fix(storage): resolve the nfs state subdir from the python SPOT
Lookup plugins receive ansible variables unrendered, so routing the state subdir through a group_vars jinja value handed state_path the literal '{{ lookup(...) }}' string and the controller mount asked the server for /srv/nfs/{{ lookup('nfs_state_subdir') }} (Connection refused, nextcloud swarm roundtrip). Both nfs lookups now import STATE_SUBDIR directly; the intermediate lookup, the group_vars indirection and the unit-test fixture var that masked the gap are gone.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 23:04:40 +02:00
kevinveenbirkenbachandClaude Opus 4.8 9f53210fc6 fix(swarm-test): source the env SPOT in the node bootstrap script
04_bootstrap_nodes.sh consumed INFINITO_PACKAGE_INSTALL_SCRIPT and INFINITO_NODE_SRC_DIR from the ambient environment; local make targets provide them via BASH_ENV, but plain workflow steps do not, so every swarm CI job died at the required-var guard. Source load.sh explicitly like copy_worktree_to_node.sh.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 23:04:40 +02:00
kevinveenbirkenbachandClaude Opus 4.8 f244306c47 fix(install): initialize the pacman keyring before arch package installs
The archlinux-keyring upgrade hook now signs the local keyring and aborts with 'There is no secret key available to sign with' when pacman-key --init never ran (fresh arch containers in the CI image build). Initialize the keyring, idempotently, before every pacman -Syu.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 23:04:40 +02:00
kevinveenbirkenbachandClaude Opus 4.8 ef398ec645 refactor(stages): run CLI tests once from the destructor
test-e2e-cli discovers roles via group_names, not per stage, so the three per-stage invocations ran the same test set up to three times per play. A single invocation after sys-service-terminator also guarantees the final service flushes (including the backup generation) happened before the tests inspect their results.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 23:04:40 +02:00
kevinveenbirkenbachandClaude Opus 4.8 c34dba8406 feat(lint): require the container_backup flag on stack roles declaring volumes
role_is_stack in the role-mapping SPOT recognises compose.yml.j2, *.compose.yml.j2 siblings and compose.*.yml.j2 variants (bigbluebutton's compose.override.yml.j2). The new lint walks every invokable stack role whose meta/volumes.yml declares a named volume and requires the container_backup consumer flag in meta/services.yml, so no stack role's data can silently stay outside the backup plan. Opt out per role with '# nocheck: backup-service-flag <reason>' on the first line of meta/volumes.yml.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 23:04:40 +02:00
kevinveenbirkenbachandClaude Opus 4.8 3875eb2cf9 feat(variants): pin container_backup per matrix variant
Variant 0 pins the backup consumer flag enabled so the matrix baseline exercises the in-group branch; every other variant pins it disabled (shared: false carries the static-override suppression since the base value stays literally true). The matrix and wordpress variant entries move their services mapping to the list-item head so the static-override line parser resolves the override paths; yaml semantics are unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 23:04:40 +02:00
kevinveenbirkenbachandClaude Opus 4.8 4473edafb2 feat(roles): declare the container_backup consumer flag on stack roles with volumes
Every invokable stack role that declares named volumes in meta/volumes.yml now carries the standard container_backup consumer entry: enabled resolves via 'svc-bkp-container-2-local' in group_names, shared stays literally true since there is no per-consumer backup instance. Playwright/dynamic-flag/bond-baseline suppressions ride on the block per the established idioms; stale explanatory comments in the touched files are dropped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 23:04:40 +02:00
kevinveenbirkenbachandClaude Opus 4.8 63b5a60c94 feat(svc-bkp-container-2-local): provide the container_backup service
Register the role in the service registry under the abstract container_backup name (provides + enabled/shared/bond on the primary entry) so consumer roles can declare the backup dependency without naming the implementation. The run-once lint learns to find the 01_core.yml include inside a gated block, since this role wraps its core load in the IS_STACK_HOST block instead of duplicating the condition per task.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 23:04:40 +02:00
kevinveenbirkenbachandClaude Opus 4.8 10a5725143 feat(lint): accept guard-in-when-list and dynamic-flag key suppression
The run-once guard lint required the when to be exactly the guard string, rejecting roles that legitimately combine it with further conditions (svc-bkp-container-2-local gates its whole core on IS_STACK_HOST). A when-list containing the guard now passes. The variants coverage test learns the same block-above '# nocheck: dynamic-flag' key suppression the services dynamic-flags test already honors, so infrastructure consumer flags can opt out of two-polarity variant coverage.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 23:04:39 +02:00
Alejandro Roman d9ed2b9db9 fixed stalwart CI issues 2026-07-09 19:47:45 +02:00
kevinveenbirkenbachandClaude Opus 4.8 bcd6e82f14 refactor(install): SPOT the package install script path
INFINITO_PACKAGE_INSTALL_SCRIPT in default.env replaces the scripts/install/package.sh literal in the Dockerfile (new required build arg), the environment install step, and both swarm bootstrap call sites. Shell consumers hard-require the variable.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 17:46:34 +02:00
kevinveenbirkenbach 831dee3942 Merge branch 'main' into feature/swarm-nfs
# Conflicts:
#	.github/workflows/cleanup-stale.yml
#	.github/workflows/delete-branch.yml
#	.github/workflows/entry-pull-request-cancel.yml
#	.github/workflows/entry-pull-request-change.yml
#	.github/workflows/entry-push-latest.yml
#	.github/workflows/images-build-ci.yml
#	.github/workflows/images-mirror-all.yml
#	.github/workflows/images-mirror-cleanup.yml
#	.github/workflows/images-mirror-missing.yml
#	.github/workflows/lint-ansible.yml
#	.github/workflows/lint-docker.yml
#	.github/workflows/lint-javascript.yml
#	.github/workflows/lint-makefile.yml
#	.github/workflows/lint-markdown.yml
#	.github/workflows/lint-packages.yml
#	.github/workflows/lint-playwright.yml
#	.github/workflows/lint-python.yml
#	.github/workflows/lint-shell.yml
#	.github/workflows/release-highest.yml
#	.github/workflows/release-version.yml
#	.github/workflows/security-codeql.yml
#	.github/workflows/security-scorecard.yml
#	.github/workflows/test-code-external.yml
#	.github/workflows/test-code-integration.yml
#	.github/workflows/test-code-lint.yml
#	.github/workflows/test-code-unit.yml
#	.github/workflows/test-deploy-local.yml
#	.github/workflows/test-deploy-universal.yml
#	.github/workflows/test-deploy-workstation.yml
#	.github/workflows/test-dns.yml
#	.github/workflows/test-environment.yml
#	.github/workflows/test-install-make.yml
#	.github/workflows/test-install-pkgmgr.yml
#	.github/workflows/update.yml
2026-07-09 17:39:12 +02:00
kevinveenbirkenbachandClaude Opus 4.8 211a46dbc6 fix(moodle,nextcloud): extend healthcheck start_period against reap mid-init
First boot on loaded fork runners exceeded the healthcheck windows: swarm reaped moodle's fpm container after 60s+5x1m (exit 137 mid-install) and nextcloud's occ-status containers right at the 10m+3x1m boundary. Extend to 15m/20m following the joomla/espocrm/suitecrm precedent; container exits still reap immediately, only hanging unhealthy checks wait longer.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 17:30:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 da2d660f35 fix(svc-storage-nfs-client): make the write probe destination host-unique
All three swarm nodes probed the shared export with the same destination file; ansible's atomic tmp-write + rename raced across NFS clients and failed with 'Destination ... does not exist' (bridgy-fed). A per-host suffix removes the collision by construction.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 17:30:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 192470cf2e fix(sys-front-inj-matomo): treat a 200 error-dict as API-not-ready instead of crashing
Matomo can answer SitesManager queries with HTTP 200 carrying an error dict ({"result":"error",...}) instead of the expected site array; indexing site_check.json[0] then crashed the deploy of every app with tracking enabled (decidim). Route the mapping shape into the existing API-not-ready deferral, keeping the array path untouched. A dict passes Jinja's sequence test, so is mapping is the only reliable discriminator.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 17:30:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 a2bf70e924 fix(penpot): pin the upload spec to the image input and scope the layer assert
A bare input[type=file] .first() can bind the dashboard's .penpot/.zip import uploader during the SPA transition into the workspace, pushing the PNG through the import pipeline (media object not found dialog) instead of the toolbar image upload. Target #image-upload explicitly and scope the layer assertion to the Layers tabpanel, since the import-error dialog lists the filename too and a page-wide match would false-pass on the exact failure.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 17:30:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 23a5e32de3 fix(nextcloud): omit REDIS_HOST_PASSWORD when the redis engine has no password
Variant 1 runs redis without a password; the unconditional env line handed the image an empty REDIS_HOST_PASSWORD, phpredis sent AUTH to a passwordless redis (ERR Client sent AUTH), the session backend died and every login bounced in a CSRF loop. Emit the line only when the engine actually has a password; the rendered env is byte-identical whenever one is set.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 17:30:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 a7fbb94972 fix(swarm-test): bound diagnostics against wedged dockerd and SPOT the nfs state path
A wedged DinD dockerd hung a single diagnostics docker exec until the 360-minute job timeout cancelled the job together with its artifact uploads (job 86013153099 sat 5h in service logs). Route every diagnostics exec through a timeout wrapper, tail-limit the log dumps, bound showmount, cap the collect step at 30 minutes, and dump the pending services' log tails once on the final converge failure. The NFS state path moves into a single source of truth: STATE_SUBDIR in utils/storage/nfs.py feeds the nfs_state_subdir lookup (deploy side) and the derived INFINITO_SWARM_NFS_STATE_PATH env var (harness side); the diagnostics script requires both path vars instead of defaulting, and the swarm inventory drops its redundant export_base restatement.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 17:30:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 2b44d9f7f9 fix(test-e2e-cli): stage CLI test assets on the node and SPOT the node src dir
The per-role existence asserts and the test script path were controller paths evaluated on the remote swarm node (docker connection, node checkout under /opt/infinito-nexus), so every svc-runner swarm job failed on a stat that could never succeed. Assert both required assets in one localhost-delegated loop, stage roles/<app>/files/test onto the node, run the staged script, and delegate the optional defaults/vars probes to the controller (they silently skipped before). svc-runner's test reaches its sources via RUNNER_SRC_DIR (compose: INFINITO_SRC_DIR dev-container mount; swarm: node checkout). The node checkout path itself moves into a single source of truth: INFINITO_NODE_SRC_DIR in default.env, consumed by the bootstrap/copy scripts, the swarm-playwright target, and the swarm inventory extras.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 17:30:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 c057b1a1c8 fix(roles): never quote container_address swarm resolver fragments
In swarm mode the container_address lookup returns a $(/usr/bin/resolve-container-id ...) fragment that must expand at exec time; piping it through Jinja quote hands docker the literal string and every exec fails with 'No such container' (broke all three snipe-it CI variants). Remove the quote at the seven snipe-it sites and the live matrix/openproject sites, convert openproject's argv exec to shell so the fragment can expand, split the matrix bridge restart per deployment mode with a manager gate, and mark the compose-only or eval-contract sites with nocheck. A new lint (container-address-quote) bans the pattern repo-wide.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 17:30:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 3f1771c374 fix(openresty): retry lua-prometheus downloads on transient http errors
Bare wget -q exited 8 on raw.githubusercontent.com rate limits under the parallel CI fan-out, failing the image build and with it whole deploy jobs (kix, suitecrm, akaunting). Retry with backoff on 429/5xx and log the actual http status.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 17:30:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 cfa368ceff fix(opentalk): break the swarm bucket/client provisioning deadlock
The controller crash-looped on a missing S3 bucket and the recorder on an unprovisioned OIDC client while the swarm converge gate blocked before any post-flush task could create either. The embedded seaweedfs sidecar now bootstraps its consumer bucket itself at startup (new seaweedfs_sidecar_script filter: entrypoint-wrapped server, bounded readiness poll, idempotent weed shell bucket create, TERM/INT forwarded to the server), and the Keycloak clients are provisioned before the handler flush. Post-flush bucket tasks stay as an idempotent backstop; the obsolete restart tasks are dropped. Live-validated against chrislusf/seaweedfs:4.38: bucket created, stop behavior identical to the stock entrypoint.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 17:30:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 9895d00008 fix(bbb): gate prometheus-exporter override on the prometheus service flag
The override declared prometheus-exporter unconditionally with only volumes, while the upstream-generated base compose emits the service (with its image) only when ENABLE_PROMETHEUS_EXPORTER is set. Deploying without web-app-prometheus in the group produced a merged project with a service that has neither image nor build, which compose config rejects. The guard mirrors the env.j2 gate, keeping override and base in lockstep like the greenlight and recording blocks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 17:30:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 ef17f09136 fix(n8n): pin single replica and add healthz healthcheck
n8n CE caches isInstanceOwnerSetUp per process without cross-replica invalidation, so the swarm topology default of 3 replicas left stale replicas bouncing logged-in sessions to /setup (variant 1) and caused session-crash churn during the reschedule test (variant 0). Pin to 1 replica; multi-main needs licensed queue mode. Add the conventional /healthz wget healthcheck so swarm convergence and the chaos-harness Health.Status probe carry a real readiness signal.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 17:30:35 +02:00
kevinveenbirkenbachandClaude Opus 4.8 19049108c1 fix(coturn): distribute tls cert as swarm config instead of node-local bind
The single-file cert bind only exists on the rendering node, so swarm rejected every coturn task scheduled onto a worker (bind source path does not exist) and the nextcloud/bbb/opentalk stacks never converged. A config is raft-distributed to all nodes; the key stays a secret.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 17:30:35 +02:00
Alejandro Roman 9a16884f08 fix(sys-svc-compose-ca): never pull locally-built image tags in the CA override probe and honor .git/info/exclude in the project-tree walk 2026-07-09 16:54:23 +02:00
evangelostsak 4be7b05b69 chore(test-e2e-cli): align to upstream, drop vendored README + deltas 2026-07-09 13:47:46 +02:00
evangelostsak 7cca17a4f5 revert(sys-cleanup): drop journald change, unneeded on systemd nodes 2026-07-09 13:47:46 +02:00
evangelostsak 6524afc62a chore(svc-net-wireguard): trim comments, drop dead harness vars
Tighten verbose comments to one line each (no-long-comments) and remove
leftovers from the old mesh design: unused NODE_OCTET / WG_PORT and the
dead WIREGUARD_IMAGE/VERSION env asserts.
2026-07-09 13:47:46 +02:00
evangelostsak 9c1cb22be4 test(svc-net-wireguard): hub-spoke server/client/NAT + MTU coverage
Reuse the proven client tunnel mechanics but restructure the e2e into 3
server/client pairs: the 3 debian nodes deploy in [server] flavor
(linuxserver generates each peer config), and each workstation joins via
that config in [client] flavor (wsdebian as [client, nat]). Verify each
client<->server tunnel, the NAT masquerade rule on the behind-NAT node,
and a sane auto-derived wg0 MTU.
2026-07-09 13:47:46 +02:00
evangelostsak 4d2694afa2 feat(svc-net-wireguard): auto-derive client MTU via automtu
Replace the hardcoded 1400 client MTU with a pkgmgr automtu probe (path
MTU minus WireGuard overhead), falling back to the configured value when
probing is unavailable. Runs before the compose env is rendered so WG_MTU
reflects the derived value (decision 11).
2026-07-09 13:47:46 +02:00
evangelostsak dd68a6178c test(svc-net-wireguard): address mesh peers by WGNET IP
Endpoints used the outer node name (wg-e2e-<m>), which the wireguard
container cannot resolve from inside the peer node's inner dockerd, so no
handshakes formed (all 30 pairs down). Resolve each node's WGNET IP and
use it as the peer Endpoint, reached via the published relay port. Also
dump `wg show` per node before the connectivity check for debugging.
2026-07-09 13:47:46 +02:00
evangelostsak 1ede755647 test(svc-net-wireguard): deploy mesh nodes as client flavor
With the default server flavor, env.j2 sets PEERS/SERVERURL so the
linuxserver image runs in server mode and regenerates wg0.conf on
restart, wiping the rendered full-mesh peer set -> no handshakes (all 30
pairs unreachable). Deploy the mesh with WIREGUARD_FLAVOR=[client] so the
container honors the provided wg0.conf.
2026-07-09 13:47:46 +02:00
evangelostsak 0350ecbac6 fix(sys-svc-container): make in-container storage driver overridable
The DinD daemon.json hardcoded fuse-overlayfs, which fails copy-up on
images shipping an /etc/mtab symlink (e.g. linuxserver/wireguard) under
deeply-nested CI: "symlink /proc/mounts .../etc/mtab: file exists".
Expose SYS_SVC_CONTAINER_STORAGE_DRIVER (default fuse-overlayfs,
unchanged) and let the wireguard e2e deploy override it to vfs.
2026-07-09 13:47:46 +02:00
evangelostsak b5a7afcd91 test(svc-net-wireguard): install systemd in node prerequisites
make install only sets up the venv + collections; the systemd dependency
comes from the distro package (built at image-build, not run here), so
/sbin/init never existed and the systemd re-create failed. Install
systemd (+ systemd-sysv / systemd-sysvcompat for /sbin/init) as a
bootstrap prerequisite on every node.
2026-07-09 13:47:46 +02:00
evangelostsak e80d71219e test(svc-net-wireguard): re-create nodes as systemd after install
The pkgmgr bases have no systemd (no /sbin/init), so booting init failed;
systemd only arrives as an infinito package dependency during make
install. Two-phase: boot the bare base, run the per-node make install
(fresh environment), mask container-hostile first-boot units + seed a
machine-id, then commit and re-create the node with --entrypoint=/sbin/init
so systemd is PID 1 and the deploy can start docker.service like a host.
2026-07-09 13:47:46 +02:00
evangelostsak 5f59f6bda0 test(svc-net-wireguard): boot pkgmgr nodes via systemd entrypoint
The pkgmgr base image's ENTRYPOINT runs the pkgmgr CLI, so passing
/sbin/init as a command arg never made systemd PID 1 (systemd never
became ready). Override with --entrypoint=/sbin/init so systemd (already
present in the base) boots as PID 1, and dump container logs on a
readiness timeout.
2026-07-09 13:47:46 +02:00
evangelostsak 97d33ae6e0 test(svc-net-wireguard): per-node install on systemd pkgmgr bases
The role starts docker via systemd (docker.service), which raw debian/
manjaro/centos containers (PID1=sleep) cannot do. Boot the nodes from
Infinito's own fresh pkgmgr base images (systemd + pkgmgr, no infinito
baked) as systemd containers (cgroupns=host, cgroupfs rw, tmpfs /run),
so each node still runs its own make install + inventory + deploy and
the deploy can install/start docker exactly like a real host. Images are
pinned to 1.15.2 (never a moving tag); manjaro workstation -> arch base.
2026-07-09 13:47:46 +02:00
evangelostsak 435d14b952 test(svc-net-wireguard): install gnupg for docker repo setup
sys-svc-container configures the docker-ce apt repo via apt_repository,
which needs a gpg binary to handle the signing key; the minimal images
lack it (Either apt-key or gpg binary is required). Add gnupg/gnupg2 to
the per-distro prerequisites.
2026-07-09 13:47:46 +02:00
evangelostsak 163927ad4f fix(sys-cleanup): tolerate missing journald in containers
The journald cleanup ran under set -e but journalctl --vacuum-size lacked
a || true guard, so on minimal containers without journald the deploy
hard-failed (journalctl: command not found, rc 127). Skip the block when
journalctl is absent and make every call best-effort.
2026-07-09 13:47:46 +02:00
evangelostsak 991927a1a4 test(svc-net-wireguard): force DOCKER_IN_CONTAINER via extra-var
The -e container=docker env did not flip DOCKER_IN_CONTAINER: fact
gathering runs under become/sudo, which env_resets and drops `container`
before the setup module reads it. Force DOCKER_IN_CONTAINER=true as an
ansible extra-var (highest precedence) so the deploy takes the
container/DinD path and skips the host-only timezone task.
2026-07-09 13:47:46 +02:00
evangelostsak 3aca193de4 test(svc-net-wireguard): mark nodes as containers for autodetect
Infinito's DOCKER_IN_CONTAINER derives from the `container` env var,
which plain Docker (unlike systemd/podman) does not set, so the nodes
misdetected as bare metal: the constructor ran the host-only timezone
task (needs hwclock) and sys-svc-container would take the non-DinD path.
Boot nodes with -e container=docker so autodetect is correct.
2026-07-09 13:47:46 +02:00
evangelostsak 3139c63876 test(svc-net-wireguard): deploy with local connection
The deploy runs on the target node itself, but ansible defaulted to SSH
and failed UNREACHABLE (Connection refused, no sshd). Force
ansible_connection=local via extra-var so the role applies locally.
2026-07-09 13:47:46 +02:00
evangelostsak 1e95fb8033 test(svc-net-wireguard): pass vault password file to deploy
provision auto-creates a random vault password at <inv>/.password and
encrypts ansible_become_password with it. deploy dedicated does not
default to it, so rendering become_pass failed. Pass --password-file
<inv>/.password (node-local, written by provision) to the deploy.
2026-07-09 13:47:46 +02:00
evangelostsak b93bd594c9 test(svc-net-wireguard): give each node its own repo copy
The shared bind-mount let make install state (.env, venv stamps) leak
across nodes, so only the first nodes ran the real install and the rest
short-circuited with no venv (no infinito venv python). Mount the repo
read-only as -src and tar-copy it (excluding .git) into a node-local
/opt/src/infinito per node, so every node runs a full, independent
install. Aligns with the per-node-inventory design.
2026-07-09 13:47:46 +02:00
evangelostsak 43b533ff3c test(svc-net-wireguard): glob venv python path + diagnose on miss
server1 resolved /opt/venvs/infinito/bin/python but a later node did
not, so the venv lands at a different path/name there. Glob the common
venv parents (/opt/venvs/*, /root/.venvs/*, $HOME/.venvs/*) instead of
two fixed paths, and on a miss dump the existing venv dirs + .env venv
lines so the real location is visible in CI.
2026-07-09 13:47:46 +02:00
evangelostsak bdc8d5b34a test(svc-net-wireguard): resolve venv python by explicit path
load.sh's PYTHON resolver silently falls back to the system python3
(missing install deps -> ModuleNotFoundError: ruamel) when it cannot
confirm the venv, which happened on later nodes once server1 generated
the shared .env. Pin /opt/venvs/infinito/bin/python (or the HOME venv)
explicitly and fail loudly if absent, for both provision and deploy.
2026-07-09 13:47:46 +02:00
evangelostsak d4f351fcd5 test(svc-net-wireguard): invoke CLI via venv python -m cli
The `infinito` console script was not reliably on PATH across distros
(found on debian, missing on centos). Call the venv "$PYTHON" -m cli
from the repo root instead — deterministic, no console-script/PATH
dependency, and the venv python carries the install deps.
2026-07-09 13:47:46 +02:00
evangelostsak a27a06c32f test(svc-net-wireguard): run CLI via venv entrypoint, not bare python3
Bare `python3 -m cli` used the system interpreter, missing make install's
venv deps (ModuleNotFoundError: ruamel). Source scripts/meta/env/load.sh
to put /opt/venvs/infinito/bin on PATH and call the `infinito` console
script for provision + deploy.
2026-07-09 13:47:46 +02:00
evangelostsak 03d4a176c1 test(svc-net-wireguard): --allowerasing for centos prereqs
CentOS Stream 9 ships curl-minimal; installing curl conflicts with it.
dnf --allowerasing lets it swap curl-minimal for curl cleanly.
2026-07-09 13:47:46 +02:00