headscale/hscontrol
Kristoffer Dalby e2f2f9211f state, servertest: property-test HA election + invariant catalogue
Expand TestPrimaryRoutesProperty (5 -> 9 ops). New ops mirror the
production shapes the failure cases hit: BatchProbeResults via
UpdateNodes, SimultaneousDisconnect via UpdateNodes, SetApprovedRoutes
that leaves announced RoutableIPs intact, OfflineExpiry that keeps
Unhealthy set. The model now tracks announced and approved separately
and recomputes the intersection.

Strengthen the per-op assertions to cover invariants the model alone
cannot prove: every primary must be online, every primary must
currently advertise its prefix, no flap onto an unhealthy candidate
when a healthy one was available, no flap off a previous primary that
remains a healthy candidate. The check now takes a pre-op snapshot so
the anti-flap rule has a stable reference.

Add TestHAProberProperty in servertest. It drives a real TestServer
with three HA-route-advertising clients through rapid-drawn sequences
of ClientDisconnect / ClientReconnect / ProberTick / WaitForSnapshot
ops and re-checks the same shape invariants after every step.

Document the system in hscontrol/state/HA_INVARIANTS.md: a state
machine over (Healthy+Online, Unhealthy+Online, Offline,
OfflineExpired), fifteen numbered invariants with predicates and
violation paths, and a coverage matrix mapping each invariant to its
unit, servertest, and integration tests. Three rows pin the recent
fixes to the invariants they enforce.
2026-05-18 17:18:08 +02:00
..
assets assets: fix logo alignment and error icon centering 2026-04-13 17:23:47 +01:00
capver capver: regenerate for tailscale v1.96 2026-04-08 13:00:22 +01:00
db db: remove unused SetApprovedRoutes and SetTags helpers 2026-05-15 11:21:58 +02:00
derp all: fix golangci-lint issues (#3064) 2026-02-06 21:45:32 +01:00
dns Fix typo in comment about fsnotify behavior 2026-02-27 15:23:06 +01:00
mapper mapper, app: ship MagicDNS Routes as empty slices, not nil 2026-05-18 17:18:08 +02:00
policy policy/v2: add SaaS goldens for via-grant prefix containment 2026-05-18 14:02:00 +02:00
servertest state, servertest: property-test HA election + invariant catalogue 2026-05-18 17:18:08 +02:00
state state, servertest: property-test HA election + invariant catalogue 2026-05-18 17:18:08 +02:00
templates all: rephrase prose to fit codebase voice 2026-04-29 16:22:19 +01:00
types hscontrol: gate proxy header trust on trusted_proxies 2026-05-18 17:17:55 +02:00
util hscontrol: route hostname handling through dnsname and NodeStore 2026-04-18 15:12:21 +01:00
app.go mapper, app: ship MagicDNS Routes as empty slices, not nil 2026-05-18 17:18:08 +02:00
app_test.go app: add security headers middleware 2026-04-17 16:31:49 +01:00
auth.go hscontrol: preserve nil expiry on tailscaled restart 2026-05-13 17:06:16 +02:00
auth_tags_test.go hscontrol: preserve nil expiry on tailscaled restart 2026-05-13 17:06:16 +02:00
auth_test.go state: avoid nil deref in registration handlers when old user is missing 2026-05-06 07:23:02 +01:00
debug.go debug: explain URLIsNoise choice in ping callback 2026-04-17 16:31:49 +01:00
grpcv1.go policy/v2: evaluate the tests block on user-initiated writes 2026-05-12 11:54:54 +01:00
grpcv1_test.go all: rephrase prose to fit codebase voice 2026-04-29 16:22:19 +01:00
handlers.go oidc: render HTML error pages for browser-facing failures 2026-04-13 17:23:47 +01:00
handlers_test.go oidc: render HTML error pages for browser-facing failures 2026-04-13 17:23:47 +01:00
metrics.go all: fix golangci-lint issues (#3064) 2026-02-06 21:45:32 +01:00
noise.go hscontrol: gate proxy header trust on trusted_proxies 2026-05-18 17:17:55 +02:00
noise_test.go policy/v2: align SSH check action with SaaS wire format 2026-04-17 16:31:49 +01:00
oidc.go oidc: render HTML error pages for browser-facing failures 2026-04-13 17:23:47 +01:00
oidc_confirm_test.go oidc: add confirmation page for node registration 2026-04-10 14:09:57 +01:00
oidc_template_test.go oidc: render HTML error pages for browser-facing failures 2026-04-13 17:23:47 +01:00
oidc_test.go oidc: make email verification configurable 2025-12-18 11:42:32 +00:00
platform_config.go all: fix golangci-lint issues (#3064) 2026-02-06 21:45:32 +01:00
poll.go types: add node.expiry config, deprecate oidc.expiry 2026-04-08 13:00:22 +01:00
poll_test.go poll: fix poll test linter violations 2026-03-12 01:27:34 -07:00
realip.go hscontrol: gate proxy header trust on trusted_proxies 2026-05-18 17:17:55 +02:00
realip_test.go hscontrol: gate proxy header trust on trusted_proxies 2026-05-18 17:17:55 +02:00
tailsql.go all: fix golangci-lint issues (#3064) 2026-02-06 21:45:32 +01:00
templates_consistency_test.go Update links to Tailscale documentation 2026-04-18 09:33:41 +02:00