mirror of
https://github.com/jsiebens/ionscale.git
synced 2026-03-31 15:07:49 +01:00
improvement: don't save tailnet and don't signal change when nothing is updated
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user