all: adopt maps and cmp helpers

This commit is contained in:
Kristoffer Dalby 2026-06-16 08:30:16 +00:00
parent ac725f27e4
commit 27468f944b
7 changed files with 28 additions and 69 deletions

View file

@ -36,9 +36,7 @@ func usernameAndIDFromFlag(cmd *cobra.Command) (uint64, string, error) {
// Normalise unset/negative identifiers to 0 so the uint64 // Normalise unset/negative identifiers to 0 so the uint64
// conversion does not produce a bogus large value. // conversion does not produce a bogus large value.
if identifier < 0 { identifier = max(identifier, 0)
identifier = 0
}
return uint64(identifier), username, nil //nolint:gosec // identifier is clamped to >= 0 above return uint64(identifier), username, nil //nolint:gosec // identifier is clamped to >= 0 above
} }

View file

@ -4,6 +4,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"io/fs" "io/fs"
"maps"
"net/url" "net/url"
"os" "os"
"path" "path"
@ -70,7 +71,6 @@ func generateUserProfiles(
peers views.Slice[types.NodeView], peers views.Slice[types.NodeView],
) []tailcfg.UserProfile { ) []tailcfg.UserProfile {
userMap := make(map[uint]*types.UserView) userMap := make(map[uint]*types.UserView)
ids := make([]uint, 0, len(userMap))
user := node.Owner() user := node.Owner()
if !user.Valid() { if !user.Valid() {
@ -81,9 +81,7 @@ func generateUserProfiles(
return nil return nil
} }
userID := user.Model().ID userMap[user.Model().ID] = &user
userMap[userID] = &user
ids = append(ids, userID)
for _, peer := range peers.All() { for _, peer := range peers.All() {
peerUser := peer.Owner() peerUser := peer.Owner()
@ -91,20 +89,13 @@ func generateUserProfiles(
continue continue
} }
peerUserID := peerUser.Model().ID userMap[peerUser.Model().ID] = &peerUser
userMap[peerUserID] = &peerUser
ids = append(ids, peerUserID)
} }
slices.Sort(ids)
ids = slices.Compact(ids)
var profiles []tailcfg.UserProfile var profiles []tailcfg.UserProfile
for _, id := range ids { for _, id := range slices.Sorted(maps.Keys(userMap)) {
if userMap[id] != nil { profiles = append(profiles, userMap[id].TailscaleUserProfile())
profiles = append(profiles, userMap[id].TailscaleUserProfile())
}
} }
return profiles return profiles

View file

@ -13,6 +13,7 @@ package v2
// one exists. // one exists.
import ( import (
"maps"
"slices" "slices"
"strings" "strings"
@ -170,15 +171,10 @@ func stripUnmodelledTailnetStateCaps(cm tailcfg.NodeCapMap) tailcfg.NodeCapMap {
return nil return nil
} }
out := make(tailcfg.NodeCapMap, len(cm)) out := maps.Clone(cm)
maps.DeleteFunc(out, func(k tailcfg.NodeCapability, _ []tailcfg.RawMessage) bool {
for k, v := range cm { return isUnmodelledTailnetStateCap(k)
if isUnmodelledTailnetStateCap(k) { })
continue
}
out[k] = v
}
if len(out) == 0 { if len(out) == 0 {
return nil return nil

View file

@ -1300,10 +1300,8 @@ func (g *Groups) Contains(group *Group) error {
return nil return nil
} }
for defined := range map[Group]Usernames(*g) { if _, ok := (*g)[*group]; ok {
if defined == *group { return nil
return nil
}
} }
return fmt.Errorf("%w: %q", ErrGroupNotDefined, group) return fmt.Errorf("%w: %q", ErrGroupNotDefined, group)
@ -1483,10 +1481,8 @@ func (to TagOwners) Contains(tagOwner *Tag) error {
return nil return nil
} }
for defined := range map[Tag]Owners(to) { if _, ok := to[*tagOwner]; ok {
if defined == *tagOwner { return nil
return nil
}
} }
return fmt.Errorf("%w: %q", ErrTagNotDefined, tagOwner) return fmt.Errorf("%w: %q", ErrTagNotDefined, tagOwner)

View file

@ -208,10 +208,7 @@ func (s *State) lockRegistration(machineKey key.MachinePublic) func() {
// NewState creates and initializes a new [State] instance, setting up the database, // NewState creates and initializes a new [State] instance, setting up the database,
// IP allocator, DERP map, policy manager, and loading existing users and nodes. // IP allocator, DERP map, policy manager, and loading existing users and nodes.
func NewState(cfg *types.Config) (*State, error) { func NewState(cfg *types.Config) (*State, error) {
cacheExpiration := registerCacheExpiration cacheExpiration := cmp.Or(cfg.Tuning.RegisterCacheExpiration, registerCacheExpiration)
if cfg.Tuning.RegisterCacheExpiration != 0 {
cacheExpiration = cfg.Tuning.RegisterCacheExpiration
}
cacheMaxEntries := defaultRegisterCacheMaxEntries cacheMaxEntries := defaultRegisterCacheMaxEntries
if cfg.Tuning.RegisterCacheMaxEntries > 0 { if cfg.Tuning.RegisterCacheMaxEntries > 0 {
@ -264,15 +261,9 @@ func NewState(cfg *types.Config) (*State, error) {
// Apply defaults for [NodeStore] batch configuration if not set. // Apply defaults for [NodeStore] batch configuration if not set.
// This ensures tests that create Config directly (without viper) still work. // This ensures tests that create Config directly (without viper) still work.
batchSize := cfg.Tuning.NodeStoreBatchSize batchSize := cmp.Or(cfg.Tuning.NodeStoreBatchSize, defaultNodeStoreBatchSize)
if batchSize == 0 {
batchSize = defaultNodeStoreBatchSize
}
batchTimeout := cfg.Tuning.NodeStoreBatchTimeout batchTimeout := cmp.Or(cfg.Tuning.NodeStoreBatchTimeout, defaultNodeStoreBatchTimeout)
if batchTimeout == 0 {
batchTimeout = defaultNodeStoreBatchTimeout
}
// [policy.PolicyManager.BuildPeerMap] handles both global and per-node filter complexity. // [policy.PolicyManager.BuildPeerMap] handles both global and per-node filter complexity.
// This moves the complex peer relationship logic into the policy package where it belongs. // This moves the complex peer relationship logic into the policy package where it belongs.
@ -2588,7 +2579,7 @@ func (s *State) HandleNodeFromPreAuthKey(
Expiry: reqExpiry, Expiry: reqExpiry,
RegisterMethod: util.RegisterMethodAuthKey, RegisterMethod: util.RegisterMethodAuthKey,
PreAuthKey: pak, PreAuthKey: pak,
ExistingNodeForNetinfo: cmp.Or(differentUserNode, types.NodeView{}), ExistingNodeForNetinfo: differentUserNode,
}) })
if err != nil { if err != nil {
return types.NodeView{}, change.Change{}, fmt.Errorf("creating new node: %w", err) return types.NodeView{}, change.Change{}, fmt.Errorf("creating new node: %w", err)

View file

@ -1399,17 +1399,11 @@ func (s *Scenario) GetIPs(user string) ([]netip.Addr, error) {
// GetClients returns all [TailscaleClient]s associated with a [User] in a [Scenario]. // GetClients returns all [TailscaleClient]s associated with a [User] in a [Scenario].
func (s *Scenario) GetClients(user string) ([]TailscaleClient, error) { func (s *Scenario) GetClients(user string) ([]TailscaleClient, error) {
var clients []TailscaleClient
if ns, ok := s.users[user]; ok { if ns, ok := s.users[user]; ok {
for _, client := range ns.Clients { return xmaps.Values(ns.Clients), nil
clients = append(clients, client)
}
return clients, nil
} }
return clients, fmt.Errorf("getting clients: %w", errNoUserAvailable) return nil, fmt.Errorf("getting clients: %w", errNoUserAvailable)
} }
// ListTailscaleClients returns a list of [TailscaleClient]s given the [User]s // ListTailscaleClients returns a list of [TailscaleClient]s given the [User]s

View file

@ -10,15 +10,14 @@ import (
"go/format" "go/format"
"io" "io"
"log" "log"
"maps"
"net/http" "net/http"
"os" "os"
"regexp" "regexp"
"slices" "slices"
"sort"
"strconv" "strconv"
"strings" "strings"
xmaps "golang.org/x/exp/maps"
"tailscale.com/tailcfg" "tailscale.com/tailcfg"
) )
@ -246,8 +245,7 @@ func getCapabilityVersions(ctx context.Context) (map[string]tailcfg.CapabilityVe
func calculateMinSupportedCapabilityVersion(versions map[string]tailcfg.CapabilityVersion) tailcfg.CapabilityVersion { func calculateMinSupportedCapabilityVersion(versions map[string]tailcfg.CapabilityVersion) tailcfg.CapabilityVersion {
// Since we now store minor versions directly, just sort and take the oldest of the latest N // Since we now store minor versions directly, just sort and take the oldest of the latest N
minorVersions := xmaps.Keys(versions) minorVersions := slices.Sorted(maps.Keys(versions))
sort.Strings(minorVersions)
supportedCount := min(len(minorVersions), supportedMajorMinorVersions) supportedCount := min(len(minorVersions), supportedMajorMinorVersions)
@ -264,8 +262,7 @@ func calculateMinSupportedCapabilityVersion(versions map[string]tailcfg.Capabili
// firstTailscaleVerPerCapVer inverts versions into a map from each capability // firstTailscaleVerPerCapVer inverts versions into a map from each capability
// version to the first (lowest-sorted) Tailscale minor version reporting it. // version to the first (lowest-sorted) Tailscale minor version reporting it.
func firstTailscaleVerPerCapVer(versions map[string]tailcfg.CapabilityVersion) map[tailcfg.CapabilityVersion]string { func firstTailscaleVerPerCapVer(versions map[string]tailcfg.CapabilityVersion) map[tailcfg.CapabilityVersion]string {
sortedVersions := xmaps.Keys(versions) sortedVersions := slices.Sorted(maps.Keys(versions))
sort.Strings(sortedVersions)
capVerToTailscaleVer := make(map[tailcfg.CapabilityVersion]string) capVerToTailscaleVer := make(map[tailcfg.CapabilityVersion]string)
@ -288,8 +285,7 @@ func writeCapabilityVersionsToFile(versions map[string]tailcfg.CapabilityVersion
content.WriteString("\n\n") content.WriteString("\n\n")
content.WriteString("var tailscaleToCapVer = map[string]tailcfg.CapabilityVersion{\n") content.WriteString("var tailscaleToCapVer = map[string]tailcfg.CapabilityVersion{\n")
sortedVersions := xmaps.Keys(versions) sortedVersions := slices.Sorted(maps.Keys(versions))
sort.Strings(sortedVersions)
for _, version := range sortedVersions { for _, version := range sortedVersions {
fmt.Fprintf(&content, "\t\"%s\": %d,\n", version, versions[version]) fmt.Fprintf(&content, "\t\"%s\": %d,\n", version, versions[version])
@ -302,8 +298,7 @@ func writeCapabilityVersionsToFile(versions map[string]tailcfg.CapabilityVersion
capVerToTailscaleVer := firstTailscaleVerPerCapVer(versions) capVerToTailscaleVer := firstTailscaleVerPerCapVer(versions)
capsSorted := xmaps.Keys(capVerToTailscaleVer) capsSorted := slices.Sorted(maps.Keys(capVerToTailscaleVer))
slices.Sort(capsSorted)
for _, capVer := range capsSorted { for _, capVer := range capsSorted {
fmt.Fprintf(&content, "\t%d:\t\t\"%s\",\n", capVer, capVerToTailscaleVer[capVer]) fmt.Fprintf(&content, "\t%d:\t\t\"%s\",\n", capVer, capVerToTailscaleVer[capVer])
@ -337,8 +332,7 @@ func writeCapabilityVersionsToFile(versions map[string]tailcfg.CapabilityVersion
func writeTestDataFile(versions map[string]tailcfg.CapabilityVersion, minSupportedCapVer tailcfg.CapabilityVersion) error { func writeTestDataFile(versions map[string]tailcfg.CapabilityVersion, minSupportedCapVer tailcfg.CapabilityVersion) error {
// Sort minor versions // Sort minor versions
minorVersions := xmaps.Keys(versions) minorVersions := slices.Sorted(maps.Keys(versions))
sort.Strings(minorVersions)
// Take latest N // Take latest N
supportedCount := min(len(minorVersions), supportedMajorMinorVersions) supportedCount := min(len(minorVersions), supportedMajorMinorVersions)
@ -416,8 +410,7 @@ func writeTestDataFile(versions map[string]tailcfg.CapabilityVersion, minSupport
fmt.Fprintf(&content, "\t{%d, \"%s\"},\n", minSupportedCapVer, minVersionString) fmt.Fprintf(&content, "\t{%d, \"%s\"},\n", minSupportedCapVer, minVersionString)
// Add a few more test cases // Add a few more test cases
capsSorted := xmaps.Keys(capVerToTailscaleVer) capsSorted := slices.Sorted(maps.Keys(capVerToTailscaleVer))
slices.Sort(capsSorted)
testCount := 0 testCount := 0
for _, capVer := range capsSorted { for _, capVer := range capsSorted {