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
// RouteAdvertiser allows the connector to update the set of advertised routes.
// It must be non-nil.
RouteAdvertiser RouteAdvertiser
// 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")
case c.EventBus == nil:
panic("missing event bus")
case c.RouteAdvertiser == nil:
panic("missing route advertiser")
}
ec := c.EventBus.Client("appc.AppConnector")
@ -363,11 +360,13 @@ func (e *AppConnector) updateDomains(domains []string) {
}
if len(toRemove) != 0 {
if ra := e.routeAdvertiser; ra != nil {
e.queue.Add(func() {
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})
}
}
@ -411,6 +410,7 @@ nextRoute:
}
}
if e.routeAdvertiser != nil {
e.queue.Add(func() {
if err := e.routeAdvertiser.AdvertiseRoute(routes...); err != nil {
e.logf("failed to advertise routes: %v: %v", routes, err)
@ -419,6 +419,7 @@ nextRoute:
e.logf("failed to unadvertise routes: %v: %v", toRemove, err)
}
})
}
e.updatePub.Publish(RouteUpdate{
Advertise: routes,
Unadvertise: toRemove,
@ -624,10 +625,12 @@ func (e *AppConnector) isAddrKnownLocked(domain string, addr netip.Addr) bool {
// associated with the given domain.
func (e *AppConnector) scheduleAdvertisement(domain string, routes ...netip.Prefix) {
e.queue.Add(func() {
if e.routeAdvertiser != nil {
if err := e.routeAdvertiser.AdvertiseRoute(routes...); err != nil {
e.logf("failed to advertise routes for %s: %v: %v", domain, routes, err)
return
}
}
e.updatePub.Publish(RouteUpdate{Advertise: routes})
e.mu.Lock()
defer e.mu.Unlock()

View File

@ -641,7 +641,12 @@ func (b *LocalBackend) consumeEventbusTopics() {
case changeDelta := <-b.changeDeltaSub.Events():
b.linkChange(&changeDelta)
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():
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{
Logf: b.logf,
EventBus: b.sys.Bus.Get(),
RouteAdvertiser: b,
RouteInfo: ri,
StoreRoutesFunc: storeFunc,
})