mirror of
https://github.com/juanfont/headscale.git
synced 2026-09-13 03:52:02 +09:00
a518a5076a
Per-node SetApprovedRoutes made each policy reload O(m*n^2).
43 lines
1.3 KiB
Go
43 lines
1.3 KiB
Go
package state
|
|
|
|
import (
|
|
"net/netip"
|
|
"testing"
|
|
|
|
"github.com/juanfont/headscale/hscontrol/types"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"tailscale.com/tailcfg"
|
|
)
|
|
|
|
// TestAutoApproveBatchApprovesRoutes verifies the batched autoApproveNodes still
|
|
// approves a node's advertised route when policy auto-approvers permit it. The
|
|
// batching collapses the per-node SetApprovedRoutes calls into one NodeStore
|
|
// update and one policy rebuild; this guards that correctness is preserved.
|
|
func TestAutoApproveBatchApprovesRoutes(t *testing.T) {
|
|
_, s, nodeID := persistTestSetup(t)
|
|
t.Cleanup(func() { _ = s.Close() })
|
|
|
|
route := netip.MustParsePrefix("10.0.0.0/24")
|
|
|
|
_, ok := s.nodeStore.UpdateNode(nodeID, func(n *types.Node) {
|
|
n.Hostinfo = &tailcfg.Hostinfo{RoutableIPs: []netip.Prefix{route}}
|
|
})
|
|
require.True(t, ok)
|
|
|
|
pol := `{
|
|
"autoApprovers": {"routes": {"10.0.0.0/24": ["persist-user@"]}},
|
|
"acls": [{"action": "accept", "src": ["*"], "dst": ["*:*"]}]
|
|
}`
|
|
_, err := s.SetPolicy([]byte(pol))
|
|
require.NoError(t, err)
|
|
|
|
_, err = s.ReloadPolicy()
|
|
require.NoError(t, err)
|
|
|
|
nv, ok := s.GetNodeByID(nodeID)
|
|
require.True(t, ok)
|
|
assert.Contains(t, nv.ApprovedRoutes().AsSlice(), route,
|
|
"auto-approver should have approved the advertised route")
|
|
}
|