headscale/hscontrol/policy/v2
Kristoffer Dalby 078b9e308f policy/v2: SaaS-derived compat tests for nodeAttrs
Adds a data-driven test that loads testdata/nodeattrs_results/*.hujson
and diffs the captured SaaS-rendered netmaps against headscale's
compileNodeAttrs output. Each capture is one scenario the SaaS
control plane has rendered against the same policy headscale is asked
to compile -- the test enforces shape parity per node.

tailnet_state_caps.go enumerates the caps SaaS emits where headscale
has no equivalent concept yet (user-role admin/owner, tailnet lock,
services host, app connectors, internal magicsock and SSH tuning,
tailnet-state metadata) plus the always-on baseline (admin, ssh,
file-sharing) and the taildrive pair. stripUnmodelledTailnetStateCaps
filters both sides of cmp.Diff so the comparison focuses on the
policy-driven caps. PeerCapMap encodes which caps the Tailscale
client reads from the peer view (suggest-exit-node when exit routes
are approved, etc.) for use by the mapper.

testcapture switches to typed tailcfg/netmap/filtertype/apitype
values so schema drift between the capture tool and headscale
becomes a compile error rather than a silent test failure. Existing
compat suites (acl, grants, routes, ssh, issue_3212) move to the
typed shape.

The 53 SelfNode netmap captures and the 7 anonymizer-corrupted
suggest-charmander -> suggest-exit-node restorations in
routes_results / issue_3212 ride along.
2026-05-13 14:22:30 +02:00
..
testdata policy/v2: SaaS-derived compat tests for nodeAttrs 2026-05-13 14:22:30 +02:00
compiled.go policy/v2: parse, validate, and compile nodeAttrs 2026-05-13 14:22:30 +02:00
filter.go policy: surface exit nodes via autogroup:internet (#3212) 2026-04-29 11:24:33 +01:00
filter_test.go policy/v2: surface autogroup:internet via grants on exit nodes 2026-04-30 19:22:45 +01:00
issue_3212_test.go policy/v2: SaaS-derived compat tests for nodeAttrs 2026-05-13 14:22:30 +02:00
issue_3233_test.go policy/v2: surface autogroup:internet via grants on exit nodes 2026-04-30 19:22:45 +01:00
main_test.go all: fix test flakiness and improve test infrastructure 2026-03-14 02:52:28 -07:00
nodeattrs_test.go policy/v2: parse, validate, and compile nodeAttrs 2026-05-13 14:22:30 +02:00
policy.go policy/v2: parse, validate, and compile nodeAttrs 2026-05-13 14:22:30 +02:00
policy_test.go policy/v2: SaaS-derived compat tests for nodeAttrs 2026-05-13 14:22:30 +02:00
policytester_compat_test.go policy/v2: match default proto set for tests with no proto 2026-05-12 11:54:54 +01:00
tailnet_state_caps.go policy/v2: SaaS-derived compat tests for nodeAttrs 2026-05-13 14:22:30 +02:00
tailscale_acl_data_compat_test.go policy/v2: SaaS-derived compat tests for nodeAttrs 2026-05-13 14:22:30 +02:00
tailscale_grants_compat_test.go policy/v2: SaaS-derived compat tests for nodeAttrs 2026-05-13 14:22:30 +02:00
tailscale_nodeattrs_compat_test.go policy/v2: SaaS-derived compat tests for nodeAttrs 2026-05-13 14:22:30 +02:00
tailscale_routes_data_compat_test.go policy/v2: SaaS-derived compat tests for nodeAttrs 2026-05-13 14:22:30 +02:00
tailscale_ssh_data_compat_test.go policy/v2: SaaS-derived compat tests for nodeAttrs 2026-05-13 14:22:30 +02:00
test.go policy/v2: match default proto set for tests with no proto 2026-05-12 11:54:54 +01:00
test_test.go policy/v2: match default proto set for tests with no proto 2026-05-12 11:54:54 +01:00
types.go policy/v2: parse, validate, and compile nodeAttrs 2026-05-13 14:22:30 +02:00
types_test.go policy/v2: canonicalize Protocol form during unmarshal 2026-05-12 11:54:54 +01:00
utils.go policy/v2: exclude exit routes from ReduceFilterRules 2026-04-01 14:10:42 +01:00
utils_test.go policy/v2: exclude exit routes from ReduceFilterRules 2026-04-01 14:10:42 +01:00