queryCtxResolver) {
+ if (queryCtxResolver != null) {
+ queryContext = queryCtxResolver.getContext(QueryContext.class);
+ }
+ }
@Context
public void setSecurityContext(SecurityContext context) {
- username = context.getUserPrincipal().getName();
+ if (context != null && context.getUserPrincipal() != null) username = context.getUserPrincipal().getName();
}
protected String getUserName() {
@@ -111,17 +117,20 @@ public class StatisticsNorthbound {
* controller is "default".
* @return List of FlowStatistics from all the Nodes
*
- *
+ *
+ *
* Example:
- * Request URL: localhost:8080/controller/nb/v2/statistics/default/flow
*
- * Response in JSON:
+ * Request URL:
+ * http://localhost:8080/controller/nb/v2/statistics/default/flow
+ *
+ * Response body in JSON:
* {
* "flowStatistics": [
* {
* "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:02"
+ * "id":"00:00:00:00:00:00:00:02",
+ * "type":"OF"
* },
* "flowStatistic": [
* {
@@ -142,12 +151,12 @@ public class StatisticsNorthbound {
* "actions": {
* "@type": "output",
* "port": {
- * "@type": "OF",
- * "@id": "3",
- * "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:02"
- * }
+ * "node":{
+ * "id":"00:00:00:00:00:00:00:02",
+ * "type":"OF"
+ * },
+ * "id":"3",
+ * "type":"OF"
* }
* },
* "priority": "1",
@@ -171,11 +180,15 @@ public class StatisticsNorthbound {
*
* ]
* }
- * Response in XML:
+ *
+ * Response body in XML:
* <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
* <list>
* <flowStatistics>
- * <node type="OF" id="00:00:00:00:00:00:00:02"/>
+ * <node>
+ * <id>00:00:00:00:00:00:00:02</id>
+ * <type>OF</type>
+ * </node>
* <flowStatistic>
* <flow>
* <match>
@@ -191,8 +204,13 @@ public class StatisticsNorthbound {
* </match>
* <actions
* xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="output">
- * <port type="OF" id="3">
- * <node type="OF" id="00:00:00:00:00:00:00:02"/>
+ * <port>
+ * <node>
+ * <id>00:00:00:00:00:00:00:02</id>
+ * <type>OF</type>
+ * </node>
+ * <id>3</id>
+ * <type>OF</type>
* </port>
* </actions>
* <priority>1</priority>
@@ -226,7 +244,8 @@ public class StatisticsNorthbound {
@ResponseCode(code = 404, condition = "The containerName is not found"),
@ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") })
public AllFlowStatistics getFlowStatistics(
- @PathParam("containerName") String containerName) {
+ @PathParam("containerName") String containerName,
+ @QueryParam("_q") String queryString) {
if (!NorthboundUtils.isAuthorized(
getUserName(), containerName, Privilege.READ, this)) {
throw new UnauthorizedException(
@@ -257,7 +276,12 @@ public class StatisticsNorthbound {
FlowStatistics stat = new FlowStatistics(node, flowStats);
statistics.add(stat);
}
- return new AllFlowStatistics(statistics);
+ AllFlowStatistics result = new AllFlowStatistics(statistics);
+ if (queryString != null) {
+ queryContext.createQuery(queryString, AllFlowStatistics.class)
+ .filter(result, FlowStatistics.class);
+ }
+ return result;
}
/**
@@ -272,16 +296,18 @@ public class StatisticsNorthbound {
* Node Identifier
* @return List of Flow Statistics for a given Node. *
*
- *
+ *
+ *
* Example:
+ *
* Request URL:
- * http://host:8080/controller/nb/v2/statistics/default/flow/node/OF/00:00:00:00:00:00:00:01
+ * http://localhost:8080/controller/nb/v2/statistics/default/flow/node/OF/00:00:00:00:00:00:00:01
*
- * Response in JSON:
+ * Response body in JSON:
* {
* "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:01"
+ * "id":"00:00:00:00:00:00:00:01",
+ * "type":"OF"
* },
* "flowStatistic": [
* {
@@ -306,13 +332,13 @@ public class StatisticsNorthbound {
* },
* {
* "@type": "output",
- * "port": {
- * "@type": "OF",
- * "@id": "5",
- * "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:01"
- * }
+ * "port":{
+ * "node":{
+ * "id":"00:00:00:00:00:00:00:01",
+ * "type":"OF"
+ * },
+ * "id":"5",
+ * "type":"OF"
* }
* }
* ],
@@ -330,11 +356,13 @@ public class StatisticsNorthbound {
* ]
* }
*
- *
- * Response in XML:
+ * Response body in XML:
* <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
* <nodeFlowStatistics>
- * <node type="OF" id="00:00:00:00:00:00:00:02"/>
+ * <node>
+ * <id>00:00:00:00:00:00:00:02</id>
+ * <type>OF</type>
+ * </node>
* <flowStatistic>
* <flow>
* <match>
@@ -350,8 +378,13 @@ public class StatisticsNorthbound {
* </match>
* <actions
* xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="output">
- * <port type="OF" id="3">
- * <node type="OF" id="00:00:00:00:00:00:00:02"/>
+ * <port>
+ * <node>
+ * <id>00:00:00:00:00:00:00:02</id>
+ * <type>OF</type>
+ * </node>
+ * <id>3</id>
+ * <type>OF</type>
* </port>
* </actions>
* <priority>1</priority>
@@ -380,8 +413,13 @@ public class StatisticsNorthbound {
* </match>
* <actions
* xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="output">
- * <port type="OF" id="3">
- * <node type="OF" id="00:00:00:00:00:00:00:02"/>
+ * <port>
+ * <node>
+ * <id>00:00:00:00:00:00:00:02</id>
+ * <type>OF</type>
+ * </node>
+ * <id>3</id>
+ * <type>OF</type>
* </port>
* </actions>
* <priority>1</priority>
@@ -445,28 +483,30 @@ public class StatisticsNorthbound {
* @return List of all the Port Statistics across all the NodeConnectors on
* all the Nodes.
*
- *
+ *
+ *
* Example:
*
- * Requset URL: http://host:8080/controller/nb/v2/statistics/default/port
+ * Request URL:
+ * http://localhost:8080/controller/nb/v2/statistics/default/port
*
- * Response in JSON:
+ * Response body in JSON:
* {
* "portStatistics": [
* {
* "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:02"
+ * "id":"00:00:00:00:00:00:00:02",
+ * "type":"OF"
* },
* "portStatistic": [
* {
- * "nodeConnector": {
- * "@type": "OF",
- * "@id": "3",
- * "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:02"
- * }
+ * "nodeConnector":{
+ * "node":{
+ * "id":"00:00:00:00:00:00:00:02",
+ * "type":"OF"
+ * },
+ * "id":"3",
+ * "type":"OF"
* },
* "receivePackets": "182",
* "transmitPackets": "173",
@@ -483,12 +523,12 @@ public class StatisticsNorthbound {
* },
* {
* "nodeConnector": {
- * "@type": "OF",
- * "@id": "2",
- * "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:02"
- * }
+ * "node":{
+ * "id":"00:00:00:00:00:00:00:02",
+ * "type":"OF"
+ * },
+ * "id":"2",
+ * "type":"OF"
* },
* "receivePackets": "174",
* "transmitPackets": "181",
@@ -508,8 +548,8 @@ public class StatisticsNorthbound {
* },
* {
* "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:03"
+ * "id":"00:00:00:00:00:00:00:03",
+ * "type":"OF"
* },
* "portStatistic": [
* ..................
@@ -520,14 +560,22 @@ public class StatisticsNorthbound {
* ]
* }
*
- * Response in XML:
+ * Response body in XML:
* <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
* <list>
* <portStatistics>
- * <node type="OF" id="00:00:00:00:00:00:00:02"/>
- * <portStatistic>
- * <nodeConnector type="OF" id="3">
- * <node type="OF" id="00:00:00:00:00:00:00:02"/>
+ * <node>
+ * <id>00:00:00:00:00:00:00:02</id>
+ * <type>OF</type>
+ * </node>
+ * <portStatistic>
+ * <nodeConnector>
+ * <node>
+ * <id>00:00:00:00:00:00:00:02</id>
+ * <type>OF</type>
+ * </node>
+ * <id>3</id>
+ * <type>OF</type>
* </nodeConnector>
* <receivePackets>181</receivePackets>
* <transmitPackets>172</transmitPackets>
@@ -543,8 +591,13 @@ public class StatisticsNorthbound {
* <collisionCount>0</collisionCount>
* </portStatistic>
* <portStatistic>
- * <nodeConnector type="OF" id="2">
- * <node type="OF" id="00:00:00:00:00:00:00:02"/>
+ * <nodeConnector>
+ * <node>
+ * <id>00:00:00:00:00:00:00:02</id>
+ * <type>OF</type>
+ * </node>
+ * <id>2</id>
+ * <type>OF</type>
* </nodeConnector>
* <receivePackets>173</receivePackets>
* <transmitPackets>180</transmitPackets>
@@ -559,7 +612,6 @@ public class StatisticsNorthbound {
* <receiveCrcError>0</receiveCrcError>
* <collisionCount>0</collisionCount>
* </portStatistic>
- *
* </portStatistics>
* </list>
*
@@ -574,7 +626,8 @@ public class StatisticsNorthbound {
@ResponseCode(code = 404, condition = "The containerName is not found"),
@ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") })
public AllPortStatistics getPortStatistics(
- @PathParam("containerName") String containerName) {
+ @PathParam("containerName") String containerName,
+ @QueryParam("_q") String queryString) {
if (!NorthboundUtils.isAuthorized(
getUserName(), containerName, Privilege.READ, this)) {
@@ -602,7 +655,13 @@ public class StatisticsNorthbound {
PortStatistics portStat = new PortStatistics(node, stat);
statistics.add(portStat);
}
- return new AllPortStatistics(statistics);
+
+ AllPortStatistics result = new AllPortStatistics(statistics);
+ if (queryString != null) {
+ queryContext.createQuery(queryString, AllPortStatistics.class)
+ .filter(result, PortStatistics.class);
+ }
+ return result;
}
/**
@@ -619,27 +678,28 @@ public class StatisticsNorthbound {
* @return Returns a list of all the Port Statistics across all the
* NodeConnectors in a given Node.
*
- *
+ *
+ *
* Example:
*
* Request URL:
- * http://host:8080/controller/nb/v2/statistics/default/port/node/OF/00:00:00:00:00:00:00:01
+ * http://localhost:8080/controller/nb/v2/statistics/default/port/node/OF/00:00:00:00:00:00:00:01
*
- * Response in JSON:
+ * Response body in JSON:
* {
* "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:01"
+ * "id":"00:00:00:00:00:00:00:01",
+ * "type":"OF"
* },
* "portStatistic": [
* {
* "nodeConnector": {
- * "@type": "OF",
- * "@id": "3",
- * "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:01"
- * }
+ * "node":{
+ * "id":"00:00:00:00:00:00:00:01",
+ * "type":"OF"
+ * },
+ * "id":"3",
+ * "type":"OF"
* },
* "receivePackets": "171",
* "transmitPackets": "2451",
@@ -656,12 +716,12 @@ public class StatisticsNorthbound {
* },
* {
* "nodeConnector": {
- * "@type": "OF",
- * "@id": "2",
- * "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:01"
- * }
+ * "node":{
+ * "id":"00:00:00:00:00:00:00:01",
+ * "type":"OF"
+ * },
+ * "id":"2",
+ * "type":"OF"
* },
* "receivePackets": "179",
* "transmitPackets": "2443",
@@ -679,13 +739,21 @@ public class StatisticsNorthbound {
* ]
* }
*
- * Response in XML:
+ * Response body in XML:
* <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
* <nodePortStatistics>
- * <node type="OF" id="00:00:00:00:00:00:00:01"/>
+ * <node>
+ * <id>00:00:00:00:00:00:00:01</id>
+ * <type>OF</type>
+ * </node>
* <portStatistic>
- * <nodeConnector type="OF" id="2">
- * <node type="OF" id="00:00:00:00:00:00:00:01"/>
+ * <nodeConnector>
+ * <node>
+ * <id>00:00:00:00:00:00:00:01</id>
+ * <type>OF</type>
+ * </node>
+ * <id>2</id>
+ * <type>OF</type>
* </nodeConnector>
* <receivePackets>180</receivePackets>
* <transmitPackets>2594</transmitPackets>
@@ -701,8 +769,13 @@ public class StatisticsNorthbound {
* <collisionCount>0</collisionCount>
* </portStatistic>
* <portStatistic>
- * <nodeConnector type="OF" id="5">
- * <node type="OF" id="00:00:00:00:00:00:00:01"/>
+ * <nodeConnector>
+ * <node>
+ * <id>00:00:00:00:00:00:00:01</id>
+ * <type>OF</type>
+ * </node>
+ * <id>5</id>
+ * <type>OF</type>
* </nodeConnector>
* <receivePackets>2542</receivePackets>
* <transmitPackets>2719</transmitPackets>
@@ -768,34 +841,34 @@ public class StatisticsNorthbound {
*
* @return Returns a list of all the Table Statistics in a given Node.
*
- *
- *
- * Example:
+ *
*
- * Request URL:
- * http://host:8080/controller/nb/v2/statistics/default/table
+ * Example:
*
- * Response in JSON:
+ * Request URL:
+ * http://localhost:8080/controller/nb/v2/statistics/default/table
*
+ * Response body in JSON:
* {
* "tableStatistics": [
* {
* "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:02"
+ * "id":"00:00:00:00:00:00:00:02",
+ * "type":"OF"
* },
* "tableStatistic": [
* {
* "nodeTable": {
- * "@id": "0",
- * "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:02"
- * }
+ * "node":{
+ * "id":"00:00:00:00:00:00:00:02",
+ * "type":"OF"
+ * },
+ * "id":"0"
* },
* "activeCount": "11",
* "lookupCount": "816",
- * "matchedCount": "220"
+ * "matchedCount": "220",
+ * "maximumEntries": "1000"
* },
* {
* ...another table
@@ -808,35 +881,52 @@ public class StatisticsNorthbound {
* ]
* }
*
- *
- * Response in XML:
+ * Response body in XML:
* <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
* <list>
* <tableStatistics>
- * <node type="OF" id="00:00:00:00:00:00:00:01"/>
+ * <node>
+ * <id>00:00:00:00:00:00:00:01</id>
+ * <type>OF</type>
+ * </node>
* <tableStatistic>
- * <nodeTable id="0">
- * <node type="OF" id="00:00:00:00:00:00:00:01"/>
+ * <nodeTable>
+ * <node>
+ * <id>00:00:00:00:00:00:00:01</id>
+ * <type>OF</type>
+ * </node>
+ * <id>0</id>
* </nodeTable>
* <activeCount>12</activeCount>
* <lookupCount>10935</lookupCount>
* <matchedCount>10084</matchedCount>
+ * <maximumEntries>1000</maximumEntries>
* </tableStatistic>
* <tableStatistic>
- * <nodeTable id="1">
- * <node type="OF" id="00:00:00:00:00:00:00:01"/>
+ * <nodeTable>
+ * <node>
+ * <id>00:00:00:00:00:00:00:01</id>
+ * <type>OF</type>
+ * </node>
+ * <id>1</id>
* </nodeTable>
* <activeCount>0</activeCount>
* <lookupCount>0</lookupCount>
* <matchedCount>0</matchedCount>
+ * <maximumEntries>0</maximumEntries>
* </tableStatistic>
* <tableStatistic>
- * <nodeTable id="2">
- * <node type="OF" id="00:00:00:00:00:00:00:01"/>
+ * <nodeTable>
+ * <node>
+ * <id>00:00:00:00:00:00:00:01</id>
+ * <type>OF</type>
+ * </node>
+ * <id>2</id>
* </nodeTable>
* <activeCount>0</activeCount>
* <lookupCount>0</lookupCount>
* <matchedCount>0</matchedCount>
+ * <maximumEntries>0</maximumEntries>
* </tableStatistic>
* </tableStatistics>
* <tableStatistics>
@@ -857,7 +947,8 @@ public class StatisticsNorthbound {
@ResponseCode(code = 404, condition = "The containerName is not found"),
@ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") })
public AllTableStatistics getTableStatistics(
- @PathParam("containerName") String containerName) {
+ @PathParam("containerName") String containerName,
+ @QueryParam("_q") String queryString) {
if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) {
throw new UnauthorizedException("User is not authorized to perform this operation on container "
@@ -885,7 +976,12 @@ public class StatisticsNorthbound {
TableStatistics tableStat = new TableStatistics(node, stat);
statistics.add(tableStat);
}
- return new AllTableStatistics(statistics);
+ AllTableStatistics allstats = new AllTableStatistics(statistics);
+ if (queryString != null) {
+ queryContext.createQuery(queryString, AllTableStatistics.class)
+ .filter(allstats, TableStatistics.class);
+ }
+ return allstats;
}
/**
@@ -900,78 +996,97 @@ public class StatisticsNorthbound {
* Identifier (e.g. MAC address)
* @return Returns a list of all the Table Statistics in a given Node.
*
- *
+ *
*
* Example:
*
* Request URL:
- * http://host:8080/controller/nb/v2/statistics/default/table/node/OF/00:00:00:00:00:00:00:01
+ * http://localhost:8080/controller/nb/v2/statistics/default/table/node/OF/00:00:00:00:00:00:00:01
*
- * Response in JSON:
+ * Response body in JSON:
* {
* "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:01"
+ * "id":"00:00:00:00:00:00:00:01",
+ * "type":"OF"
* },
* "tableStatistic": [
* {
* "nodeTable": {
- * "@id": "0",
- * "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:01"
- * }
+ * "node":{
+ * "id":"00:00:00:00:00:00:00:01",
+ * "type":"OF"
+ * },
+ * "id":"0"
* },
* "activeCount": "12",
* "lookupCount": "11382",
- * "matchedCount": "10524"
+ * "matchedCount": "10524",
+ * "maximumEntries": "1000"
* },
* {
* "nodeTable": {
- * "@id": "1",
- * "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:01"
- * }
+ * "node":{
+ * "id":"00:00:00:00:00:00:00:01",
+ * "type":"OF"
+ * },
+ * "id":"1"
* },
* "activeCount": "0",
* "lookupCount": "0",
- * "matchedCount": "0"
+ * "matchedCount": "0",
+ * "maximumEntries": "0"
* }
* ]
* }
*
- * Response in XML:
+ * Response body in XML:
* <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
* <nodeTableStatistics>
- * <node type="OF" id="00:00:00:00:00:00:00:01"/>
+ * <node>
+ * <id>00:00:00:00:00:00:00:01</id>
+ * <type>OF</type>
+ * </node>
* <tableStatistic>
- * <nodeTable id="0">
- * <node type="OF" id="00:00:00:00:00:00:00:01"/>
+ * <nodeTable>
+ * <node>
+ * <id>00:00:00:00:00:00:00:01</id>
+ * <type>OF</type>
+ * </node>
+ * <id>0</id>
* </nodeTable>
* <activeCount>12</activeCount>
* <lookupCount>10935</lookupCount>
* <matchedCount>10084</matchedCount>
+ * <maximumEntries>1000</maximumEntries>
* </tableStatistic>
* <tableStatistic>
- * <nodeTable id="1">
- * <node type="OF" id="00:00:00:00:00:00:00:01"/>
+ * <nodeTable>
+ * <node>
+ * <id>00:00:00:00:00:00:00:01</id>
+ * <type>OF</type>
+ * </node>
+ * <id>1</id>
* </nodeTable>
* <activeCount>0</activeCount>
* <lookupCount>0</lookupCount>
* <matchedCount>0</matchedCount>
+ * <maximumEntries>0</maximumEntries>
* </tableStatistic>
* <tableStatistic>
- * <nodeTable id="2">
- * <node type="OF" id="00:00:00:00:00:00:00:01"/>
+ * <nodeTable>
+ * <node>
+ * <id>00:00:00:00:00:00:00:01</id>
+ * <type>OF</type>
+ * </node>
+ * <id>2</id>
* </nodeTable>
* <activeCount>0</activeCount>
* <lookupCount>0</lookupCount>
* <matchedCount>0</matchedCount>
+ * <maximumEntries>0</maximumEntries>
* </tableStatistic>
* </nodeTableStatistics>
*
- *
*
*/
@Path("/{containerName}/table/node/{nodeType}/{nodeId}")