0117 review: seat table row + decision cited, networkd/dhcpcd lines match the modules, block placement, dispatcher scope, references

This commit is contained in:
jochen
2026-09-27 00:03:15 +02:00
parent 0e066473b3
commit c3313f6e17
2 changed files with 29 additions and 12 deletions
@@ -34,9 +34,9 @@ by accident:
- **The private network's interface is exposed to the manager.** A manager that considers - **The private network's interface is exposed to the manager.** A manager that considers
every interface its own may try to configure `mesh0`, or tear it down on a profile change. every interface its own may try to configure `mesh0`, or tear it down on a profile change.
Nothing tells it not to. Nothing tells it not to.
- **Two managers on one machine go unnoticed.** Of the four machines adopted so far, one runs - **Two managers on one machine go unnoticed.** Among the machines adopted so far, one runs
systemd-networkd, two run NetworkManager, and one runs NetworkManager *and* dhcpcd at once: NetworkManager *and* dhcpcd at once: two programs that each believe they own the machine's
two programs that each believe they own the machine's addresses and its resolver file. addresses and its resolver file.
Nothing detected it, because nothing in the mesh knows the role exists. Nothing detected it, because nothing in the mesh knows the role exists.
The machines differ in a way that matters: servers are wired and never move, while The machines differ in a way that matters: servers are wired and never move, while
@@ -72,13 +72,16 @@ other:
- the manager's package, and its service running and enabled at boot; - the manager's package, and its service running and enabled at boot;
- the manager's own configuration that leaves the resolver file to the mesh (`dns=none` for - the manager's own configuration that leaves the resolver file to the mesh (`dns=none` for
NetworkManager, `nohook resolv.conf` for dhcpcd, and for systemd-networkd the equivalent NetworkManager, `nohook resolv.conf` for dhcpcd, and nothing for systemd-networkd, which
that stops it handing DNS to a resolver the machine does not use); never writes the resolver file);
- the manager's own configuration that leaves the private network's interface alone - the manager's own configuration that leaves the private network's interface alone
(NetworkManager's `unmanaged-devices` naming `mesh0`; for systemd-networkd, no network file (NetworkManager's `unmanaged-devices` naming `mesh0`; dhcpcd's `denyinterfaces mesh0`; for
of the module's matches it); systemd-networkd a network file of the module's matching `mesh0` as `Unmanaged=yes`);
- each as a drop-in beside the manager's main file where the manager reads one, and written - each as a drop-in beside the manager's main file where the manager reads one, and written
*into* a shared file otherwise ([ADR 0102](0102-the-mesh-writes-into-a-shared-file-never-over-it.md)); *into* a shared file otherwise, as a marked region the host owns
([ADR 0102](0102-the-mesh-writes-into-a-shared-file-never-over-it.md)'s idea for text files),
placed where the manager reads it as global — at the start of `dhcpcd.conf`, above any
`interface` line, because every line after one belongs to that interface;
- the service **reloaded** when a drop-in changes, never restarted — a restart drops the link, - the service **reloaded** when a drop-in changes, never restarted — a restart drops the link,
and the link is the mesh's own channel to the machine. **A manager that cannot reload is not and the link is the mesh's own channel to the machine. **A manager that cannot reload is not
restarted instead:** its setting takes effect at the manager's next start. Measured on the restarted instead:** its setting takes effect at the manager's next start. Measured on the
@@ -102,11 +105,23 @@ them, and the module's `access`, if it needs one, is read-only.
replaced under another name. replaced under another name.
- A machine running two managers is found at assignment: the second holder is refused, and the - A machine running two managers is found at assignment: the second holder is refused, and the
operator decides which manager the machine keeps before either module is taken. operator decides which manager the machine keeps before either module is taken.
- Workstations keep joining networks the way they always have. The host already cooperates - Workstations keep joining networks the way they always have. Under NetworkManager and
with the manager — its dispatcher hook wakes it on every connectivity change — and nothing systemd-networkd the host already cooperates with the manager — its dispatcher hook wakes it
here changes that. on every connectivity change — and nothing here changes that. A dhcpcd-only machine has no
such hook, and nothing here adds one.
- The seat table gains one entry: `the-uplink`, node scope, delivering nothing, decided here. - The seat table gains one entry: `the-uplink`, node scope, delivering nothing, decided here.
- **Not decided here:** whether the mesh should ever *offer* known networks to a machine — a - **Not decided here:** whether the mesh should ever *offer* known networks to a machine — a
sealed, add-only list the operator curates once for all workstations. That is a different sealed, add-only list the operator curates once for all workstations. That is a different
question (the mesh holding credentials for links it must never be able to break) and gets its question (the mesh holding credentials for links it must never be able to break) and gets its
own record if it is wanted. own record if it is wanted.
## References
- [ADR 0110](0110-a-seat-is-a-module-assignment-from-a-closed-set.md): the closed set this seat joins;
[to-be 26](../03-DESIGN/01-to-be/26-the-seats.md): the seat table
- [ADR 0102](0102-the-mesh-writes-into-a-shared-file-never-over-it.md): written into, never over
- [ADR 0051](0051-shared-data-is-the-operators.md): what is the operator's stays the operator's
- mesh-controller `internal/catalogue/seats.go` (the seat), `internal/overlay/generator.go` (the
mesh installs on top of the machine's own networking)
- mesh-catalog `modules/networkmanager`, `modules/systemd-networkd`, `modules/dhcpcd`
- mesh-host `internal/apply/block.go` (a file written into a marked region, `at` start or end)
+3 -1
View File
@@ -8,11 +8,12 @@ code:
- mesh-controller cmd/mesh-controller/source.go - mesh-controller cmd/mesh-controller/source.go
- mesh-controller internal/inventory/migrations/0032-a-source-may-live-on-a-seat.sql - mesh-controller internal/inventory/migrations/0032-a-source-may-live-on-a-seat.sql
- mesh-catalog modules/gitea/module.json - mesh-catalog modules/gitea/module.json
updated: 2026-09-26 updated: 2026-09-27
decisions: decisions:
- 02-DECISIONS/0110-a-seat-is-a-module-assignment-from-a-closed-set.md - 02-DECISIONS/0110-a-seat-is-a-module-assignment-from-a-closed-set.md
- 02-DECISIONS/0111-a-build-source-is-on-the-git-seat-or-external.md - 02-DECISIONS/0111-a-build-source-is-on-the-git-seat-or-external.md
- 02-DECISIONS/0109-a-package-registry-seat-is-one-per-ecosystem.md - 02-DECISIONS/0109-a-package-registry-seat-is-one-per-ecosystem.md
- 02-DECISIONS/0117-a-machines-uplink-is-a-seat.md
--- ---
# 26 — The seats # 26 — The seats
@@ -64,6 +65,7 @@ nobody argued for is an entry nobody can explain.
| `the-private-network` | node | — | the private network the mesh runs over | | `the-private-network` | node | — | the private network the mesh runs over |
| `the-resolver-configuration` | node | — | whichever of the alternative resolver configurations is chosen | | `the-resolver-configuration` | node | — | whichever of the alternative resolver configurations is chosen |
| `the-showcase` | node | — | the showcase module | | `the-showcase` | node | — | the showcase module |
| `the-uplink` | node | — | the program that manages the machine's own network ([ADR 0117](../../02-DECISIONS/0117-a-machines-uplink-is-a-seat.md)) |
The controller holds this set in code, and a test asserts both its size and that every entry names The controller holds this set in code, and a test asserts both its size and that every entry names
the record that made it a seat. **This table and [ADR 0110](../../02-DECISIONS/0110-a-seat-is-a-module-assignment-from-a-closed-set.md) the record that made it a seat. **This table and [ADR 0110](../../02-DECISIONS/0110-a-seat-is-a-module-assignment-from-a-closed-set.md)