Commit Graph
132 Commits
Author SHA1 Message Date
kevinveenbirkenbach e1d7e32889 Release version 16.1.0 2026-10-19 16:20:32 +02:00
kevinveenbirkenbach 7075aad420 Merge pull request #1003 from evangelostsak/fix/svc-net-wireguard/split-cli-test
refactor(svc-net-wireguard): split the CLI test into files
2026-10-19 10:10:43 +02:00
kevinveenbirkenbachandClaude Opus 5.5 6405952320 docs(wireguard): regenerate the Cosmos diagram
The README merged with #323 lists svc-swarm-node as a 1:1 dependent, but
no role on main references svc-net-wireguard. make docs regenerates the
Cosmos block from the actual dependency graph and drops the edge.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-18 21:32:05 +02:00
kevinveenbirkenbachandClaude Opus 5.5 da690a0706 style(yaml): apply ansible-lint 26.10.1 autofix
A freshly built dev container installs ansible-lint unpinned (26.10.1,
yamllint 1.38.0), and its --fix pass in make autoformat now drops the
trailing blank line of meta/packages.yml and
roles/sys-svc-container/meta/packages.yml and adds the missing document
start to roles/svc-net-wireguard/files/test/compose.yml (from #323).
Parsed YAML is unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-18 21:32:04 +02:00
evangelostsak c2eb54c39c refactor(wireguard): reduce test.sh to the flow and its expectations 2026-10-18 20:36:26 +02:00
evangelostsak fab8acbe91 test(wireguard): move the assertions into lib/checks.sh 2026-10-18 20:36:25 +02:00
evangelostsak 8da00a7a26 test(wireguard): move the mesh probes into lib/probes.sh 2026-10-18 20:36:25 +02:00
evangelostsak f026439ef1 test(wireguard): move the test hosts' lifecycle into lib/hosts.sh 2026-10-18 20:36:25 +02:00
evangelostsak 70ffeeb09b test(wireguard): read mesh addresses and SSH options for the CLI test 2026-10-18 20:36:25 +02:00
evangelostsak 36d0806afc test(wireguard): write the CLI test's inventory from the layout 2026-10-18 20:36:25 +02:00
evangelostsak a21fa60512 test(wireguard): declare the CLI test's meshes and memberships as data 2026-10-18 20:36:25 +02:00
evangelostsak ec9695ee88 test(wireguard): drop HOST_IMAGE from the CLI test env 2026-10-18 13:56:07 +02:00
evangelostsak fc4a2da70e test(wireguard): start and remove the test hosts through compose 2026-10-18 13:56:07 +02:00
evangelostsak 5bcbc14545 test(wireguard): declare the CLI test's three hosts in a compose file 2026-10-18 13:56:07 +02:00
evangelostsak 96fa1f43aa refactor(wireguard): leave group membership to the callers 2026-10-18 13:56:06 +02:00
evangelostsak 9eed8525e8 fix(wireguard): enable the service everywhere and drop the test image entry 2026-10-18 13:56:06 +02:00
evangelostsak 24a07325f8 test(wireguard): run the mesh playbook from playbooks/ 2026-10-18 01:01:09 +02:00
evangelostsak aea4373486 refactor(wireguard): create the administrator the mesh transport logs in as 2026-10-18 01:01:08 +02:00
evangelostsak 77e6588b36 refactor(wireguard): gate the core and the skip on the named compose case 2026-10-18 01:01:08 +02:00
evangelostsak a009f64b15 refactor(wireguard): name the compose host the mesh CLI gave no mesh 2026-10-18 01:01:08 +02:00
evangelostsak ebb6561972 test(wireguard): read the host image from the role's test service 2026-10-18 01:01:08 +02:00
evangelostsak 5ccf9551da feat(wireguard): declare the CLI test's host image and move the role to beta 2026-10-18 01:01:08 +02:00
evangelostsak 6e28039782 docs(wireguard): the role acts on every host in its group 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 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 3af32502af refactor: drop rationale and narration from roles/svc-net-wireguard/tasks/00_core.yml 2026-10-16 19:10:01 +02:00
evangelostsak 64cacad4b9 refactor: drop rationale and narration from roles/svc-net-wireguard/meta/secrets.yml 2026-10-16 19:10:01 +02:00
evangelostsak fb24984ade refactor: drop rationale and narration from roles/svc-net-wireguard/files/test/test.sh 2026-10-16 19:10:00 +02:00
evangelostsak 6e8fbd9c25 test(wireguard): size the bulk probe and bound the SSH connect time 2026-10-16 13:55:11 +02:00
evangelostsak a709d237c5 test(wireguard): probe the meshes with SSH, bulk data and the cryptokey table
A ping proved the tunnels answer, not that a session lands on the right host
or that full-size TCP segments cross them. Each pair sharing a mesh now also
opens an SSH session to the peer's mesh address and must land on that peer,
then pulls 8 MiB through it and compares the checksum with the one taken at
the source. Each pair that shares no mesh must fail the SSH connection itself,
never on authentication, since every host trusts every other host's key.
WireGuard must refuse a packet forced into a mesh that holds no peer for it
(Required key not available), so the isolation is shown to come from the
cryptokey table rather than from a missing route. The two hosts must still
reach each other on the underlay, so the isolation is the mesh's doing.

The SSH options are the platform's own, mesh_ssh_args over the repository's
ssh_args, the ones the swarm transport switches Ansible onto; the addresses
come from mesh_address. Every probe runs through one check helper, so a probe
is a predicate rather than another copy of the pass and fail bookkeeping.

Verified in the dev stack: all 20 checks passed, and a mutant that inverted
every expectation (unreachable pairs, a wrong identity, a different file, a
denied key, the peer's own address forced through the cryptokey check) failed
all 9 of its checks.
2026-10-16 13:55:11 +02:00
evangelostsak 93adab0f47 fix(wireguard): the CLI test runs on the controller only
It builds three hosts from the repository the deploy runs from, which only
the controller holds. A swarm node, and the lab's backup host deployed in
its own compose play, no longer run it.
2026-10-16 13:55:11 +02:00
evangelostsak 5de5a82498 test(wireguard): give the CLI test a 30 minute budget 2026-10-16 03:40:16 +02:00
evangelostsak 17689d6905 test(wireguard): hand the CLI test its image, interpreter, repository and carrier role
The image is the same pinned debian:13.7-slim svc-net-tor and svc-db-openldap
build from. The interpreter is the controller's, which carries the mesh CLI's
dependencies; the managed /usr/local/bin/python3 does not.
2026-10-16 03:40:16 +02:00
evangelostsak a9e7271b9e test(wireguard): three throwaway hosts in two full meshes
Starts three bare Debian hosts from one inventory, puts host II into both
meshes through a role's networks.meshes, writes the mesh with the CLI, deploys
playbook-mesh.yml onto them, which installs WireGuard there, and asserts that
I and II reach each other, that II and III reach each other, and that I and
III do not.

Verified in a local compose deploy of svc-db-redis with svc-net-wireguard:
all six reachability assertions passed and every throwaway host ended with
failed=0.
2026-10-16 03:40:16 +02:00
evangelostsak e7b328cd1b test(wireguard): keep the CLI test harness at the path test-e2e-cli stages 2026-10-16 03:40:16 +02:00
evangelostsak 9d85295b10 docs(wireguard): Compose hosts join full meshes 2026-10-16 03:40:16 +02:00
evangelostsak 54dfa643d4 docs(wireguard): describe the full meshes between Compose hosts 2026-10-16 03:40:16 +02:00
evangelostsak a719eb86d9 fix(wireguard): the missing-mesh failure no longer assumes a swarm deploy 2026-10-16 03:40:16 +02:00
evangelostsak d4056891c0 fix(wireguard): name the gate after the peers it waits for, not the hub 2026-10-16 03:40:15 +02:00
evangelostsak 8f105bae6a feat(wireguard): gate and size the tunnel against every dialled peer
The handshake gate already waits on every peer a non-hub interface holds.
The MTU probe and the path MTU targets now follow the dialled peers too, which
for a spoke is still its hub and in a full mesh is every peer.
2026-10-16 03:40:15 +02:00
evangelostsak 13f627ba23 feat(wireguard): every member of a full mesh listens and dials its peers
The hub listens and a spoke dials its hub, as before. In a full mesh every
member listens on the mesh port and keeps every peer alive.
2026-10-16 03:40:15 +02:00
evangelostsak 7ebba332a7 feat(wireguard): expose the dialled peers and the listen flag as filters 2026-10-16 03:40:15 +02:00
evangelostsak 7e8457f84c docs(wireguard): the role acts outside swarm on a host given a mesh 2026-10-16 01:43:33 +02:00
evangelostsak 227dec8941 docs(wireguard): the meshes are inventory values every role ships empty 2026-10-14 15:03:41 +02:00
evangelostsak 44c82ea547 refactor(wireguard): render the interfaces the inventory lists
The role reads networks.interfaces and keeps the map keyed by mesh name its
tasks and template already use.
2026-10-14 15:03:40 +02:00
evangelostsak 7aea11f964 feat(wireguard): declare the mesh fields, empty
networks.meshes is where a deployment declares its meshes and
networks.interfaces where the mesh CLI records each host's own. Both ship
empty: the platform declares no mesh.
2026-10-14 15:03:40 +02:00
evangelostsak bf9dc12ac7 refactor(wireguard): remove the generated mesh contract
It was rewritten from whatever declarations a run used, so a local run left
the working tree dirty.
2026-10-14 15:03:40 +02:00
evangelostsak 1f48a6e8cd docs(wireguard): describe declared meshes instead of two fixed ones
The overview and features named the swarm and data meshes as if the role
shipped them, and the administration command lacked the required
--group-vars-file.
2026-10-14 11:23:23 +02:00
evangelostsak da35a34bba chore(wireguard): regenerate the contract with the primary flag 2026-10-14 11:23:22 +02:00
evangelostsak d04144eaa5 docs(svc-net-wireguard): drop the contract header
The file is the contract. Why a validator wants one is not the
contract's business.
2026-10-05 12:43:23 +02:00