* Added a new class TopologyEvents that encapsulated the collections
of all possible topology-related events.
* Updated the ITopologyListener API to use the new class TopologyEvents
* Updated the code that is affected by the ITopologyListener API change.
Change-Id: Ib836141d6a21e5317d645619eb685ff0b13788a2
diff --git a/src/main/java/net/onrc/onos/core/topology/ITopologyListener.java b/src/main/java/net/onrc/onos/core/topology/ITopologyListener.java
index 889db03..aa02da0 100644
--- a/src/main/java/net/onrc/onos/core/topology/ITopologyListener.java
+++ b/src/main/java/net/onrc/onos/core/topology/ITopologyListener.java
@@ -1,46 +1,15 @@
package net.onrc.onos.core.topology;
-import java.util.Collection;
-
/**
- * Interface which needs to be implemented to receive Topology events from
+ * Interface that needs to be implemented to receive Topology events from
* the Topology.
*/
public interface ITopologyListener {
/**
- * Topology events.
- * <p/>
- * The recommended ordering rules for applying/processing the events is:
- * (a) Process "added" events before "removed" events.
- * (b) The ordering of the "added" events should be:
- * addedSwitchEvents, addedPortEvents, addedLinkEvents,
- * addedDeviceEvents
- * The above ordering guarantees that adding a port for example
- * will be processed after the corresponding switch itself is added.
- * (c) The ordering of the "removed" events should be:
- * removedDeviceEvents, removedLinkEvents, removedPortEvents,
- * removedSwitchEvents
- * The above ordering guarantees that removing a port for example
- * will be processed before the corresponding switch itself is
- * removed.
+ * Topology events that have been generated.
*
- * @param addedSwitchEvents the Added Switch Events.
- * @param removedSwitchEvents the Removed Switch Events.
- * @param addedPortEvents the Added Port Events.
- * @param removedPortEvents the Removed Port Events.
- * @param addedLinkEvents the Added Link Events.
- * @param removedLinkEvents the Removed Link Events.
- * @param addedDeviceEvents the Added Device Events.
- * @param removedDeviceEvents the Removed Device Events.
+ * @param topologyEvents the generated Topology Events
+ * @see TopologyEvents
*/
- // CHECKSTYLE:OFF suppress warning about too many parameters
- public void topologyEvents(Collection<SwitchEvent> addedSwitchEvents,
- Collection<SwitchEvent> removedSwitchEvents,
- Collection<PortEvent> addedPortEvents,
- Collection<PortEvent> removedPortEvents,
- Collection<LinkEvent> addedLinkEvents,
- Collection<LinkEvent> removedLinkEvents,
- Collection<DeviceEvent> addedDeviceEvents,
- Collection<DeviceEvent> removedDeviceEvents);
- // CHECKSTYLE:ON
+ public void topologyEvents(TopologyEvents topologyEvents);
}
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyEvents.java b/src/main/java/net/onrc/onos/core/topology/TopologyEvents.java
new file mode 100644
index 0000000..71b7fb5
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyEvents.java
@@ -0,0 +1,162 @@
+package net.onrc.onos.core.topology;
+
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Class for encapsulating multiple topology events.
+ * <p/>
+ * The recommended ordering rules for applying/processing the events are:
+ * <p/>
+ * (a) Process "removed" events before "added" events.
+ * <p/>
+ * (b) The processing order of the "removed" events should be:
+ * removedHostEvents, removedLinkEvents, removedPortEvents,
+ * removedSwitchEvents
+ * <p/>
+ * (c) The processing order of the "added" events should be:
+ * addedSwitchEvents, addedPortEvents, addedLinkEvents,
+ * addedHostEvents
+ * <p/>
+ * The above ordering guarantees that removing a port for example
+ * will be processed before the corresponding switch itself is
+ * removed.
+ * <p/>
+ * The above ordering guarantees that adding a port for example
+ * will be processed after the corresponding switch itself is added.
+ */
+public final class TopologyEvents {
+ private final long timestamp;
+ private final Collection<SwitchEvent> addedSwitchEvents;
+ private final Collection<SwitchEvent> removedSwitchEvents;
+ private final Collection<PortEvent> addedPortEvents;
+ private final Collection<PortEvent> removedPortEvents;
+ private final Collection<LinkEvent> addedLinkEvents;
+ private final Collection<LinkEvent> removedLinkEvents;
+ private final Collection<DeviceEvent> addedHostEvents;
+ private final Collection<DeviceEvent> removedHostEvents;
+
+ /**
+ * Constructor.
+ *
+ * @param timestamp the timestamp for the event.
+ * @param addedSwitchEvents the collection of added Switch Events.
+ * @param removedSwitchEvents the collection of removed Switch Events.
+ * @param addedPortEvents the collection of added Port Events.
+ * @param removedPortEvents the collection of removed Port Events.
+ * @param addedLinkEvents the collection of added Link Events.
+ * @param removedLinkEvents the collection of removed Link Events.
+ * @param addedHostEvents the collection of added Host Events.
+ * @param removedHostEvents the collection of removed Host Events.
+ */
+ // CHECKSTYLE:OFF suppress the warning about too many parameters
+ public TopologyEvents(long timestamp,
+ Collection<SwitchEvent> addedSwitchEvents,
+ Collection<SwitchEvent> removedSwitchEvents,
+ Collection<PortEvent> addedPortEvents,
+ Collection<PortEvent> removedPortEvents,
+ Collection<LinkEvent> addedLinkEvents,
+ Collection<LinkEvent> removedLinkEvents,
+ Collection<DeviceEvent> addedHostEvents,
+ Collection<DeviceEvent> removedHostEvents) {
+ // CHECKSTYLE:ON
+ this.timestamp = timestamp;
+ this.addedSwitchEvents =
+ Collections.unmodifiableCollection(addedSwitchEvents);
+ this.removedSwitchEvents =
+ Collections.unmodifiableCollection(removedSwitchEvents);
+ this.addedPortEvents =
+ Collections.unmodifiableCollection(addedPortEvents);
+ this.removedPortEvents =
+ Collections.unmodifiableCollection(removedPortEvents);
+ this.addedLinkEvents =
+ Collections.unmodifiableCollection(addedLinkEvents);
+ this.removedLinkEvents =
+ Collections.unmodifiableCollection(removedLinkEvents);
+ this.addedHostEvents =
+ Collections.unmodifiableCollection(addedHostEvents);
+ this.removedHostEvents =
+ Collections.unmodifiableCollection(removedHostEvents);
+ }
+
+ /**
+ * Gets the timestamp for the events.
+ *
+ * @return the timestamp for the events.
+ */
+ public long getTimestamp() {
+ return timestamp;
+ }
+
+ /**
+ * Gets the collection of added Switch Events.
+ *
+ * @return the collection of added Switch Events.
+ */
+ public Collection<SwitchEvent> getAddedSwitchEvents() {
+ return addedSwitchEvents;
+ }
+
+ /**
+ * Gets the collection of removed Switch Events.
+ *
+ * @return the collection of removed Switch Events.
+ */
+ public Collection<SwitchEvent> getRemovedSwitchEvents() {
+ return removedSwitchEvents;
+ }
+
+ /**
+ * Gets the collection of added Port Events.
+ *
+ * @return the collection of added Port Events.
+ */
+ public Collection<PortEvent> getAddedPortEvents() {
+ return addedPortEvents;
+ }
+
+ /**
+ * Gets the collection of removed Port Events.
+ *
+ * @return the collection of removed Port Events.
+ */
+ public Collection<PortEvent> getRemovedPortEvents() {
+ return removedPortEvents;
+ }
+
+ /**
+ * Gets the collection of added Link Events.
+ *
+ * @return the collection of added Link Events.
+ */
+ public Collection<LinkEvent> getAddedLinkEvents() {
+ return addedLinkEvents;
+ }
+
+ /**
+ * Gets the collection of removed Link Events.
+ *
+ * @return the collection of removed Link Events.
+ */
+ public Collection<LinkEvent> getRemovedLinkEvents() {
+ return removedLinkEvents;
+ }
+
+ /**
+ * Gets the collection of added Host Events.
+ *
+ * @return the collection of added Host Events.
+ */
+ public Collection<DeviceEvent> getAddedHostEvents() {
+ return addedHostEvents;
+ }
+
+ /**
+ * Gets the collection of removed Host Events.
+ *
+ * @return the collection of removed Host Events.
+ */
+ public Collection<DeviceEvent> getRemovedHostEvents() {
+ return removedHostEvents;
+ }
+}
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
index 3cff46a..3a07693 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
@@ -27,10 +27,13 @@
import net.onrc.onos.core.util.Dpid;
import net.onrc.onos.core.util.EventEntry;
import net.onrc.onos.core.util.SwitchPort;
+import net.onrc.onos.core.util.serializers.KryoFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.esotericsoftware.kryo.Kryo;
+
/**
* The TopologyManager receives topology updates from the southbound discovery
* modules and from other ONOS instances. These updates are processed and
@@ -59,6 +62,7 @@
private final TopologyImpl topology = new TopologyImpl();
private final IControllerRegistryService registryService;
private CopyOnWriteArrayList<ITopologyListener> topologyListeners;
+ private Kryo kryo = KryoFactory.newKryoObject();
//
// Local state for keeping track of reordered events.
@@ -457,16 +461,19 @@
}
// Deliver the events
+ long timestamp = System.nanoTime();
for (ITopologyListener listener : this.topologyListeners) {
- // TODO: Should copy before handing them over to listener?
- listener.topologyEvents(apiAddedSwitchEvents,
- apiRemovedSwitchEvents,
- apiAddedPortEvents,
- apiRemovedPortEvents,
- apiAddedLinkEvents,
- apiRemovedLinkEvents,
- apiAddedDeviceEvents,
- apiRemovedDeviceEvents);
+ TopologyEvents events =
+ new TopologyEvents(timestamp,
+ kryo.copy(apiAddedSwitchEvents),
+ kryo.copy(apiRemovedSwitchEvents),
+ kryo.copy(apiAddedPortEvents),
+ kryo.copy(apiRemovedPortEvents),
+ kryo.copy(apiAddedLinkEvents),
+ kryo.copy(apiRemovedLinkEvents),
+ kryo.copy(apiAddedDeviceEvents),
+ kryo.copy(apiRemovedDeviceEvents));
+ listener.topologyEvents(events);
}
//