appc,ipn/ipnlocal: make RouteAdvertiser optional; publish events

Tests need to be updated to actually exercise this, though

Change-Id: Ib91e2debea481ae04cee9591acad72f3d891465a
This commit is contained in:
M. J. Fromberger 2025-09-15 10:48:02 -07:00
parent 16808bf297
commit 0a2b3430da
2 changed files with 28 additions and 21 deletions

View File

@ -189,7 +189,6 @@ type Config struct {
EventBus *eventbus.Bus EventBus *eventbus.Bus
// RouteAdvertiser allows the connector to update the set of advertised routes. // RouteAdvertiser allows the connector to update the set of advertised routes.
// It must be non-nil.
RouteAdvertiser RouteAdvertiser RouteAdvertiser RouteAdvertiser
// RouteInfo, if non-nil, use used as the initial set of routes for the // RouteInfo, if non-nil, use used as the initial set of routes for the
@ -208,8 +207,6 @@ func NewAppConnector(c Config) *AppConnector {
panic("missing logger") panic("missing logger")
case c.EventBus == nil: case c.EventBus == nil:
panic("missing event bus") panic("missing event bus")
case c.RouteAdvertiser == nil:
panic("missing route advertiser")
} }
ec := c.EventBus.Client("appc.AppConnector") ec := c.EventBus.Client("appc.AppConnector")
@ -363,11 +360,13 @@ func (e *AppConnector) updateDomains(domains []string) {
} }
if len(toRemove) != 0 { if len(toRemove) != 0 {
e.queue.Add(func() { if ra := e.routeAdvertiser; ra != nil {
if err := e.routeAdvertiser.UnadvertiseRoute(toRemove...); err != nil { e.queue.Add(func() {
e.logf("failed to unadvertise routes on domain removal: %v: %v: %v", slicesx.MapKeys(oldDomains), toRemove, err) if err := e.routeAdvertiser.UnadvertiseRoute(toRemove...); err != nil {
} e.logf("failed to unadvertise routes on domain removal: %v: %v: %v", slicesx.MapKeys(oldDomains), toRemove, err)
}) }
})
}
e.updatePub.Publish(RouteUpdate{Unadvertise: toRemove}) e.updatePub.Publish(RouteUpdate{Unadvertise: toRemove})
} }
} }
@ -411,14 +410,16 @@ nextRoute:
} }
} }
e.queue.Add(func() { if e.routeAdvertiser != nil {
if err := e.routeAdvertiser.AdvertiseRoute(routes...); err != nil { e.queue.Add(func() {
e.logf("failed to advertise routes: %v: %v", routes, err) if err := e.routeAdvertiser.AdvertiseRoute(routes...); err != nil {
} e.logf("failed to advertise routes: %v: %v", routes, err)
if err := e.routeAdvertiser.UnadvertiseRoute(toRemove...); err != nil { }
e.logf("failed to unadvertise routes: %v: %v", toRemove, err) if err := e.routeAdvertiser.UnadvertiseRoute(toRemove...); err != nil {
} e.logf("failed to unadvertise routes: %v: %v", toRemove, err)
}) }
})
}
e.updatePub.Publish(RouteUpdate{ e.updatePub.Publish(RouteUpdate{
Advertise: routes, Advertise: routes,
Unadvertise: toRemove, Unadvertise: toRemove,
@ -624,9 +625,11 @@ func (e *AppConnector) isAddrKnownLocked(domain string, addr netip.Addr) bool {
// associated with the given domain. // associated with the given domain.
func (e *AppConnector) scheduleAdvertisement(domain string, routes ...netip.Prefix) { func (e *AppConnector) scheduleAdvertisement(domain string, routes ...netip.Prefix) {
e.queue.Add(func() { e.queue.Add(func() {
if err := e.routeAdvertiser.AdvertiseRoute(routes...); err != nil { if e.routeAdvertiser != nil {
e.logf("failed to advertise routes for %s: %v: %v", domain, routes, err) if err := e.routeAdvertiser.AdvertiseRoute(routes...); err != nil {
return e.logf("failed to advertise routes for %s: %v: %v", domain, routes, err)
return
}
} }
e.updatePub.Publish(RouteUpdate{Advertise: routes}) e.updatePub.Publish(RouteUpdate{Advertise: routes})
e.mu.Lock() e.mu.Lock()

View File

@ -641,7 +641,12 @@ func (b *LocalBackend) consumeEventbusTopics() {
case changeDelta := <-b.changeDeltaSub.Events(): case changeDelta := <-b.changeDeltaSub.Events():
b.linkChange(&changeDelta) b.linkChange(&changeDelta)
case ru := <-b.routeUpdateSub.Events(): case ru := <-b.routeUpdateSub.Events():
b.logf("TODO: received route update: %+v", ru) if err := b.AdvertiseRoute(ru.Advertise...); err != nil {
b.logf("appc: failed to advertise routes: %v: %v", ru.Advertise, err)
}
if err := b.UnadvertiseRoute(ru.Unadvertise...); err != nil {
b.logf("appc: failed to unadvertise routes: %v: %v", ru.Unadvertise, err)
}
case ri := <-b.storeRoutesSub.Events(): case ri := <-b.storeRoutesSub.Events():
b.logf("TODO: received store routes: %+v", ri) b.logf("TODO: received store routes: %+v", ri)
} }
@ -5077,7 +5082,6 @@ func (b *LocalBackend) reconfigAppConnectorLocked(nm *netmap.NetworkMap, prefs i
b.appConnector = appc.NewAppConnector(appc.Config{ b.appConnector = appc.NewAppConnector(appc.Config{
Logf: b.logf, Logf: b.logf,
EventBus: b.sys.Bus.Get(), EventBus: b.sys.Bus.Get(),
RouteAdvertiser: b,
RouteInfo: ri, RouteInfo: ri,
StoreRoutesFunc: storeFunc, StoreRoutesFunc: storeFunc,
}) })