Giant patch of changes to support OpenFlow 1.3
The following people have contributed to this patch:
- Ali Al-Shabibi <alshabibi.ali@gmail.com>
- Ayaka Koshibe <ayaka@onlab.us>
- Brian O'Connor <bocon@onlab.us>
- Jonathan Hart <jono@onlab.us>
- Matteo Gerola <mgerola@create-net.org>
- Michele Santuari <michele.santuari@create-net.org>
- Pavlin Radoslavov <pavlin@onlab.us>
- Saurav Das <sauravdas@alumni.stanford.edu>
- Toshio Koide <t-koide@onlab.us>
- Yuta HIGUCHI <y-higuchi@onlab.us>
The patch includes the following changes:
- New Floodlight I/O loop / state machine
- New switch/port handling
- New role management (incl. Role.EQUAL)
- Added Floodlight debug framework
- Updates to Controller.java
- Move to Loxigen's OpenflowJ library
- Added OF1.3 support
- Added support for different switches (via DriverManager)
- Updated ONOS modules to use new APIs
- Added and updated unit tests
Change-Id: Ic70a8d50f7136946193d2ba2e4dc0b4bfac5f599
diff --git a/src/main/java/net/floodlightcontroller/debugevent/DebugEventAppender.java b/src/main/java/net/floodlightcontroller/debugevent/DebugEventAppender.java
new file mode 100644
index 0000000..3429675
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/debugevent/DebugEventAppender.java
@@ -0,0 +1,96 @@
+package net.floodlightcontroller.debugevent;
+
+import net.floodlightcontroller.debugevent.IDebugEventService.EventColumn;
+import net.floodlightcontroller.debugevent.IDebugEventService.EventFieldType;
+import net.floodlightcontroller.debugevent.IDebugEventService.EventType;
+import net.floodlightcontroller.debugevent.IDebugEventService.MaxEventsRegistered;
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.UnsynchronizedAppenderBase;
+
+public class DebugEventAppender<E> extends UnsynchronizedAppenderBase<E> {
+ static IDebugEventService debugEvent;
+ static IEventUpdater<WarnErrorEvent> evWarnError;
+ static Thread debugEventRegistryTask = new Thread() {
+ @Override
+ public void run() {
+ while(DebugEventAppender.debugEvent == null) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ return;
+ }
+ }
+ //safe to register debugEvent
+ registerDebugEventQueue();
+ }
+ };
+
+ @Override
+ public void start() {
+ DebugEventAppender.debugEventRegistryTask.start();
+ super.start();
+ }
+
+ public static void setDebugEventServiceImpl(IDebugEventService debugEvent) {
+ DebugEventAppender.debugEvent = debugEvent;
+ // It is now ok to register an event Q - but letting this thread go
+ // since it was called from a startUp() routine
+ }
+
+ /**
+ * The logging system calls append for every log message. This method filters
+ * out the WARN and ERROR message and adds to a debug event queue that can
+ * be accessed via cli or rest-api or gui.
+ */
+ @Override
+ protected void append(E eventObject) {
+ if (!isStarted()) {
+ return;
+ }
+ if (evWarnError != null) {
+ ILoggingEvent ev = ((ILoggingEvent) eventObject);
+ if (ev.getLevel().equals(Level.ERROR) || ev.getLevel().equals(Level.WARN)) {
+ evWarnError.updateEventWithFlush(
+ new WarnErrorEvent(ev.getFormattedMessage(), ev.getLevel(),
+ ev.getThreadName(), ev.getLoggerName()));
+ }
+ }
+ }
+
+ private static void registerDebugEventQueue() {
+ try {
+ evWarnError = debugEvent.registerEvent("net.floodlightcontroller.core",
+ "warn-error-queue",
+ "all WARN and ERROR logs",
+ EventType.ALWAYS_LOG, WarnErrorEvent.class,
+ 100);
+ } catch (MaxEventsRegistered e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ public static class WarnErrorEvent {
+ @EventColumn(name = "message", description = EventFieldType.STRING)
+ String message;
+
+ @EventColumn(name = "level", description = EventFieldType.OBJECT)
+ Level level;
+
+ @EventColumn(name = "threadName", description = EventFieldType.STRING)
+ String threadName;
+
+ @EventColumn(name = "logger", description = EventFieldType.OBJECT)
+ String logger;
+
+ public WarnErrorEvent(String message, Level level, String threadName,
+ String logger) {
+ this.message = message;
+ this.level = level;
+ this.threadName = threadName;
+ this.logger = logger;
+ }
+ }
+
+}