package http import ( "context" "net/http" "sort" "github.com/julienschmidt/httprouter" "github.com/alice-lg/alice-lg/pkg/api" "github.com/alice-lg/alice-lg/pkg/config" ) // Handle get neighbors on routeserver func (s *Server) apiNeighborsList( ctx context.Context, req *http.Request, params httprouter.Params, ) (response, error) { rsID, err := validateSourceID(params.ByName("id")) if err != nil { return nil, err } var neighborsResponse *api.NeighborsResponse // Try to fetch neighbors from store, only fall back // to RS query if store is not ready yet. // The stored neighbors response includes details like // the number of filtered routes which might be lacking // from the summary. if s.neighborsStore.IsInitialized(rsID) { status, err := s.neighborsStore.GetStatus(rsID) if err != nil { return nil, err } neighbors, err := s.neighborsStore.GetNeighborsAt(ctx, rsID) if err != nil { return nil, err } // Make response neighborsResponse = &api.NeighborsResponse{ Response: api.Response{ Meta: &api.Meta{ Version: config.Version, CacheStatus: api.CacheStatus{ OrigTTL: 0, CachedAt: status.LastRefresh, }, ResultFromCache: true, // you bet! TTL: s.neighborsStore.SourceCacheTTL(ctx, rsID), }, }, Neighbors: neighbors, } } else { source := s.cfg.SourceInstanceByID(rsID) if source == nil { return nil, ErrSourceNotFound } neighborsResponse, err = source.NeighborsSummary(ctx) if err != nil { s.logSourceError("neighbors", rsID, err) return nil, err } } // Sort result sort.Sort(&neighborsResponse.Neighbors) return neighborsResponse, nil }