[Falcon][ONOS-3537] Implement control message collecting logic w/ unit test
Change-Id: Ic21d476a5ad92d7ef739fa3c13dcc06e5cbf7c56
diff --git a/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java b/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
index c6a4440..0950166 100644
--- a/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
+++ b/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
@@ -140,6 +140,12 @@
private final InternalDeviceProvider listener = new InternalDeviceProvider();
+ private final IncomingMessageProvider inMsgListener = new IncomingMessageProvider();
+
+ private final OutgoingMessageProvider outMsgListener = new OutgoingMessageProvider();
+
+ private boolean isCtrlMsgMonitor;
+
// TODO: We need to make the poll interval configurable.
static final int POLL_INTERVAL = 5;
@Property(name = "PortStatsPollFrequency", intValue = POLL_INTERVAL,
@@ -161,6 +167,7 @@
providerService = providerRegistry.register(this);
controller.addListener(listener);
controller.addEventListener(listener);
+
connectInitialDevices();
LOG.info("Started");
}
@@ -264,6 +271,31 @@
LOG.debug("Accepting mastership role change for device {}", deviceId);
}
+
+ /**
+ * Enable OpenFlow control message monitoring.
+ */
+ public void enableCtrlMsgMonitor() {
+ isCtrlMsgMonitor = true;
+ controller.addEventListener(inMsgListener);
+ for (OpenFlowSwitch sw : controller.getSwitches()) {
+ sw.addEventListener(outMsgListener);
+ }
+ LOG.info("Enable control message monitoring.");
+ }
+
+ /**
+ * Disable OpenFlow control message monitoring.
+ */
+ public void disableCtrlMsgMonitor() {
+ isCtrlMsgMonitor = false;
+ controller.removeEventListener(inMsgListener);
+ for (OpenFlowSwitch sw: controller.getSwitches()) {
+ sw.removeEventListener(outMsgListener);
+ }
+ LOG.info("Disable control message monitoring");
+ }
+
private void pushPortMetrics(Dpid dpid, List<OFPortStatsEntry> portStatsEntries) {
DeviceId deviceId = DeviceId.deviceId(dpid.uri(dpid));
Collection<PortStatistics> stats = buildPortStatistics(deviceId, portStatsEntries);
@@ -304,6 +336,32 @@
}
+ /**
+ * A listener for incoming OpenFlow messages.
+ */
+ private class IncomingMessageProvider implements OpenFlowEventListener {
+
+ @Override
+ public void handleMessage(Dpid dpid, OFMessage msg) {
+ if (isCtrlMsgMonitor) {
+ // TODO: feed the control message stats via ControlMetricsServiceFactory
+ }
+ }
+ }
+
+ /**
+ * A listener for outgoing OpenFlow messages.
+ */
+ private class OutgoingMessageProvider implements OpenFlowEventListener {
+
+ @Override
+ public void handleMessage(Dpid dpid, OFMessage msg) {
+ if (isCtrlMsgMonitor) {
+ // TODO: feed the control message stats via ControlMetricsServiceFactory
+ }
+ }
+ }
+
private class InternalDeviceProvider implements OpenFlowSwitchListener, OpenFlowEventListener {
private HashMap<Dpid, List<OFPortStatsEntry>> portStatsReplies = new HashMap<>();
@@ -319,6 +377,11 @@
return;
}
+ if (isCtrlMsgMonitor) {
+ // start to monitor the outgoing control messages
+ sw.addEventListener(outMsgListener);
+ }
+
ChassisId cId = new ChassisId(dpid.value());
SparseAnnotations annotations = DefaultAnnotations.builder()
@@ -359,6 +422,14 @@
if (collector != null) {
collector.stop();
}
+
+ OpenFlowSwitch sw = controller.getSwitch(dpid);
+ if (sw != null) {
+ if (isCtrlMsgMonitor) {
+ // stop monitoring the outgoing control messages
+ sw.removeEventListener(outMsgListener);
+ }
+ }
}
@Override
diff --git a/providers/openflow/device/src/test/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProviderTest.java b/providers/openflow/device/src/test/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProviderTest.java
index d0838bb..e0ab8e6 100644
--- a/providers/openflow/device/src/test/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProviderTest.java
+++ b/providers/openflow/device/src/test/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProviderTest.java
@@ -398,6 +398,14 @@
return "1.2.3.4:1";
}
+ @Override
+ public void addEventListener(OpenFlowEventListener listener) {
+ }
+
+ @Override
+ public void removeEventListener(OpenFlowEventListener listener) {
+ }
+
}
}
diff --git a/providers/openflow/group/src/test/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProviderTest.java b/providers/openflow/group/src/test/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProviderTest.java
index f923c6f..da065d7 100644
--- a/providers/openflow/group/src/test/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProviderTest.java
+++ b/providers/openflow/group/src/test/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProviderTest.java
@@ -408,5 +408,13 @@
return null;
}
+ @Override
+ public void addEventListener(OpenFlowEventListener listener) {
+ }
+
+ @Override
+ public void removeEventListener(OpenFlowEventListener listener) {
+ }
+
}
}
\ No newline at end of file
diff --git a/providers/openflow/packet/src/test/java/org/onosproject/provider/of/packet/impl/OpenFlowPacketProviderTest.java b/providers/openflow/packet/src/test/java/org/onosproject/provider/of/packet/impl/OpenFlowPacketProviderTest.java
index 5fded92..4493bba 100644
--- a/providers/openflow/packet/src/test/java/org/onosproject/provider/of/packet/impl/OpenFlowPacketProviderTest.java
+++ b/providers/openflow/packet/src/test/java/org/onosproject/provider/of/packet/impl/OpenFlowPacketProviderTest.java
@@ -425,6 +425,14 @@
return "1.2.3.4:1";
}
+ @Override
+ public void addEventListener(OpenFlowEventListener listener) {
+ }
+
+ @Override
+ public void removeEventListener(OpenFlowEventListener listener) {
+ }
+
}