-GroupDesc/GroupStats Supports
-Removed tabs
-refactored SwitchStatisticResource.java.
-Added Serializer for groupDescStats
diff --git a/src/main/java/net/floodlightcontroller/core/web/OFGroupDescStatsEntryMod.java b/src/main/java/net/floodlightcontroller/core/web/OFGroupDescStatsEntryMod.java
new file mode 100644
index 0000000..e7ca358
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/core/web/OFGroupDescStatsEntryMod.java
@@ -0,0 +1,24 @@
+package net.floodlightcontroller.core.web;
+
+import org.projectfloodlight.openflow.protocol.OFGroupDescStatsEntry;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import net.floodlightcontroller.core.web.serializers.OFGroupDescStatsEntryModSerializer;
+
+@JsonSerialize(using = OFGroupDescStatsEntryModSerializer.class)
+
+public class OFGroupDescStatsEntryMod {
+ private OFGroupDescStatsEntry GroupDescStatsEntry = null;
+
+ public OFGroupDescStatsEntryMod() {
+ }
+
+ public OFGroupDescStatsEntryMod(OFGroupDescStatsEntry GroupStatsEntry) {
+ this.GroupDescStatsEntry = GroupStatsEntry;
+ }
+
+ public OFGroupDescStatsEntry getGroupDescStatsEntry() {
+ return this.GroupDescStatsEntry;
+ }
+
+}
diff --git a/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java b/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java
index 5f7b94d..c7dd69a 100644
--- a/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java
+++ b/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java
@@ -27,6 +27,8 @@
import net.floodlightcontroller.core.annotations.LogMessageDoc;
import org.projectfloodlight.openflow.protocol.OFFeaturesReply;
+import org.projectfloodlight.openflow.protocol.OFGroupDescStatsEntry;
+import org.projectfloodlight.openflow.protocol.OFGroupDescStatsReply;
import org.projectfloodlight.openflow.protocol.OFMatchV3;
import org.projectfloodlight.openflow.protocol.OFOxmList;
import org.projectfloodlight.openflow.protocol.OFPortStatsEntry;
@@ -45,7 +47,7 @@
/**
* Base class for server resources related to switches
- *
+ *
* @author readams
*/
@@ -67,13 +69,14 @@
message = "Failure retrieving statistics from switch {switch}",
explanation = "An error occurred while retrieving statistics" +
"from the switch",
- recommendation = LogMessageDoc.CHECK_SWITCH + " " +
- LogMessageDoc.GENERIC_ACTION)
- protected List<OFStatsReply> getSwitchStatistics(long switchId,
+ recommendation = LogMessageDoc.CHECK_SWITCH + " " +
+ LogMessageDoc.GENERIC_ACTION)
+
+ protected List<?> getSwitchStatistics(long switchId,
OFStatsType statType) {
IFloodlightProviderService floodlightProvider =
(IFloodlightProviderService) getContext().getAttributes().
- get(IFloodlightProviderService.class.getCanonicalName());
+ get(IFloodlightProviderService.class.getCanonicalName());
IOFSwitch sw = floodlightProvider.getSwitches().get(switchId);
Future<List<OFStatsReply>> future;
@@ -91,7 +94,57 @@
.setOutPort(OFPort.ANY)
.setTableId(TableId.ALL)
.setXid(sw.getNextTransactionId()).build();
- } /*else if (statType == OFStatisticsType.AGGREGATE) {
+ }
+ else if (statType == OFStatsType.PORT){
+ log.debug("Switch Port Stats: req sent for all "
+ + "ports in switch {}", sw.getStringId());
+ List<OFPortStatsEntryMod> portStats = null;
+ req = sw.getFactory()
+ .buildPortStatsRequest()
+ .setPortNo(OFPort.ANY).setXid
+ (sw.getNextTransactionId()).build();
+ try {
+ future = sw.getStatistics(req);
+ values = future.get(10, TimeUnit.SECONDS);
+ portStats = new ArrayList<OFPortStatsEntryMod>();
+ for (OFPortStatsEntry entry : ((OFPortStatsReply)values.get(0)).getEntries()) {
+ OFPortStatsEntryMod entryMod = new OFPortStatsEntryMod(entry);
+ portStats.add(entryMod);
+ }
+ log.debug("Switch Port Stats Entries from switch {} are {}",
+ sw.getStringId(), portStats);
+ } catch (Exception e) {
+ log.error("Failure retrieving statistics from switch " + sw, e);
+ }
+ return portStats;
+ }
+ else if (statType == OFStatsType.GROUP){
+ log.debug("Switch Group Stats: req sent for all "
+ + "ports in switch {}", sw.getStringId());
+ req = sw.getFactory().buildGroupStatsRequest().setXid
+ (sw.getNextTransactionId()).build();
+ }
+ else if (statType == OFStatsType.GROUP_DESC){
+ log.debug("Switch Group Desc Stats: req sent for all "
+ + "ports in switch {}", sw.getStringId());
+ List<OFGroupDescStatsEntryMod> GroupDescStats= new ArrayList<OFGroupDescStatsEntryMod>();
+ req = sw.getFactory().buildGroupDescStatsRequest().setXid
+ (sw.getNextTransactionId()).build();
+ try {
+ future = sw.getStatistics(req);
+ values = future.get(10, TimeUnit.SECONDS);
+ for (OFGroupDescStatsEntry entry : ((OFGroupDescStatsReply)values.get(0)).getEntries()) {
+ OFGroupDescStatsEntryMod entryMod = new OFGroupDescStatsEntryMod(entry);
+ GroupDescStats.add(entryMod);
+ }
+ log.debug("Switch Group_Desc Stats Entries from switch {} are {}",
+ sw.getStringId(), GroupDescStats);
+ } catch (Exception e) {
+ log.error("Failure retrieving statistics from switch " + sw, e);
+ }
+ return GroupDescStats;
+ }
+ /*else if (statType == OFStatisticsType.AGGREGATE) {
OFAggregateStatisticsRequest specificReq = new OFAggregateStatisticsRequest();
OFMatch match = new OFMatch();
match.setWildcards(0xffffffff);
@@ -100,7 +153,7 @@
specificReq.setTableId((byte) 0xff);
req.setStatistics(Collections.singletonList((OFStatistics) specificReq));
requestLength += specificReq.getLength();
- } /*else if (statType == OFStatisticsType.QUEUE) {
+ } /*else if (statType == OFStatisticsType.QUEUE) {
OFQueueStatisticsRequest specificReq = new OFQueueStatisticsRequest();
specificReq.setPortNumber(OFPort.OFPP_ALL.getValue());
// LOOK! openflowj does not define OFPQ_ALL! pulled this from openflow.h
@@ -108,10 +161,10 @@
specificReq.setQueueId(0xffffffff);
req.setStatistics(Collections.singletonList((OFStatistics) specificReq));
requestLength += specificReq.getLength();
- } else if (statType == OFStatisticsType.DESC ||
+ } else if (statType == OFStatisticsType.DESC ||
statType == OFStatisticsType.TABLE) {
// pass - nothing todo besides set the type above
- }*/
+ }*/
// XXX S fix when we fix stats
try {
future = sw.getStatistics(req);
@@ -123,43 +176,6 @@
return values;
}
- protected List<OFPortStatsEntryMod> getSwitchPortStatistics(long switchId) {
- IFloodlightProviderService floodlightProvider =
- (IFloodlightProviderService) getContext().getAttributes().
- get(IFloodlightProviderService.class.getCanonicalName());
-
- IOFSwitch sw = floodlightProvider.getSwitches().get(switchId);
- Future<List<OFStatsReply>> future;
- List<OFStatsReply> values = null;
- List<OFPortStatsEntryMod> portStats = null;
-
- if (sw != null) {
- log.debug("Switch Port Stats: req sent for all "
- + "ports in switch {}", sw.getStringId());
- OFPortStatsRequest req = sw.getFactory()
- .buildPortStatsRequest()
- .setPortNo(OFPort.ANY).setXid
- (sw.getNextTransactionId()).build();
-
- try {
- future = sw.getStatistics(req);
- values = future.get(10, TimeUnit.SECONDS);
- portStats = new ArrayList<OFPortStatsEntryMod>();
- for (OFPortStatsEntry entry : ((OFPortStatsReply) values.get(0))
- .getEntries()) {
- OFPortStatsEntryMod entryMod = new OFPortStatsEntryMod(entry);
- portStats.add(entryMod);
- }
- log.debug("Switch Port Stats Entries from switch {} are {}",
- sw.getStringId(), portStats);
- } catch (Exception e) {
- log.error("Failure retrieving statistics from switch " + sw, e);
- }
- }
-
- return portStats;
- }
-
protected Object getSwitchStatistics(String switchId, OFStatsType statType) {
return getSwitchStatistics(HexString.toLong(switchId), statType);
}
@@ -167,16 +183,16 @@
protected OFFeaturesReply getSwitchFeaturesReply(long switchId) {
IFloodlightProviderService floodlightProvider =
(IFloodlightProviderService) getContext().getAttributes().
- get(IFloodlightProviderService.class.getCanonicalName());
+ get(IFloodlightProviderService.class.getCanonicalName());
IOFSwitch sw = floodlightProvider.getSwitches().get(switchId);
- // uture<OFFeaturesReply> future;
+ //uture<OFFeaturesReply> future;
OFFeaturesReply featuresReply = null;
if (sw != null) {
// XXX S fix when we fix stats
try {
- // future = sw.getFeaturesReplyFromSwitch();
- // featuresReply = future.get(10, TimeUnit.SECONDS);
+ //future = sw.getFeaturesReplyFromSwitch();
+ //featuresReply = future.get(10, TimeUnit.SECONDS);
} catch (Exception e) {
log.error("Failure getting features reply from switch" + sw, e);
}
diff --git a/src/main/java/net/floodlightcontroller/core/web/SwitchStatisticsResource.java b/src/main/java/net/floodlightcontroller/core/web/SwitchStatisticsResource.java
index 28be9a4..4f45463 100644
--- a/src/main/java/net/floodlightcontroller/core/web/SwitchStatisticsResource.java
+++ b/src/main/java/net/floodlightcontroller/core/web/SwitchStatisticsResource.java
@@ -20,14 +20,14 @@
import java.util.HashMap;
import org.projectfloodlight.openflow.protocol.OFStatsType;
-import org.projectfloodlight.openflow.util.HexString;
import org.restlet.resource.Get;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
/**
* Return switch statistics information for specific switches
- *
+ *
* @author readams
*/
public class SwitchStatisticsResource extends SwitchResourceBase {
@@ -43,7 +43,7 @@
String statType = (String) getRequestAttributes().get("statType");
if (statType.equals("port")) {
- values = getSwitchPortStatistics(HexString.toLong(switchId));
+ values = getSwitchStatistics(switchId, OFStatsType.PORT);
} else if (statType.equals("queue")) {
values = getSwitchStatistics(switchId, OFStatsType.QUEUE);
} else if (statType.equals("flow")) {
@@ -56,10 +56,13 @@
values = getSwitchStatistics(switchId, OFStatsType.TABLE);
} else if (statType.equals("features")) {
values = getSwitchFeaturesReply(switchId);
+ }else if (statType.equals("groupDesc")) {
+ values = getSwitchStatistics(switchId, OFStatsType.GROUP_DESC);
+ }else if (statType.equals("groupStats")) {
+ values = getSwitchStatistics(switchId, OFStatsType.GROUP);
}
result.put(switchId, values);
return result;
- // return toRepresentation(result, null);
}
}
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/OFGroupDescStatsEntryModSerializer.java b/src/main/java/net/floodlightcontroller/core/web/serializers/OFGroupDescStatsEntryModSerializer.java
new file mode 100644
index 0000000..097290b
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/core/web/serializers/OFGroupDescStatsEntryModSerializer.java
@@ -0,0 +1,54 @@
+package net.floodlightcontroller.core.web.serializers;
+import java.io.IOException;
+import java.util.List;
+
+import net.floodlightcontroller.core.web.OFGroupDescStatsEntryMod;
+
+import org.codehaus.jackson.JsonGenerationException;
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.map.SerializerProvider;
+import org.codehaus.jackson.map.ser.std.SerializerBase;
+import org.projectfloodlight.openflow.protocol.OFActionType;
+import org.projectfloodlight.openflow.protocol.OFBucket;
+import org.projectfloodlight.openflow.protocol.OFGroupDescStatsEntry;
+import org.projectfloodlight.openflow.protocol.action.OFAction;
+import org.projectfloodlight.openflow.protocol.action.*;
+public class OFGroupDescStatsEntryModSerializer extends SerializerBase<OFGroupDescStatsEntryMod>{
+
+
+
+ protected OFGroupDescStatsEntryModSerializer(){
+ super(OFGroupDescStatsEntryMod.class);
+ }
+
+ @Override
+ public void serialize(OFGroupDescStatsEntryMod GroupDescStatsModEntry, JsonGenerator jGen,
+ SerializerProvider sp) throws IOException,
+ JsonGenerationException {
+ OFGroupDescStatsEntry GroupStatsEntryMod = GroupDescStatsModEntry.getGroupDescStatsEntry();
+ List<OFBucket> Buckets = GroupStatsEntryMod.getBuckets();
+ jGen.writeStartObject();
+ jGen.writeNumberField("groupId", GroupStatsEntryMod.getGroup().getGroupNumber());
+ jGen.writeStringField("groupType", GroupStatsEntryMod.getGroupType().name());
+ for (OFBucket bucket : Buckets){
+ List<OFAction> actions = bucket.getActions();
+ for (OFAction action : actions ){
+ if(action.getType().compareTo(OFActionType.SET_FIELD) == 0){
+ //TODO: Need better if condition.
+ if (((OFActionSetField)action).getField().toString().contains("OFOxmEthSrcVer13")){
+ jGen.writeStringField("SET_DL_SRC", ((OFActionSetField)action).getField().getValue().toString());
+ }
+ else if (((OFActionSetField)action).getField().toString().contains("OFOxmEthDstVer13")){
+ jGen.writeStringField("SET_DL_DST", ((OFActionSetField)action).getField().getValue().toString());
+ }
+ }
+ else if(action.getType().compareTo(OFActionType.OUTPUT) == 0){
+ jGen.writeNumberField("OUTPPUT", ((OFActionOutput)action).getPort().getPortNumber());
+ }
+ }
+ }
+ jGen.writeEndObject();
+
+ }
+
+}