diff --git a/CHANGELOG.md b/CHANGELOG.md index 0900c141..823896ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ ## 0.27.0 (2025-xx-xx) -**Minimum supported Tailscale client version: v1.64.0** +**Minimum supported Tailscale client version: v1.68.0** ### Database integrity improvements diff --git a/hscontrol/capver/capver.go b/hscontrol/capver/capver.go index b6bbca5b..b471ebcc 100644 --- a/hscontrol/capver/capver.go +++ b/hscontrol/capver/capver.go @@ -12,8 +12,6 @@ import ( "tailscale.com/util/set" ) -const MinSupportedCapabilityVersion tailcfg.CapabilityVersion = 90 - // CanOldCodeBeCleanedUp is intended to be called on startup to see if // there are old code that can ble cleaned up, entries should contain // a CapVer where something can be cleaned up and a panic if it can. @@ -29,12 +27,14 @@ func CanOldCodeBeCleanedUp() { func tailscaleVersSorted() []string { vers := xmaps.Keys(tailscaleToCapVer) sort.Strings(vers) + return vers } func capVersSorted() []tailcfg.CapabilityVersion { capVers := xmaps.Keys(capVerToTailscaleVer) slices.Sort(capVers) + return capVers } @@ -48,6 +48,7 @@ func CapabilityVersion(ver string) tailcfg.CapabilityVersion { if !strings.HasPrefix(ver, "v") { ver = "v" + ver } + return tailscaleToCapVer[ver] } @@ -73,10 +74,12 @@ func TailscaleLatestMajorMinor(n int, stripV bool) []string { } majors := set.Set[string]{} + for _, vers := range tailscaleVersSorted() { if stripV { vers = strings.TrimPrefix(vers, "v") } + v := strings.Split(vers, ".") majors.Add(v[0] + "." + v[1]) } diff --git a/hscontrol/capver/capver_generated.go b/hscontrol/capver/capver_generated.go index 534ead02..dca83cd2 100644 --- a/hscontrol/capver/capver_generated.go +++ b/hscontrol/capver/capver_generated.go @@ -5,11 +5,6 @@ package capver import "tailscale.com/tailcfg" var tailscaleToCapVer = map[string]tailcfg.CapabilityVersion{ - "v1.64.0": 90, - "v1.64.1": 90, - "v1.64.2": 90, - "v1.66.0": 95, - "v1.66.1": 95, "v1.66.2": 95, "v1.66.3": 95, "v1.66.4": 95, @@ -35,11 +30,15 @@ var tailscaleToCapVer = map[string]tailcfg.CapabilityVersion{ "v1.84.0": 116, "v1.84.1": 116, "v1.84.2": 116, + "v1.86.0": 122, + "v1.86.2": 123, + "v1.88.1": 125, + "v1.88.3": 125, + "v1.90.1": 130, } var capVerToTailscaleVer = map[tailcfg.CapabilityVersion]string{ - 90: "v1.64.0", - 95: "v1.66.0", + 95: "v1.66.2", 97: "v1.68.0", 102: "v1.70.0", 104: "v1.72.0", @@ -48,4 +47,12 @@ var capVerToTailscaleVer = map[tailcfg.CapabilityVersion]string{ 113: "v1.80.0", 115: "v1.82.0", 116: "v1.84.0", + 122: "v1.86.0", + 123: "v1.86.2", + 125: "v1.88.1", + 130: "v1.90.1", } + +// MinSupportedCapabilityVersion represents the minimum capability version +// supported by this Headscale instance (latest 10 minor versions) +const MinSupportedCapabilityVersion tailcfg.CapabilityVersion = 104 diff --git a/hscontrol/capver/capver_test.go b/hscontrol/capver/capver_test.go index 42f1df71..5c5d5b44 100644 --- a/hscontrol/capver/capver_test.go +++ b/hscontrol/capver/capver_test.go @@ -4,34 +4,10 @@ import ( "testing" "github.com/google/go-cmp/cmp" - "tailscale.com/tailcfg" ) func TestTailscaleLatestMajorMinor(t *testing.T) { - tests := []struct { - n int - stripV bool - expected []string - }{ - {3, false, []string{"v1.80", "v1.82", "v1.84"}}, - {2, true, []string{"1.82", "1.84"}}, - // Lazy way to see all supported versions - {10, true, []string{ - "1.66", - "1.68", - "1.70", - "1.72", - "1.74", - "1.76", - "1.78", - "1.80", - "1.82", - "1.84", - }}, - {0, false, nil}, - } - - for _, test := range tests { + for _, test := range tailscaleLatestMajorMinorTests { t.Run("", func(t *testing.T) { output := TailscaleLatestMajorMinor(test.n, test.stripV) if diff := cmp.Diff(output, test.expected); diff != "" { @@ -42,19 +18,7 @@ func TestTailscaleLatestMajorMinor(t *testing.T) { } func TestCapVerMinimumTailscaleVersion(t *testing.T) { - tests := []struct { - input tailcfg.CapabilityVersion - expected string - }{ - {90, "v1.64.0"}, - {95, "v1.66.0"}, - {106, "v1.74.0"}, - {109, "v1.78.0"}, - {9001, ""}, // Test case for a version higher than any in the map - {60, ""}, // Test case for a version lower than any in the map - } - - for _, test := range tests { + for _, test := range capVerMinimumTailscaleVersionTests { t.Run("", func(t *testing.T) { output := TailscaleVersion(test.input) if output != test.expected { diff --git a/hscontrol/capver/capver_test_data.go b/hscontrol/capver/capver_test_data.go new file mode 100644 index 00000000..c6843139 --- /dev/null +++ b/hscontrol/capver/capver_test_data.go @@ -0,0 +1,40 @@ +package capver + +// Generated DO NOT EDIT + +import "tailscale.com/tailcfg" + +var tailscaleLatestMajorMinorTests = []struct { + n int + stripV bool + expected []string +}{ + {3, false, []string{"v1.86", "v1.88", "v1.90"}}, + {2, true, []string{"1.88", "1.90"}}, + {10, true, []string{ + "1.72", + "1.74", + "1.76", + "1.78", + "1.80", + "1.82", + "1.84", + "1.86", + "1.88", + "1.90", + }}, + {0, false, nil}, +} + +var capVerMinimumTailscaleVersionTests = []struct { + input tailcfg.CapabilityVersion + expected string +}{ + {104, "v1.72.0"}, + {95, "v1.66.2"}, + {97, "v1.68.0"}, + {102, "v1.70.0"}, + {106, "v1.74.0"}, + {9001, ""}, // Test case for a version higher than any in the map + {60, ""}, // Test case for a version lower than any in the map +}