improvement: don't save tailnet and don't signal change when nothing is updated

This commit is contained in:
Johan Siebens
2024-02-19 10:22:19 +01:00
parent 68127b9a98
commit 1ffafeea79
6 changed files with 63 additions and 14 deletions
+11
View File
@@ -8,6 +8,7 @@ import (
"gorm.io/gorm"
"gorm.io/gorm/schema"
"net/netip"
"reflect"
"slices"
"sort"
"strconv"
@@ -66,6 +67,16 @@ type Grant struct {
App tailcfg.PeerCapMap `json:"app"`
}
func (a *ACLPolicy) Equal(x *ACLPolicy) bool {
if a == nil && x == nil {
return true
}
if (a == nil) != (x == nil) {
return false
}
return reflect.DeepEqual(a, x)
}
func (a ACLPolicy) FindAutoApprovedIPs(routableIPs []netip.Prefix, tags []string, u *User) []netip.Prefix {
if a.AutoApprovers == nil || len(routableIPs) == 0 {
return nil
+17
View File
@@ -6,6 +6,7 @@ import (
"fmt"
"gorm.io/gorm"
"gorm.io/gorm/schema"
"reflect"
)
type DNSConfig struct {
@@ -17,6 +18,22 @@ type DNSConfig struct {
SearchDomains []string `json:"search_domains"`
}
func (i *DNSConfig) Equal(x *DNSConfig) bool {
if i == nil && x == nil {
return true
}
if (i == nil) != (x == nil) {
return false
}
return i.MagicDNS == x.MagicDNS &&
i.HttpsCertsEnabled == x.HttpsCertsEnabled &&
i.OverrideLocalDNS == x.OverrideLocalDNS &&
reflect.DeepEqual(i.Nameservers, x.Nameservers) &&
reflect.DeepEqual(i.Routes, x.Routes) &&
reflect.DeepEqual(i.SearchDomains, x.SearchDomains)
}
func (i *DNSConfig) Scan(destination interface{}) error {
switch value := destination.(type) {
case []byte:
+11
View File
@@ -9,6 +9,7 @@ import (
"github.com/mitchellh/pointerstructure"
"gorm.io/gorm"
"gorm.io/gorm/schema"
"reflect"
)
type Identity struct {
@@ -68,6 +69,16 @@ func (i *IAMPolicy) EvaluatePolicy(identity *Identity) (bool, error) {
return false, nil
}
func (i *IAMPolicy) Equal(x *IAMPolicy) bool {
if i == nil && x == nil {
return true
}
if (i == nil) != (x == nil) {
return false
}
return reflect.DeepEqual(i, x)
}
func (i *IAMPolicy) Scan(destination interface{}) error {
switch value := destination.(type) {
case []byte:
+8 -3
View File
@@ -45,12 +45,17 @@ func (s *Service) SetACLPolicy(ctx context.Context, req *connect.Request[api.Set
return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("tailnet does not exist"))
}
var policy domain.ACLPolicy
if err := mapping.CopyViaJson(req.Msg.Policy, &policy); err != nil {
oldPolicy := tailnet.ACLPolicy
var newPolicy domain.ACLPolicy
if err := mapping.CopyViaJson(req.Msg.Policy, &newPolicy); err != nil {
return nil, logError(err)
}
tailnet.ACLPolicy = policy
if oldPolicy.Equal(&newPolicy) {
return connect.NewResponse(&api.SetACLPolicyResponse{}), nil
}
tailnet.ACLPolicy = newPolicy
if err := s.repository.SaveTailnet(ctx, tailnet); err != nil {
return nil, logError(err)
}
+8 -10
View File
@@ -54,23 +54,21 @@ func (s *Service) SetDNSConfig(ctx context.Context, req *connect.Request[api.Set
return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("tailnet not found"))
}
tailnet.DNSConfig = apiDNSConfigToDomainDNSConfig(req.Msg.Config)
oldConfig := tailnet.DNSConfig
newConfig := apiDNSConfigToDomainDNSConfig(req.Msg.Config)
if oldConfig.Equal(&newConfig) {
return connect.NewResponse(&api.SetDNSConfigResponse{Config: domainDNSConfigToApiDNSConfig(tailnet)}), nil
}
tailnet.DNSConfig = newConfig
if err := s.repository.SaveTailnet(ctx, tailnet); err != nil {
return nil, logError(err)
}
s.sessionManager.NotifyAll(tailnet.ID)
resp := &api.SetDNSConfigResponse{
Config: domainDNSConfigToApiDNSConfig(tailnet),
}
if dnsConfig.HttpsCerts && s.dnsProvider == nil {
resp.Message = "# HTTPS Certs cannot be enabled because a DNS provider is not properly configured"
}
return connect.NewResponse(resp), nil
return connect.NewResponse(&api.SetDNSConfigResponse{Config: domainDNSConfigToApiDNSConfig(tailnet)}), nil
}
func domainRoutesToApiRoutes(routes map[string][]string) map[string]*api.Routes {
+8 -1
View File
@@ -50,13 +50,20 @@ func (s *Service) SetIAMPolicy(ctx context.Context, req *connect.Request[api.Set
return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("invalid iam policy: %w", err))
}
tailnet.IAMPolicy = domain.IAMPolicy{
oldPolicy := tailnet.IAMPolicy
newPolicy := domain.IAMPolicy{
Subs: req.Msg.Policy.Subs,
Emails: req.Msg.Policy.Emails,
Filters: req.Msg.Policy.Filters,
Roles: apiRolesMapToDomainRolesMap(req.Msg.Policy.Roles),
}
if oldPolicy.Equal(&newPolicy) {
return connect.NewResponse(&api.SetIAMPolicyResponse{}), nil
}
tailnet.IAMPolicy = newPolicy
if err := s.repository.SaveTailnet(ctx, tailnet); err != nil {
return nil, logError(err)
}