1
0
mirror of https://github.com/alice-lg/alice-lg.git synced 2024-05-11 05:55:03 +00:00
alice-lg-alice-lg/pkg/http/api_endpoints_routes.go

268 lines
6.3 KiB
Go
Raw Normal View History

2021-10-22 22:40:03 +02:00
package http
2018-09-22 15:51:20 +02:00
import (
"net/http"
"time"
2021-03-22 16:50:08 +01:00
"github.com/julienschmidt/httprouter"
"github.com/alice-lg/alice-lg/pkg/api"
2018-09-22 15:51:20 +02:00
)
// Handle routes
2021-10-26 23:11:42 +02:00
func (s *Server) apiRoutesList(
_req *http.Request,
params httprouter.Params,
2021-10-27 17:54:51 +00:00
) (response, error) {
2021-07-02 14:30:43 +02:00
rsID, err := validateSourceID(params.ByName("id"))
2018-09-22 15:51:20 +02:00
if err != nil {
return nil, err
}
2021-07-02 14:30:43 +02:00
neighborID := params.ByName("neighborId")
2021-10-26 23:11:42 +02:00
source := s.cfg.SourceInstanceByID(rsID)
if source == nil {
2021-10-27 14:48:52 +00:00
return nil, ErrSourceNotFound
}
2021-07-02 14:30:43 +02:00
result, err := source.Routes(neighborID)
2018-10-02 14:52:47 +02:00
if err != nil {
2021-10-27 17:54:51 +00:00
s.logSourceError("routes", rsID, neighborID, err)
2018-10-02 14:52:47 +02:00
}
2018-09-22 15:51:20 +02:00
return result, err
}
// Paginated Routes Respponse: Received routes
2021-10-26 23:11:42 +02:00
func (s *Server) apiRoutesListReceived(
2018-09-22 15:51:20 +02:00
req *http.Request,
params httprouter.Params,
2021-10-27 17:54:51 +00:00
) (response, error) {
// Measure response time
t0 := time.Now()
2021-07-02 14:30:43 +02:00
rsID, err := validateSourceID(params.ByName("id"))
2018-09-22 15:51:20 +02:00
if err != nil {
return nil, err
}
2021-07-02 14:30:43 +02:00
neighborID := params.ByName("neighborId")
2021-10-26 23:11:42 +02:00
source := s.cfg.SourceInstanceByID(rsID)
if source == nil {
2021-10-26 23:11:42 +02:00
return nil, ErrSourceNotFound
}
2021-07-02 14:30:43 +02:00
result, err := source.RoutesReceived(neighborID)
2018-09-22 15:51:20 +02:00
if err != nil {
2021-10-27 17:54:51 +00:00
s.logSourceError("routes_received", rsID, neighborID, err)
2018-09-22 15:51:20 +02:00
return nil, err
}
// Filter routes based on criteria if present
allRoutes := apiQueryFilterNextHopGateway(req, "q", result.Imported)
routes := api.Routes{}
// Apply other (commmunity) filters
filtersApplied, err := api.FiltersFromQuery(req.URL.Query())
if err != nil {
return nil, err
}
filtersAvailable := api.NewSearchFilters()
for _, r := range allRoutes {
if !filtersApplied.MatchRoute(r) {
continue // Exclude route from results set
}
routes = append(routes, r)
filtersAvailable.UpdateFromRoute(r)
}
2018-09-22 15:51:20 +02:00
// Remove applied filters from available
filtersApplied.MergeProperties(filtersAvailable)
filtersAvailable = filtersAvailable.Sub(filtersApplied)
2018-09-22 15:51:20 +02:00
// Paginate results
page := apiQueryMustInt(req, "page", 0)
2021-10-27 14:48:52 +00:00
pageSize := s.cfg.UI.Pagination.RoutesAcceptedPageSize
2018-09-22 15:51:20 +02:00
routes, pagination := apiPaginateRoutes(routes, page, pageSize)
// Calculate query duration
queryDuration := time.Since(t0)
2018-09-22 15:51:20 +02:00
// Make paginated response
response := api.PaginatedRoutesResponse{
2021-10-27 17:54:51 +00:00
RoutesResponse: api.RoutesResponse{
Response: api.Response{
Meta: result.Response.Meta,
},
2018-09-22 15:51:20 +02:00
Imported: routes,
},
TimedResponse: api.TimedResponse{
RequestDuration: DurationMs(queryDuration),
},
2021-10-27 17:54:51 +00:00
FilteredResponse: api.FilteredResponse{
FiltersAvailable: filtersAvailable,
FiltersApplied: filtersApplied,
},
2021-10-27 17:54:51 +00:00
PaginatedResponse: api.PaginatedResponse{
Pagination: pagination,
},
2018-09-22 15:51:20 +02:00
}
return response, nil
}
2021-10-26 23:11:42 +02:00
func (s *Server) apiRoutesListFiltered(
2018-09-22 15:51:20 +02:00
req *http.Request,
params httprouter.Params,
2021-10-27 17:54:51 +00:00
) (response, error) {
t0 := time.Now()
2021-07-02 14:30:43 +02:00
rsID, err := validateSourceID(params.ByName("id"))
2018-09-22 15:51:20 +02:00
if err != nil {
return nil, err
}
2021-07-02 14:30:43 +02:00
neighborID := params.ByName("neighborId")
2021-10-26 23:11:42 +02:00
source := s.cfg.SourceInstanceByID(rsID)
if source == nil {
2021-10-26 23:11:42 +02:00
return nil, ErrSourceNotFound
}
2021-07-02 14:30:43 +02:00
result, err := source.RoutesFiltered(neighborID)
2018-09-22 15:51:20 +02:00
if err != nil {
2021-10-27 17:54:51 +00:00
s.logSourceError("routes_filtered", rsID, neighborID, err)
2018-09-22 15:51:20 +02:00
return nil, err
}
// Filter routes based on criteria if present
allRoutes := apiQueryFilterNextHopGateway(req, "q", result.Filtered)
routes := api.Routes{}
// Apply other (commmunity) filters
filtersApplied, err := api.FiltersFromQuery(req.URL.Query())
if err != nil {
return nil, err
}
filtersAvailable := api.NewSearchFilters()
for _, r := range allRoutes {
if !filtersApplied.MatchRoute(r) {
continue // Exclude route from results set
}
routes = append(routes, r)
filtersAvailable.UpdateFromRoute(r)
}
2018-09-22 15:51:20 +02:00
// Remove applied filters from available
filtersApplied.MergeProperties(filtersAvailable)
filtersAvailable = filtersAvailable.Sub(filtersApplied)
2018-09-22 15:51:20 +02:00
// Paginate results
page := apiQueryMustInt(req, "page", 0)
2021-10-27 14:48:52 +00:00
pageSize := s.cfg.UI.Pagination.RoutesFilteredPageSize
2018-09-22 15:51:20 +02:00
routes, pagination := apiPaginateRoutes(routes, page, pageSize)
// Calculate query duration
queryDuration := time.Since(t0)
2018-09-22 15:51:20 +02:00
// Make response
response := api.PaginatedRoutesResponse{
2021-10-27 17:54:51 +00:00
RoutesResponse: api.RoutesResponse{
Response: api.Response{
Meta: result.Response.Meta,
},
2018-09-22 15:51:20 +02:00
Filtered: routes,
},
TimedResponse: api.TimedResponse{
RequestDuration: DurationMs(queryDuration),
},
2021-10-27 17:54:51 +00:00
FilteredResponse: api.FilteredResponse{
FiltersAvailable: filtersAvailable,
FiltersApplied: filtersApplied,
},
2021-10-27 17:54:51 +00:00
PaginatedResponse: api.PaginatedResponse{
Pagination: pagination,
},
2018-09-22 15:51:20 +02:00
}
return response, nil
}
2021-10-26 23:11:42 +02:00
func (s *Server) apiRoutesListNotExported(
2018-09-22 15:51:20 +02:00
req *http.Request,
params httprouter.Params,
2021-10-27 17:54:51 +00:00
) (response, error) {
t0 := time.Now()
2021-07-02 14:30:43 +02:00
rsID, err := validateSourceID(params.ByName("id"))
2018-09-22 15:51:20 +02:00
if err != nil {
return nil, err
}
2021-07-02 14:30:43 +02:00
neighborID := params.ByName("neighborId")
2021-10-26 23:11:42 +02:00
source := s.cfg.SourceInstanceByID(rsID)
if source == nil {
2021-10-26 23:11:42 +02:00
return nil, ErrSourceNotFound
}
2021-07-02 14:30:43 +02:00
result, err := source.RoutesNotExported(neighborID)
2018-09-22 15:51:20 +02:00
if err != nil {
2021-10-27 17:54:51 +00:00
s.logSourceError("routes_not_exported", rsID, neighborID, err)
2018-09-22 15:51:20 +02:00
return nil, err
}
// Filter routes based on criteria if present
allRoutes := apiQueryFilterNextHopGateway(req, "q", result.NotExported)
routes := api.Routes{}
// Apply other (commmunity) filters
filtersApplied, err := api.FiltersFromQuery(req.URL.Query())
if err != nil {
return nil, err
}
filtersAvailable := api.NewSearchFilters()
for _, r := range allRoutes {
if !filtersApplied.MatchRoute(r) {
continue // Exclude route from results set
}
routes = append(routes, r)
filtersAvailable.UpdateFromRoute(r)
}
2018-09-22 15:51:20 +02:00
// Remove applied filters from available
filtersApplied.MergeProperties(filtersAvailable)
filtersAvailable = filtersAvailable.Sub(filtersApplied)
2018-09-22 15:51:20 +02:00
// Paginate results
page := apiQueryMustInt(req, "page", 0)
2021-10-26 23:11:42 +02:00
pageSize := s.cfg.UI.Pagination.RoutesNotExportedPageSize
2018-09-22 15:51:20 +02:00
routes, pagination := apiPaginateRoutes(routes, page, pageSize)
// Calculate query duration
queryDuration := time.Since(t0)
2018-09-22 15:51:20 +02:00
// Make response
response := api.PaginatedRoutesResponse{
2021-10-27 17:54:51 +00:00
RoutesResponse: api.RoutesResponse{
Response: api.Response{
Meta: result.Response.Meta,
},
2018-09-22 15:51:20 +02:00
NotExported: routes,
},
TimedResponse: api.TimedResponse{
RequestDuration: DurationMs(queryDuration),
},
2021-10-27 17:54:51 +00:00
FilteredResponse: api.FilteredResponse{
FiltersAvailable: filtersAvailable,
FiltersApplied: filtersApplied,
},
2021-10-27 17:54:51 +00:00
PaginatedResponse: api.PaginatedResponse{
Pagination: pagination,
},
2018-09-22 15:51:20 +02:00
}
return response, nil
}