func extractRoutes()

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
}