mirror of
https://github.com/tailscale/tailscale.git
synced 2025-11-14 17:43:01 +00:00
This commit contains the changes for the following:
1. Patch prefs handler doesn't add the remote routes to pref if the pref update is also turning appconnector off. 2. Unadvertise routes when StoreRoutes is on but appConnector is turning off. 3. When appConnector is turning on, add a task to recreate and reload routeInfo from store to the queue 3. When shouldStore is changed, remove the state saved for routeInfo (Set to nil)
This commit is contained in:
@@ -19,6 +19,7 @@ import (
|
||||
xmaps "golang.org/x/exp/maps"
|
||||
"golang.org/x/net/dns/dnsmessage"
|
||||
"tailscale.com/appc/routeinfo"
|
||||
"tailscale.com/ipn"
|
||||
"tailscale.com/types/logger"
|
||||
"tailscale.com/types/views"
|
||||
"tailscale.com/util/dnsname"
|
||||
@@ -105,7 +106,9 @@ func (e *AppConnector) RouteInfo() *routeinfo.RouteInfo {
|
||||
if e.routeInfo == nil {
|
||||
ret, err := e.routeAdvertiser.ReadRouteInfo()
|
||||
if err != nil {
|
||||
e.logf("Unsuccessful Read RouteInfo: ", err)
|
||||
if err != ipn.ErrStateNotExist {
|
||||
e.logf("Unsuccessful Read RouteInfo: ", err)
|
||||
}
|
||||
return routeinfo.NewRouteInfo()
|
||||
}
|
||||
return ret
|
||||
@@ -113,6 +116,34 @@ func (e *AppConnector) RouteInfo() *routeinfo.RouteInfo {
|
||||
return e.routeInfo
|
||||
}
|
||||
|
||||
// RecreateRouteInfoFromStore searches from presist store for existing routeInfo for current profile,
|
||||
// then update local routes of routeInfo in store as the current advertised routes.
|
||||
func (e *AppConnector) RecreateRouteInfoFromStore(localRoutes []netip.Prefix) {
|
||||
e.queue.Add(func() {
|
||||
ri := e.RouteInfo()
|
||||
ri.Local = localRoutes
|
||||
err := e.routeAdvertiser.StoreRouteInfo(ri)
|
||||
if err != nil {
|
||||
e.logf("Appc recreate routeInfo: Error updating routeInfo in store: ", err)
|
||||
}
|
||||
err = e.routeAdvertiser.AdvertiseRoute(ri.Routes(false, true, true)...)
|
||||
if err != nil {
|
||||
e.logf("Appc recreate routeInfo: Error advertise routes: ", err)
|
||||
}
|
||||
e.routeInfo = ri
|
||||
})
|
||||
}
|
||||
|
||||
// UpdateRouteInfo updates routeInfo value of the AppConnector and
|
||||
// stores the routeInfo value to presist store.
|
||||
func (e *AppConnector) UpdateRouteInfo(ri *routeinfo.RouteInfo) {
|
||||
err := e.routeAdvertiser.StoreRouteInfo(ri)
|
||||
if err != nil {
|
||||
e.logf("Appc: Failed to remove routeInfo from store: ", err)
|
||||
}
|
||||
e.routeInfo = ri
|
||||
}
|
||||
|
||||
// UpdateDomains asynchronously replaces the current set of configured domains
|
||||
// with the supplied set of domains. Domains must not contain a trailing dot,
|
||||
// and should be lower case. If the domain contains a leading '*' label it
|
||||
@@ -180,9 +211,15 @@ func (e *AppConnector) updateRoutes(routes []netip.Prefix) {
|
||||
if e.ShouldStoreRoutes {
|
||||
routeInfo, err = e.routeAdvertiser.ReadRouteInfo()
|
||||
if err != nil {
|
||||
e.logf("failed to read routeInfo from store")
|
||||
if err != ipn.ErrStateNotExist {
|
||||
e.logf("Appc: Unsuccessful Read RouteInfo: ", err)
|
||||
}
|
||||
routeInfo = routeinfo.NewRouteInfo()
|
||||
}
|
||||
oldControl := routeInfo.Control
|
||||
routeInfo.Control = routes
|
||||
e.routeInfo = routeInfo
|
||||
e.routeAdvertiser.StoreRouteInfo(e.routeInfo)
|
||||
oldOtherRoutes := routeInfo.Routes(true, false, true)
|
||||
for _, ipp := range oldControl {
|
||||
if slices.Contains(routes, ipp) {
|
||||
@@ -197,7 +234,6 @@ func (e *AppConnector) updateRoutes(routes []netip.Prefix) {
|
||||
if err := e.routeAdvertiser.UnadvertiseRoute(toRemove...); err != nil {
|
||||
e.logf("failed to unadvertise old routes: %v: %v", routes, err)
|
||||
}
|
||||
routeInfo.Control = routes
|
||||
}
|
||||
if err := e.routeAdvertiser.AdvertiseRoute(routes...); err != nil {
|
||||
e.logf("failed to advertise routes: %v: %v", routes, err)
|
||||
@@ -223,10 +259,6 @@ nextRoute:
|
||||
e.logf("failed to unadvertise routes: %v: %v", toRemove, err)
|
||||
}
|
||||
e.controlRoutes = routes
|
||||
if e.ShouldStoreRoutes {
|
||||
e.routeInfo = routeInfo
|
||||
e.routeAdvertiser.StoreRouteInfo(e.routeInfo)
|
||||
}
|
||||
}
|
||||
|
||||
// Domains returns the currently configured domain list.
|
||||
|
||||
@@ -102,8 +102,8 @@ func TestUpdateRoutesNotUnadvertiseRoutesFromOtherSources(t *testing.T) {
|
||||
rc := &appctest.RouteCollector{}
|
||||
a := NewAppConnector(t.Logf, rc, shouldStore)
|
||||
testRi := routeinfo.NewRouteInfo()
|
||||
a.routeInfo.Local = []netip.Prefix{netip.MustParsePrefix("192.0.2.0/24")}
|
||||
testRi.Local = append(testRi.Local, netip.MustParsePrefix("192.0.2.0/24"))
|
||||
a.routeInfo = testRi
|
||||
rc.StoreRouteInfo(testRi)
|
||||
|
||||
routes := []netip.Prefix{netip.MustParsePrefix("192.0.2.0/24"), netip.MustParsePrefix("192.0.0.1/32")}
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"slices"
|
||||
|
||||
"tailscale.com/appc/routeinfo"
|
||||
"tailscale.com/ipn"
|
||||
)
|
||||
|
||||
// RouteCollector is a test helper that collects the list of routes advertised
|
||||
@@ -42,7 +43,7 @@ func (rc *RouteCollector) StoreRouteInfo(ri *routeinfo.RouteInfo) error {
|
||||
|
||||
func (rc *RouteCollector) ReadRouteInfo() (*routeinfo.RouteInfo, error) {
|
||||
if rc.routeInfo == nil {
|
||||
return routeinfo.NewRouteInfo(), nil
|
||||
return nil, ipn.ErrStateNotExist
|
||||
}
|
||||
return rc.routeInfo, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user