Skip to content
Snippets Groups Projects
Commit 4edcbb14 authored by abat's avatar abat
Browse files

Merge into master from pull request #3723:

add host events - add/delete/moved/update (https://github.com/bigswitch/bigswitchcontroller/pull/3723)
parents c2f2804c 19a64c18
No related branches found
No related tags found
No related merge requests found
......@@ -3,10 +3,12 @@ package net.floodlightcontroller.debugevent;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.floodlightcontroller.debugevent.IDebugEventService.EventColumn;
import net.floodlightcontroller.debugevent.IDebugEventService.EventFieldType;
import net.floodlightcontroller.devicemanager.SwitchPort;
import net.floodlightcontroller.packet.IPv4;
import org.openflow.util.HexString;
......@@ -135,6 +137,48 @@ public class Event {
retMap.put(ec.name(), HexString.toHexString((Long) obj, 6));
} else if (ec.description() == EventFieldType.IPv4) {
retMap.put(ec.name(), IPv4.fromIPv4Address((Integer) obj));
} else if (ec.description() == EventFieldType.LIST_IPV4) {
@SuppressWarnings("unchecked")
List<Integer> ipv4Addresses = (List<Integer>)obj;
StringBuilder ipv4AddressesStr = new StringBuilder();
if (ipv4Addresses.size() == 0) {
ipv4AddressesStr.append("--");
} else {
for (Integer ipv4Addr : ipv4Addresses) {
ipv4AddressesStr.append(IPv4.fromIPv4Address(ipv4Addr.intValue()));
ipv4AddressesStr.append(" ");
}
}
retMap.put(ec.name(), ipv4AddressesStr.toString());
} else if (ec.description() ==
EventFieldType.LIST_ATTACHMENT_POINT) {
@SuppressWarnings("unchecked")
List<SwitchPort> aps = (List<SwitchPort>)obj;
StringBuilder apsStr = new StringBuilder();
if (aps.size() == 0) {
apsStr.append("--");
} else {
for (SwitchPort ap : aps) {
apsStr.append(HexString.toHexString(ap.getSwitchDPID()));
apsStr.append("/");
apsStr.append(ap.getPort());
apsStr.append(" ");
}
}
retMap.put(ec.name(), apsStr.toString());
} else if (ec.description() == EventFieldType.LIST_VLAN) {
@SuppressWarnings("unchecked")
List<Short> vlanIds = (List<Short>)obj;
StringBuilder vlanIdsStr = new StringBuilder();
if (vlanIds.size() == 0) {
vlanIdsStr.append("--");
} else {
for (Short vlanId : vlanIds) {
vlanIdsStr.append(vlanId.toString());
vlanIdsStr.append(" ");
}
}
retMap.put(ec.name(), vlanIdsStr.toString());
} else {
retMap.put(ec.name(), obj.toString());
}
......
......@@ -25,7 +25,8 @@ public interface IDebugEventService extends IFloodlightService {
* Describes the type of field obtained from reflection
*/
enum EventFieldType {
DPID, IPv4, MAC, STRING, OBJECT, PRIMITIVE
DPID, IPv4, MAC, STRING, OBJECT, PRIMITIVE, LIST_IPV4,
LIST_ATTACHMENT_POINT, LIST_VLAN
}
/**
......
......@@ -18,6 +18,7 @@
package net.floodlightcontroller.devicemanager.internal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
......@@ -57,6 +58,13 @@ import net.floodlightcontroller.debugcounter.IDebugCounterService;
import net.floodlightcontroller.debugcounter.IDebugCounterService.CounterException;
import net.floodlightcontroller.debugcounter.NullDebugCounter;
import net.floodlightcontroller.debugcounter.IDebugCounterService.CounterType;
import net.floodlightcontroller.debugevent.IDebugEventService;
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 net.floodlightcontroller.debugevent.IEventUpdater;
import net.floodlightcontroller.debugevent.NullDebugEvent;
import net.floodlightcontroller.devicemanager.IDevice;
import net.floodlightcontroller.devicemanager.IDeviceService;
import net.floodlightcontroller.devicemanager.IEntityClass;
......@@ -162,6 +170,12 @@ IFlowReconcileListener, IInfoProvider {
public IDebugCounter cntConsolidateStoreDevicesRemoved;
public IDebugCounter cntTransitionToMaster;
/**
* Debug Events
*/
private IDebugEventService debugEvents;
private IEventUpdater<DeviceEvent> evDevice;
private boolean isMaster = false;
static final String DEVICE_SYNC_STORE_NAME =
......@@ -659,6 +673,69 @@ IFlowReconcileListener, IInfoProvider {
}
}
// ***************
// IDeviceListener
// ***************
private class DeviceDebugEventLogger implements IDeviceListener {
@Override
public String getName() {
return "deviceDebugEventLogger";
}
@Override
public boolean isCallbackOrderingPrereq(String type, String name) {
return false;
}
@Override
public boolean isCallbackOrderingPostreq(String type, String name) {
return false;
}
@Override
public void deviceAdded(IDevice device) {
generateDeviceEvent(device, "host-added");
}
@Override
public void deviceRemoved(IDevice device) {
generateDeviceEvent(device, "host-removed");
}
@Override
public void deviceMoved(IDevice device) {
generateDeviceEvent(device, "host-moved");
}
@Override
public void deviceIPV4AddrChanged(IDevice device) {
generateDeviceEvent(device, "host-ipv4-addr-changed");
}
@Override
public void deviceVlanChanged(IDevice device) {
generateDeviceEvent(device, "host-vlan-changed");
}
private void generateDeviceEvent(IDevice device, String reason) {
List<Integer> ipv4Addresses =
new ArrayList<Integer>(Arrays.asList(device.getIPv4Addresses()));
List<SwitchPort> oldAps =
new ArrayList<SwitchPort>(Arrays.asList(device.getOldAP()));
List<SwitchPort> currentAps =
new ArrayList<SwitchPort>(Arrays.asList(device.getAttachmentPoints()));
List<Short> vlanIds =
new ArrayList<Short>(Arrays.asList(device.getVlanId()));
evDevice.updateEventNoFlush(
new DeviceEvent(device.getMACAddress(),
ipv4Addresses,
oldAps,
currentAps,
vlanIds, reason));
}
}
// *************
// IInfoProvider
// *************
......@@ -832,10 +909,27 @@ IFlowReconcileListener, IInfoProvider {
this.flowReconcileEngine = fmc.getServiceImpl(IFlowReconcileEngineService.class);
this.entityClassifier = fmc.getServiceImpl(IEntityClassifierService.class);
this.debugCounters = fmc.getServiceImpl(IDebugCounterService.class);
this.debugEvents = fmc.getServiceImpl(IDebugEventService.class);
this.syncService = fmc.getServiceImpl(ISyncService.class);
this.deviceSyncManager = new DeviceSyncManager();
this.haListenerDelegate = new HAListenerDelegate();
registerDeviceManagerDebugCounters();
registerDeviceManagerDebugEvents();
this.addListener(new DeviceDebugEventLogger());
}
private void registerDeviceManagerDebugEvents() throws FloodlightModuleException {
if (debugEvents == null) {
debugEvents = new NullDebugEvent();
}
try {
evDevice =
debugEvents.registerEvent(PACKAGE, "hostevent",
"Host added, removed, updated, or moved",
EventType.ALWAYS_LOG, DeviceEvent.class, 500);
} catch (MaxEventsRegistered e) {
throw new FloodlightModuleException("Max events registered", e);
}
}
@Override
......@@ -2493,4 +2587,37 @@ IFlowReconcileListener, IInfoProvider {
IHAListener getHAListener() {
return this.haListenerDelegate;
}
/**
* Device Event Class used to log Device related events
*/
private class DeviceEvent {
@EventColumn(name = "MAC", description = EventFieldType.MAC)
private final long macAddress;
@EventColumn(name = "IPs", description = EventFieldType.LIST_IPV4)
private final List<Integer> ipv4Addresses;
@EventColumn(name = "Old Attachment Points",
description = EventFieldType.LIST_ATTACHMENT_POINT)
private final List<SwitchPort> oldAttachmentPoints;
@EventColumn(name = "Current Attachment Points",
description = EventFieldType.LIST_ATTACHMENT_POINT)
private final List<SwitchPort> currentAttachmentPoints;
@EventColumn(name = "VLAN IDs", description = EventFieldType.LIST_VLAN)
private final List<Short> vlanIds;
@EventColumn(name = "Reason", description = EventFieldType.STRING)
private final String reason;
public DeviceEvent(long macAddress, List<Integer> ipv4Addresses,
List<SwitchPort> oldAttachmentPoints,
List<SwitchPort> currentAttachmentPoints,
List<Short> vlanIds, String reason) {
super();
this.macAddress = macAddress;
this.ipv4Addresses = ipv4Addresses;
this.oldAttachmentPoints = oldAttachmentPoints;
this.currentAttachmentPoints = currentAttachmentPoints;
this.vlanIds = vlanIds;
this.reason = reason;
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment