in pkg/hotreload/route_reloader.go [73:130]
func extractRoutes(config *model.Bootstrap) model.RouteConfiguration {
var (
routeConfig model.RouteConfiguration
invalidRouteIDs []string
)
for _, listener := range config.StaticResources.Listeners {
for _, filterChain := range listener.FilterChain.Filters {
if filterChain.Name == constant.HTTPConnectManagerFilter {
// Extract route_config
rawRouteConfig, ok := filterChain.Config["route_config"]
if !ok {
logger.Debugf("No route_config found in filter chain: %+v", filterChain)
continue
}
logger.Debugf("Raw route_config: %+v", rawRouteConfig)
// Convert route_config to JSON bytes
routeConfigBytes, err := json.Marshal(rawRouteConfig)
if err != nil {
logger.Errorf("Failed to marshal route_config: %v", err)
continue
}
// Parse JSON bytes into model.RouteConfiguration
if err := json.Unmarshal(routeConfigBytes, &routeConfig); err != nil {
logger.Errorf("Failed to unmarshal route_config: %v", err)
continue
}
logger.Debugf("Parsed route_config: %+v", routeConfig)
// Validate and filter routes
validRoutes := make([]*model.Router, 0, len(routeConfig.Routes))
for _, route := range routeConfig.Routes {
if err := validateRoute(route); err != nil {
invalidRouteIDs = append(invalidRouteIDs, route.ID)
logger.Warnf("Skipping invalid route %s: %v", route.ID, err)
continue
}
validRoutes = append(validRoutes, route)
}
routeConfig.Routes = validRoutes
logger.Debugf("Valid routes after filtering: %+v", validRoutes)
// Return if we have valid routes
if len(validRoutes) > 0 {
return routeConfig
}
}
}
}
if len(invalidRouteIDs) > 0 {
logger.Warnf("No valid routes found in configuration: %v", invalidRouteIDs)
}
return routeConfig
}