mirror of
https://github.com/tailscale/tailscale.git
synced 2025-05-18 16:28:32 +00:00
Implemented patch handler but not sure how to correctly contruct the test for it
This commit is contained in:
parent
886ffc3096
commit
79af5fef05
@ -101,6 +101,18 @@ func (e *AppConnector) UpdateDomainsAndRoutes(domains []string, routes []netip.P
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *AppConnector) RouteInfo() *routeinfo.RouteInfo {
|
||||||
|
if e.routeInfo == nil {
|
||||||
|
ret, err := e.routeAdvertiser.ReadRouteInfo()
|
||||||
|
if err != nil {
|
||||||
|
e.logf("Unsuccessful Read RouteInfo: ", err)
|
||||||
|
return routeinfo.NewRouteInfo()
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
return e.routeInfo
|
||||||
|
}
|
||||||
|
|
||||||
// UpdateDomains asynchronously replaces the current set of configured domains
|
// UpdateDomains asynchronously replaces the current set of configured domains
|
||||||
// with the supplied set of domains. Domains must not contain a trailing dot,
|
// 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
|
// and should be lower case. If the domain contains a leading '*' label it
|
||||||
|
@ -3144,6 +3144,21 @@ func (b *LocalBackend) checkFunnelEnabledLocked(p *ipn.Prefs) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *LocalBackend) PatchPrefsHandler(mp *ipn.MaskedPrefs) (ipn.PrefsView, error) {
|
||||||
|
// we believe that for the purpose of figuring out advertisedRoutes setPrefsLockedOnEntry is _only_ called when
|
||||||
|
// up or set is used on the tailscale cli _not_ when we calculate the new advertisedRoutes field.
|
||||||
|
routeInfo := b.appConnector.RouteInfo()
|
||||||
|
curRoutes := routeInfo.Routes(false, true, true)
|
||||||
|
|
||||||
|
if mp.AdvertiseRoutesSet && b.appConnector.ShouldStoreRoutes {
|
||||||
|
routeInfo.Local = mp.AdvertiseRoutes
|
||||||
|
b.StoreRouteInfo(routeInfo)
|
||||||
|
curRoutes := append(curRoutes, mp.AdvertiseRoutes...)
|
||||||
|
mp.AdvertiseRoutes = curRoutes
|
||||||
|
}
|
||||||
|
return b.EditPrefs(mp)
|
||||||
|
}
|
||||||
|
|
||||||
func (b *LocalBackend) EditPrefs(mp *ipn.MaskedPrefs) (ipn.PrefsView, error) {
|
func (b *LocalBackend) EditPrefs(mp *ipn.MaskedPrefs) (ipn.PrefsView, error) {
|
||||||
b.mu.Lock()
|
b.mu.Lock()
|
||||||
if mp.EggSet {
|
if mp.EggSet {
|
||||||
@ -6055,10 +6070,12 @@ func (b *LocalBackend) ReadRouteInfo() (*routeinfo.RouteInfo, error) {
|
|||||||
}
|
}
|
||||||
key := namespaceKeyForCurrentProfile(b.pm, routeInfoStateStoreKey)
|
key := namespaceKeyForCurrentProfile(b.pm, routeInfoStateStoreKey)
|
||||||
bs, err := b.pm.Store().ReadState(key)
|
bs, err := b.pm.Store().ReadState(key)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
ri := &routeinfo.RouteInfo{}
|
ri := &routeinfo.RouteInfo{}
|
||||||
|
if err != nil && err != ipn.ErrStateNotExist {
|
||||||
|
return nil, err
|
||||||
|
} else if err == ipn.ErrStateNotExist {
|
||||||
|
return ri, nil
|
||||||
|
}
|
||||||
if err := json.Unmarshal(bs, ri); err != nil {
|
if err := json.Unmarshal(bs, ri); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -2559,3 +2559,54 @@ func TestReadWriteRouteInfo(t *testing.T) {
|
|||||||
t.Fatalf("wanted %v, got %v", routes[prefix3], dr.Routes[prefix3])
|
t.Fatalf("wanted %v, got %v", routes[prefix3], dr.Routes[prefix3])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPatchPrefsHandler(t *testing.T) {
|
||||||
|
// test can read what's written
|
||||||
|
prefix1 := netip.MustParsePrefix("1.2.3.4/32")
|
||||||
|
prefix2 := netip.MustParsePrefix("1.2.3.5/32")
|
||||||
|
prefix3 := netip.MustParsePrefix("1.2.3.6/32")
|
||||||
|
rc := &appctest.RouteCollector{}
|
||||||
|
testAppConnector := appc.NewAppConnector(t.Logf, rc, true)
|
||||||
|
mp := new(ipn.MaskedPrefs)
|
||||||
|
mp.AdvertiseRoutesSet = true
|
||||||
|
mp.AdvertiseRoutes = []netip.Prefix{prefix1}
|
||||||
|
now := time.Now()
|
||||||
|
ri := routeinfo.NewRouteInfo()
|
||||||
|
ri.Control = []netip.Prefix{prefix2}
|
||||||
|
discovered := make(map[string]*routeinfo.DatedRoutes)
|
||||||
|
routes := make(map[netip.Prefix]time.Time)
|
||||||
|
routes[prefix3] = now
|
||||||
|
discovered["example.com"] = &routeinfo.DatedRoutes{
|
||||||
|
LastCleanup: now,
|
||||||
|
Routes: routes,
|
||||||
|
}
|
||||||
|
ri.Discovered = discovered
|
||||||
|
b := newTestBackend(t)
|
||||||
|
b.reconfigAppConnectorLocked(b.netMap, b.pm.prefs)
|
||||||
|
if b.appConnector != nil {
|
||||||
|
t.Fatal("unexpected app connector")
|
||||||
|
}
|
||||||
|
b.appConnector = testAppConnector
|
||||||
|
|
||||||
|
prefView, err := b.PatchPrefsHandler(mp)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if prefView.AdvertiseRoutes().Len() != 3 {
|
||||||
|
t.Fatalf("wanted %d, got %d", 3, prefView.AdvertiseRoutes().Len())
|
||||||
|
}
|
||||||
|
|
||||||
|
if !slices.Contains(prefView.AdvertiseRoutes().AsSlice(), prefix1) {
|
||||||
|
t.Fatalf("New prefix was not advertised")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !slices.Contains(prefView.AdvertiseRoutes().AsSlice(), prefix2) || !slices.Contains(prefView.AdvertiseRoutes().AsSlice(), prefix3) {
|
||||||
|
t.Fatalf("Old prefixes are no longer advertised.")
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: test if route if stored in Appc/Appc.routeAdvertiser
|
||||||
|
|
||||||
|
//TODO: patch again with no route, see if prefix1 is removed/ prefix2, prefix3 presists.
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -1376,7 +1376,7 @@ func (h *Handler) servePrefs(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
var err error
|
var err error
|
||||||
prefs, err = h.b.EditPrefs(mp)
|
prefs, err = h.b.PatchPrefsHandler(mp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user