Remove leftover Link, Device attachment on removePort()
Change-Id: I395e60d29ca33f558492e1fb9807cca053024e98
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
index 0957be7..921907e 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
@@ -736,25 +736,38 @@
return;
}
- // check if there is something referring to this Port
+ // Remove Link and Device Attachment
+ for (Device device : p.getDevices()) {
+ log.debug("Removing Device {} on Port {}", device, portEvt);
+ DeviceEvent devEvt = new DeviceEvent(device.getMacAddress());
+ devEvt.addAttachmentPoint(new SwitchPort(p.getSwitch().getDpid(), p.getNumber()));
- if (!p.getDevices().iterator().hasNext()) {
- log.warn(
- "Devices on Port {} should be removed prior to removing Port. Removing Port anyways",
- portEvt);
- // XXX Should we remove Device to Port relation?
+ // XXX calling removeDeviceEvent() may trigger duplicate event, once at prepare phase, second time here
+ // If event can be squashed, ignored etc. at receiver side it shouldn't be a problem, but if not
+ // need to re-visit
+
+ // calling Discovery API to wipe from DB, etc.
+ removeDeviceEvent(devEvt);
}
- if (p.getIncomingLink() != null) {
- log.warn(
- "IncomingLinks on Port {} should be removed prior to removing Port. Removing Port anyways",
- portEvt);
- // XXX Should we remove Link?
+ Set<Link> links = new HashSet<>();
+ links.add(p.getOutgoingLink());
+ links.add(p.getIncomingLink());
+ ArrayList<LinkEvent> linksToRemove = new ArrayList<>();
+ for (Link link : links) {
+ if (link == null) {
+ continue;
+ }
+ log.debug("Removing Link {} on Port {}", link, portEvt);
+ LinkEvent linkEvent = new LinkEvent(link.getSourceSwitchDpid(), link.getSourcePortNumber(), link.getDestinationSwitchDpid(), link.getDestinationPortNumber());
+ linksToRemove.add(linkEvent);
}
- if (p.getOutgoingLink() != null) {
- log.warn(
- "OutgoingLinks on Port {} should be removed prior to removing Port. Removing Port anyways",
- portEvt);
- // XXX Should we remove Link?
+ for (LinkEvent linkEvent : linksToRemove) {
+ // XXX calling removeLinkEvent() may trigger duplicate event, once at prepare phase, second time here
+ // If event can be squashed, ignored etc. at receiver side it shouldn't be a problem, but if not
+ // need to re-visit
+
+ // calling Discovery API to wipe from DB, etc.
+ removeLinkEvent(linkEvent);
}
// remove Port from Switch