Make matchers part of the Policy interface (#2514)
* Make matchers part of the Policy interface * Prevent race condition between rules and matchers * Test also matchers in tests for Policy.Filter * Compute `filterChanged` in v2 policy correctly * Fix nil vs. empty list issue in v2 policy test * policy/v2: always clear ssh map Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com> --------- Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com> Co-authored-by: Aras Ergus <aras.ergus@tngtech.com> Co-authored-by: Kristoffer Dalby <kristoffer@tailscale.com>
This commit is contained in:
parent
eb1ecefd9e
commit
4651d06fa8
12 changed files with 89 additions and 43 deletions
|
@ -2,6 +2,7 @@ package v1
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/juanfont/headscale/hscontrol/policy/matcher"
|
||||
"io"
|
||||
"net/netip"
|
||||
"os"
|
||||
|
@ -88,10 +89,10 @@ func (pm *PolicyManager) updateLocked() (bool, error) {
|
|||
return true, nil
|
||||
}
|
||||
|
||||
func (pm *PolicyManager) Filter() []tailcfg.FilterRule {
|
||||
func (pm *PolicyManager) Filter() ([]tailcfg.FilterRule, []matcher.Match) {
|
||||
pm.mu.Lock()
|
||||
defer pm.mu.Unlock()
|
||||
return pm.filter
|
||||
return pm.filter, matcher.MatchesFromFilterRules(pm.filter)
|
||||
}
|
||||
|
||||
func (pm *PolicyManager) SSHPolicy(node *types.Node) (*tailcfg.SSHPolicy, error) {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package v1
|
||||
|
||||
import (
|
||||
"github.com/juanfont/headscale/hscontrol/policy/matcher"
|
||||
"testing"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
|
@ -27,6 +28,7 @@ func TestPolicySetChange(t *testing.T) {
|
|||
wantNodesChange bool
|
||||
wantPolicyChange bool
|
||||
wantFilter []tailcfg.FilterRule
|
||||
wantMatchers []matcher.Match
|
||||
}{
|
||||
{
|
||||
name: "set-nodes",
|
||||
|
@ -42,6 +44,9 @@ func TestPolicySetChange(t *testing.T) {
|
|||
DstPorts: []tailcfg.NetPortRange{{IP: "100.64.0.1/32", Ports: tailcfg.PortRangeAny}},
|
||||
},
|
||||
},
|
||||
wantMatchers: []matcher.Match{
|
||||
matcher.MatchFromStrings([]string{}, []string{"100.64.0.1/32"}),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "set-users",
|
||||
|
@ -52,6 +57,9 @@ func TestPolicySetChange(t *testing.T) {
|
|||
DstPorts: []tailcfg.NetPortRange{{IP: "100.64.0.1/32", Ports: tailcfg.PortRangeAny}},
|
||||
},
|
||||
},
|
||||
wantMatchers: []matcher.Match{
|
||||
matcher.MatchFromStrings([]string{}, []string{"100.64.0.1/32"}),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "set-users-and-node",
|
||||
|
@ -70,6 +78,9 @@ func TestPolicySetChange(t *testing.T) {
|
|||
DstPorts: []tailcfg.NetPortRange{{IP: "100.64.0.1/32", Ports: tailcfg.PortRangeAny}},
|
||||
},
|
||||
},
|
||||
wantMatchers: []matcher.Match{
|
||||
matcher.MatchFromStrings([]string{"100.64.0.2/32"}, []string{"100.64.0.1/32"}),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "set-policy",
|
||||
|
@ -95,6 +106,9 @@ func TestPolicySetChange(t *testing.T) {
|
|||
DstPorts: []tailcfg.NetPortRange{{IP: "100.64.0.62/32", Ports: tailcfg.PortRangeAny}},
|
||||
},
|
||||
},
|
||||
wantMatchers: []matcher.Match{
|
||||
matcher.MatchFromStrings([]string{"100.64.0.61/32"}, []string{"100.64.0.62/32"}),
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -150,8 +164,16 @@ func TestPolicySetChange(t *testing.T) {
|
|||
assert.Equal(t, tt.wantNodesChange, change)
|
||||
}
|
||||
|
||||
if diff := cmp.Diff(tt.wantFilter, pm.Filter()); diff != "" {
|
||||
t.Errorf("TestPolicySetChange() unexpected result (-want +got):\n%s", diff)
|
||||
filter, matchers := pm.Filter()
|
||||
if diff := cmp.Diff(tt.wantFilter, filter); diff != "" {
|
||||
t.Errorf("TestPolicySetChange() unexpected filter (-want +got):\n%s", diff)
|
||||
}
|
||||
if diff := cmp.Diff(
|
||||
tt.wantMatchers,
|
||||
matchers,
|
||||
cmp.AllowUnexported(matcher.Match{}),
|
||||
); diff != "" {
|
||||
t.Errorf("TestPolicySetChange() unexpected matchers (-want +got):\n%s", diff)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue