package net.floodlightcontroller.debugevent; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.List; import java.util.Map; import net.floodlightcontroller.core.module.IFloodlightService; import net.floodlightcontroller.debugevent.DebugEvent.EventInfo; public interface IDebugEventService extends IFloodlightService { /** * Different event types. Events that are meant to be logged on demand * need to be separately enabled/disabled. */ public enum EventType { ALWAYS_LOG, LOG_ON_DEMAND } /** * Describes the type of field obtained from reflection */ enum EventFieldType { DPID, IPv4, MAC, STRING, OBJECT, PRIMITIVE, LIST_IPV4, LIST_ATTACHMENT_POINT, LIST_OBJECT, SREF_LIST_OBJECT, SREF_OBJECT, FLOW_MOD_FLAGS } /** * EventColumn is the only annotation given to the fields of the event * when updating an event. */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface EventColumn { String name() default "param"; EventFieldType description() default EventFieldType.PRIMITIVE; } /** * Debug Event Qualifiers */ public static final String EV_MDATA_WARN = "warn"; public static final String EV_MDATA_ERROR = "error"; /** * A limit on the maximum number of events that can be created */ public static final int MAX_EVENTS = 2000; /** * Public class for information returned in response to rest API calls. */ public class DebugEventInfo { EventInfo eventInfo; List<Map<String,String>> events; public DebugEventInfo(EventInfo eventInfo, List<Map<String, String>> eventHistory) { this.eventInfo = eventInfo; this.events = eventHistory; } public EventInfo getEventInfo() { return eventInfo; } public List<Map<String,String>> getEvents() { return events; } } /** * exception thrown when MAX_EVENTS have been registered */ public class MaxEventsRegistered extends Exception { private static final long serialVersionUID = 2609587082227510262L; } /** * Register an event for debugging. * * @param moduleName module registering event eg. linkdiscovery, virtualrouting. * @param eventName name given to event. * @param eventDescription A descriptive string describing the event. * @param eventType EventType for this event. On-demand events have to * be explicitly enabled using other methods in this API * @param eventClass A user defined class that annotates the fields * with @EventColumn. This class specifies the * fields/columns for this event. * @param bufferCapacity Number of events to store for this event in a circular * buffer. Older events will be discarded once the * buffer is full. * @param metaData variable arguments that qualify an event * eg. EV_MDATA_WARN, EV_MDATA_ERROR etc. See Debug Event Qualifiers * @return IEventUpdater with update methods that can be used to * update an event of the given eventClass * @throws MaxEventsRegistered */ public <T> IEventUpdater<T> registerEvent(String moduleName, String eventName, String eventDescription, EventType eventType, Class<T> eventClass, int bufferCapacity, String... metaData) throws MaxEventsRegistered; /** * Update the global event stores with values from the thread local stores. This * method is not typically intended for use by any module. It's typical usage is from * floodlight core for events that happen in the packet processing pipeline. * For other rare events, flushEvents should be called. */ public void flushEvents(); /** * Determine if eventName is a registered event for a given moduleName */ public boolean containsModuleEventName(String moduleName, String eventName); /** * Determine if any events have been registered for module of name moduleName */ public boolean containsModuleName(String moduleName); /** * Get event history for all events. This call can be expensive as it * formats the event histories for all events. * * @return a list of all event histories or an empty list if no events have * been registered */ public List<DebugEventInfo> getAllEventHistory(); /** * Get event history for all events registered for a given moduleName * * @return a list of all event histories for all events registered for the * the module or an empty list if there are no events for this module */ public List<DebugEventInfo> getModuleEventHistory(String moduleName); /** * Get event history for a single event * * @param moduleName registered module name * @param eventName registered event name for moduleName * @param last last X events * @return DebugEventInfo for that event, or null if the moduleEventName * does not correspond to a registered event. */ public DebugEventInfo getSingleEventHistory(String moduleName, String eventName, int last); /** * Wipe out all event history for all registered events */ public void resetAllEvents(); /** * Wipe out all event history for all events registered for a specific module * * @param moduleName registered module name */ public void resetAllModuleEvents(String moduleName); /** * Wipe out event history for a single event * @param moduleName registered module name * @param eventName registered event name for moduleName */ public void resetSingleEvent(String moduleName, String eventName); /** * Retrieve a list of moduleNames registered for debug events or an empty * list if no events have been registered in the system */ public List<String> getModuleList(); /** * Returns a list of all events registered for a specific moduleName * or a empty list */ public List<String> getModuleEventList(String moduleName); }