Correctly initialize routes with multiple next hops
- Solve an issue where next hops are available on both leaf switch but one still pointing to its pair through the spines
- Improve unit tests
Change-Id: I94fe79bd9289efe544d82b858928d65201a0b0b2
diff --git a/app/src/main/java/org/onosproject/segmentrouting/RouteHandler.java b/app/src/main/java/org/onosproject/segmentrouting/RouteHandler.java
index 6d77da4..b278b8c 100644
--- a/app/src/main/java/org/onosproject/segmentrouting/RouteHandler.java
+++ b/app/src/main/java/org/onosproject/segmentrouting/RouteHandler.java
@@ -83,26 +83,24 @@
}
protected void init(DeviceId deviceId) {
- srManager.routeService.getRouteTables().forEach(routeTableId ->
- srManager.routeService.getRoutes(routeTableId).forEach(routeInfo ->
- routeInfo.allRoutes().forEach(resolvedRoute ->
- srManager.nextHopLocations(resolvedRoute).stream()
- .filter(location -> deviceId.equals(location.deviceId()))
- .forEach(location -> processRouteAddedInternal(resolvedRoute)
- )
- )
- )
- );
+ Optional<DeviceId> pairDeviceId = srManager.getPairDeviceId(deviceId);
+
+ srManager.routeService.getRouteTables().stream()
+ .map(srManager.routeService::getRoutes)
+ .flatMap(Collection::stream)
+ .map(RouteInfo::allRoutes)
+ .filter(allRoutes -> allRoutes.stream().allMatch(resolvedRoute ->
+ srManager.nextHopLocations(resolvedRoute).stream().allMatch(cp ->
+ deviceId.equals(cp.deviceId()) ||
+ (pairDeviceId.isPresent() && pairDeviceId.get().equals(cp.deviceId()))
+ )))
+ .forEach(this::processRouteAddedInternal);
}
void processRouteAdded(RouteEvent event) {
enqueueRouteEvent(event);
}
- private void processRouteAddedInternal(ResolvedRoute route) {
- processRouteAddedInternal(Sets.newHashSet(route));
- }
-
private void processRouteAddedInternal(Collection<ResolvedRoute> routes) {
if (!isReady()) {
log.info("System is not ready. Skip adding route for {}", routes);