Commit Graph
14682 Commits
Author SHA1 Message Date
kevinveenbirkenbachandClaude Opus 5.5 159d7e6d01 test(web-app-openproject): accept a single probe before the gate deadline
`deadline` is whole seconds from `date +%s`. A run that starts just
before a second boundary reaches the deadline after the first probe and
one `sleep 1`, so the gate correctly gives up after one probe while the
test demanded two. With a stubbed clock (1000, 1000, 1002) the gate
probes once and prints `deadline of 2s reached`. The deadline message
already proves the pending migration held the entrypoint back; require
at least one probe.

Reported by CodeRabbit on #979.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-17 11:16:43 +02:00
kevinveenbirkenbachandClaude Opus 5.5 8f262aaf9b fix(web-app-nextcloud): hold the image at 34 until integration_openproject supports 35
Nextcloud#3 of this PR (run 38899717331, job 116977335535) failed
`tests/addons/integration_openproject.spec.js:30` in both retries: the
OpenProject admin section never rendered. The deploy had already logged
why: `occ app:install integration_openproject` answered `App "OpenProject
Integration" cannot be installed because it is not compatible with this
version of the server`, and the non-mandatory plugin was skipped while
the addon's `required: true` still sent the spec in.

Upstream, the latest stable release v3.2.0 declares
`<nextcloud min-version="33" max-version="34" />`; only the v3.3.0
nightlies (latest 2026-10-15) declare `max-version="35"`.

Keep `34-fpm-alpine` and mark the line `# nocheck: docker-version`, which
`utils/update/docker.py:suppressed_services` reads, so the updater stops
reopening the 35 bump. The nginx and context_agent bumps of this PR stay.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-17 10:22:14 +02:00
kevinveenbirkenbachandClaude Opus 5.5 c66b79ce82 fix(web-app-openproject): probe migrations without creating tables
Swarm Nextcloud#3 on main 748189e890 (job 117182318941) wedged the
OpenProject schema: the convergence check gave up after 74 attempts
while the seeder kept exiting 1, first with
`relation "ar_internal_metadata" already exists` from its structure
load, then with `relation "announcements" already exists` on every
`db:migrate`.

The seeder (`docker/prod/seeder`) loads `db/structure.sql` through
psql, statement by statement, when `\dt` finds no relation. In swarm,
`depends_on` is ignored, so web and worker start alongside it and poll
`await_migrations.sh`. That gate called
`rails db:abort_if_pending_migrations`, which runs
`migration_context.open`, i.e. `Migrator.new`, whose constructor
executes `schema_migration.create_table` and
`internal_metadata.create_table` (Rails 8.0.4,
activerecord/lib/active_record/migration.rb:1430-1431). The seeder
saw an empty database at 05:33:20; by 05:33:38 the gate had created
`ar_internal_metadata`, the structure load aborted at line 255 with
everything alphabetically before it already committed, and every
later attempt took the migrate path into tables that already existed.

Probe with `rails db:migrate:status` instead. It aborts while
`schema_migrations` is missing and otherwise only reads the recorded
versions (database_tasks.rb:303, migration.rb:1318); the gate treats
any `down` row as pending.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-17 10:17:39 +02:00
kevinveenbirkenbach 3e0392e678 Merge remote-tracking branch 'origin/main' into merge/pr-950 2026-10-17 10:09:18 +02:00
evangelostsak e62ed8c56f Merge remote-tracking branch 'upstream/main' into feature/svc-net-wireguard 2026-10-17 09:34:00 +02:00
kevinveenbirkenbach da2f6f8b4c Merge pull request #978 from infinito-nexus/update/docker-image-versions-svc-ai-ollama-20261017-8225636
update(images): update Docker image versions (svc-ai-ollama)
2026-10-17 08:51:44 +02:00
infinito-nexus-updater[bot] f36460c6de update(images): update Docker image versions (svc-ai-ollama) 2026-10-17 04:14:02 +00:00
evangelostsak b3a9e140af test(ci): the compose title carries the direct arm glyph 2026-10-17 00:03:18 +02:00
evangelostsak 99fcca4d1b feat(ci): compose titles carry the direct arm glyph
A compose row never joins a WireGuard mesh, so its title shows 🛣️ like a
direct swarm row. The vpn axis, the planner and the deploy are unchanged.
2026-10-17 00:03:18 +02:00
kevinveenbirkenbach b43f63b590 Merge pull request #976 from infinito-nexus/update/docker-image-versions-web-app-matrix-20261016-22fba12
update(images): update Docker image versions (web-app-matrix)
2026-10-16 22:46:37 +02:00
kevinveenbirkenbach 57d43a0432 Merge pull request #977 from infinito-nexus/update/docker-image-versions-web-app-socialhome-20261016-975bc19
update(images): update Docker image versions (web-app-socialhome)
2026-10-16 22:46:18 +02:00
infinito-nexus-updater[bot] 723218a00e update(images): update Docker image versions (web-app-socialhome) 2026-10-16 20:16:31 +00:00
infinito-nexus-updater[bot] 50bee421d3 update(images): update Docker image versions (web-app-matrix) 2026-10-16 20:16:25 +00:00
kevinveenbirkenbach 748189e890 Merge pull request #974 from pragepani/fix/sys-ctl-hlth-journalctl/skip-container-logs
fix(sys-ctl-hlth-journalctl): skip container logs in the host journal…
2026-10-16 22:15:20 +02:00
kevinveenbirkenbach 5da0a1c69c Merge pull request #972 from infinito-nexus/update/version-sources-web-app-suitecrm-20261016-76d4132
update(versions): update pins with a declared source (web-app-suitecrm)
2026-10-16 22:14:15 +02:00
kevinveenbirkenbachandClaude Opus 5.5 3855b75c5f fix(sys-ctl-hlth-journalctl): read long and repeated MESSAGE fields
Without `--all`, `journalctl --output=json` encodes a field over 4096
bytes as `null`, so a long host error matched nothing and the check
passed. A repeated `MESSAGE` field arrives as a JSON array of its
values, and `bytes()` on that array raised `TypeError`, which aborted
the whole check.

Pass `--all`, and tell a byte array (all integers) from an array of
field values, decoding each value on its own.

Reproduced against the host journal: a 5000-byte error line read back
as `"MESSAGE":null` and produced no match; an entry with two `MESSAGE`
fields, sent over the native journal socket, read back as
`["error first","error second"]` and crashed `host_errors` with
`TypeError`. With the fix both are reported.

Also clear the two test-lint findings of this PR:
`test_comments_valid` rejects the narrative comment above the
`journalctl` Popen, so it goes; the stderr-to-file choice stays, because
an unread stderr pipe that fills up would block `journalctl` while
stdout is still being read. `test_no_uncached_file_reads` flags the
read of the stub's argument file, which lives in the test's tempdir and
is written per run, so the path-keyed `utils.cache.files.read_text`
could serve a stale body; the read opts out with
`# nocheck: cache-read tempdir fixture`, as the other stub-driven
script tests do.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 22:11:09 +02:00
kevinveenbirkenbach 9a0adfdcab Merge pull request #975 from infinito-nexus/fix/cache/carrier-nested-load-repark
fix(cache): re-park the applications carrier after every nested app load
2026-10-16 21:26:38 +02:00
evangelostsak 6e28039782 docs(wireguard): the role acts on every host in its group 2026-10-16 21:26:17 +02:00
evangelostsak b0c71d4428 test(wireguard): the layer follows group membership 2026-10-16 21:26:17 +02:00
evangelostsak b7d709499d test(wireguard): the CLI test requires the container engine
A row that deploys only svc-net-wireguard installs no engine, and the test
builds its three hosts as inner containers. Verified on a freshly created dev
container with no engine: the role skipped the mesh-less host, the
prerequisite installed the engine, and all 20 checks passed.
2026-10-16 21:26:17 +02:00
evangelostsak 5d0e8c6ccd feat(test-e2e-cli): include the roles a CLI test declares under cli.requires
Read through the role_tests lookup like the other cli keys. CLI tests only
run in dev, act and github, so a prerequisite never reaches production.
2026-10-16 21:26:17 +02:00
evangelostsak 7ea924a346 feat(wireguard): skip a compose host the mesh CLI gave no mesh, visibly
Swarm still fails hard on a host without a mesh. A compose host in the group
without one, such as the role's own CI row, prints why and changes nothing.
2026-10-16 21:26:17 +02:00
evangelostsak e3963d9dbb feat(wireguard): run the layer on every host in the svc-net-wireguard group
Swarm resolves exactly as before: the meshed arm puts every node and the
backup host into the group, the direct arm none, and advertise_addr stays ''
there.
2026-10-16 21:26:17 +02:00
evangelostsak ec33add867 revert(env): stop passing INFINITO_COMPOSE_VPN through 2026-10-16 21:26:17 +02:00
evangelostsak 7a1b7457e0 revert(env): drop INFINITO_COMPOSE_VPN 2026-10-16 21:26:17 +02:00
evangelostsak 0f77f828e1 revert(ci): a compose row never takes the mesh 2026-10-16 21:26:17 +02:00
evangelostsak 3bc1ca91b6 revert(ci): the vpn input describes swarm rows only 2026-10-16 21:26:16 +02:00
evangelostsak e92f2f4cce revert(ci): the vpn input describes swarm rows only 2026-10-16 21:26:16 +02:00
evangelostsak c9f203b9f1 revert(ci): stop handing the compose deploy a vpn state 2026-10-16 21:26:16 +02:00
evangelostsak 6a6f2f8340 revert(ci): a compose row deploys only its app again 2026-10-16 21:26:16 +02:00
evangelostsak c1e34116fe revert(ci): drop the compose mesh pin validation tests 2026-10-16 21:26:16 +02:00
evangelostsak 9c93e32a73 revert(ci): the axis tests cover the swarm-only vpn axis again 2026-10-16 21:26:16 +02:00
evangelostsak c0cab6ac44 revert(ci): validate no compose mesh pin 2026-10-16 21:26:16 +02:00
evangelostsak 5d7327d911 revert(ci): compose titles carry no mesh glyph and take no mesh pin check 2026-10-16 21:26:16 +02:00
evangelostsak dc84a4c9ac revert(ci): the vpn axis covers swarm rows only again 2026-10-16 21:26:16 +02:00
evangelostsak 1b19fe7df3 docs(requirements): 039 test full meshes on the WireGuard role's own CI row
Compose app rows no longer spend deploy time on WireGuard. The full-mesh
test runs on svc-net-wireguard's own row, the role deploys where its group
puts it, and production keeps WireGuard for every role.
2026-10-16 21:26:16 +02:00
kevinveenbirkenbachandClaude Opus 5.5 d36e203171 fix(cache): render the applications carrier without the caller's application_id
`lookup('tls', ...)` aligns a cross-app domain to the consumer named by
`application_id` (utils/tls_common.py `align_domain_to_consumer`): a
clearnet-primary consumer gets the clearnet sibling of an onion-primary
target. The carrier key does not cover `application_id`, so a park that
renders inside a role hands that role's alignment to every later role
whose key matches.

The constructor and `tasks/utils/setup/role.yml` park at play scope,
where `application_id` is undefined. The re-park in
`roles/sys-token-store/tasks/write.yml` (67f6c8d7e8) and the nested-load
re-park render inside the caller: `svc-prx-openresty` at the preload
loader, `web-app-stalwart` or a provider role on the NFS host, the web
app itself under `sys-stk-front-base`. In a tor deploy that turned onion
targets into clearnet domains for onion-primary roles served from such a
park, and baked the caller's group into Nextcloud's sociallogin
`groupMapping`.

Drop `application_id` from the render's variables and from the
templar's for the duration of the render, so every park carries the
play-scope result the constructor parks have always carried. Rename the
nested re-park task so its log lines do not read as a role boundary.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 21:25:43 +02:00
kevinveenbirkenbachandClaude Opus 5.5 a58abd470c fix(cache): re-park the applications carrier after every nested app load
Job 116975298820 (Nextcloud#5, swarm, arch, btrfs, main 463df06202) hit
its budget (rc=124 after 20136 s). The app phase loads every service as a
nested `tasks/utils/load/app.yml` include under sys-service-loader, so
`tasks/utils/setup/role.yml` parks no carrier between `svc-virt-kata`
(L6073) and `update` (L38213). The only re-park in that stretch is the one
in `roles/sys-token-store/tasks/write.yml`, and Stalwart's user management
reaches it on the manager alone. After its last token write (L23574) the
manager carried the new key while both workers kept the old one and
rendered the full tree on every task: 85 non-wait tasks of 30 s or more, 63 min
from Keycloak (L25641) to the carry past `update` (L38237).

Park the carrier after every nested load on every host of the include.
A re-park whose key still matches serves the carried payload without
rendering.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 20:53:12 +02:00
evangelostsak dc991f97c0 refactor: drop rationale and narration from utils/tests/swarm/write/extras.py 2026-10-16 19:10:01 +02:00
evangelostsak 9b825c7096 refactor: drop rationale and narration from utils/tests/swarm/run.py 2026-10-16 19:10:01 +02:00
evangelostsak 8323786733 refactor: drop rationale and narration from utils/tests/swarm/mesh.py 2026-10-16 19:10:01 +02:00
evangelostsak eea44f1210 refactor: drop rationale and narration from utils/tests/swarm/matrix.py 2026-10-16 19:10:01 +02:00
evangelostsak 50c500eb6d refactor: drop rationale and narration from utils/tests/swarm/extend_inventory.py 2026-10-16 19:10:01 +02:00
evangelostsak 7f5382f3c8 refactor: drop rationale and narration from utils/packages/calls.py 2026-10-16 19:10:01 +02:00
evangelostsak 327ec01bf5 refactor: drop rationale and narration from utils/networks/mesh.py 2026-10-16 19:10:01 +02:00
evangelostsak 0b1bc82d57 refactor: drop rationale and narration from utils/github/variant/vpn.py 2026-10-16 19:10:01 +02:00
evangelostsak f5b2979c45 refactor: drop rationale and narration from utils/github/variant/selection.py 2026-10-16 19:10:01 +02:00
evangelostsak 216f6ea170 refactor: drop rationale and narration from utils/github/variant/label.py 2026-10-16 19:10:01 +02:00
evangelostsak aaecbccf8c refactor: drop rationale and narration from utils/github/variant/axes.py 2026-10-16 19:10:01 +02:00
evangelostsak 779e995bf3 refactor: drop rationale and narration from tests/unit/python/utils/tests/swarm/test_write_extras.py 2026-10-16 19:10:01 +02:00