Take down edge ports on a leaf switch when all uplinks are gone
- Bug fix for case when all uplinks are gone, but dual-homed host continues to send packets to switch;
We now administratively take down the host port to force the host to use the other leaf in the pair.
- Restructured SR manager by creating a LinkHandler
- fixed/added some log messages
Change-Id: I3722cd364dc8798b16891519bec165627e92bd87
diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/HostHandler.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/HostHandler.java
index 1379e79..908a339 100644
--- a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/HostHandler.java
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/HostHandler.java
@@ -42,6 +42,7 @@
import com.google.common.collect.Sets;
+import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.Executors;
@@ -88,6 +89,14 @@
private void processHostAdded(Host host) {
host.locations().forEach(location -> processHostAddedAtLocation(host, location));
+ // ensure dual-homed host locations have viable uplinks
+ if (host.locations().size() > 1) {
+ host.locations().forEach(loc -> {
+ if (srManager.mastershipService.isLocalMaster(loc.deviceId())) {
+ srManager.linkHandler.checkUplinksForDualHomedHosts(loc);
+ }
+ });
+ }
}
void processHostAddedAtLocation(Host host, HostLocation location) {
@@ -276,6 +285,15 @@
hostVlanId, ip, false)
);
});
+
+ // ensure dual-homed host locations have viable uplinks
+ if (newLocations.size() > prevLocations.size()) {
+ newLocations.forEach(loc -> {
+ if (srManager.mastershipService.isLocalMaster(loc.deviceId())) {
+ srManager.linkHandler.checkUplinksForDualHomedHosts(loc);
+ }
+ });
+ }
}
void processHostUpdatedEvent(HostEvent event) {
@@ -640,4 +658,23 @@
});
}));
}
+
+ /**
+ * Returns the set of portnumbers on the given device that are part of the
+ * locations for dual-homed hosts.
+ *
+ * @param deviceId the given deviceId
+ * @return set of port numbers on given device that are dual-homed host
+ * locations. May be empty if no dual homed hosts are connected to
+ * the given device
+ */
+ Set<PortNumber> getDualHomedHostPorts(DeviceId deviceId) {
+ Set<PortNumber> dualHomedLocations = new HashSet<>();
+ srManager.hostService.getConnectedHosts(deviceId).stream()
+ .filter(host -> host.locations().size() == 2)
+ .forEach(host -> host.locations().stream()
+ .filter(loc -> loc.deviceId().equals(deviceId))
+ .forEach(loc -> dualHomedLocations.add(loc.port())));
+ return dualHomedLocations;
+ }
}