import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.SecurityContext;
+import javax.ws.rs.ext.ContextResolver;
import org.codehaus.enunciate.jaxrs.ResponseCode;
import org.codehaus.enunciate.jaxrs.StatusCodes;
import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException;
import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailableException;
import org.opendaylight.controller.northbound.commons.exception.UnauthorizedException;
+import org.opendaylight.controller.northbound.commons.query.QueryContext;
import org.opendaylight.controller.northbound.commons.utils.NorthboundUtils;
import org.opendaylight.controller.sal.authorization.Privilege;
import org.opendaylight.controller.sal.core.Node;
* Authentication realm : <b>opendaylight</b><br>
* Transport : <b>HTTP and HTTPS</b><br>
* <br>
- * HTTPS Authentication is disabled by default. Administrator can enable it in
- * tomcat-server.xml after adding a proper keystore / SSL certificate from a
- * trusted authority.<br>
- * More info :
- * http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration
+ * HTTPS Authentication is disabled by default.
*
*/
@Path("/")
public class StatisticsNorthbound {
private String username;
+ private QueryContext queryContext;
+ @Context
+ public void setQueryContext(ContextResolver<QueryContext> 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() {
* controller is "default".
* @return List of FlowStatistics from all the Nodes
*
- * <pre>
+ * <pre>
+ *
* 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": [
* {
* "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",
*
* ]
* }
- * 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>
* </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>
@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(
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;
}
/**
* Node Identifier
* @return List of Flow Statistics for a given Node. *
*
- * <pre>
+ * <pre>
+ *
* 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": [
* {
* },
* {
* "@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"
* }
* }
* ],
* ]
* }
*
- *
- * 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>
* </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>
* </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>
* @return List of all the Port Statistics across all the NodeConnectors on
* all the Nodes.
*
- * <pre>
+ * <pre>
+ *
* 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",
* },
* {
* "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",
* },
* {
* "node": {
- * "@type": "OF",
- * "@id": "00:00:00:00:00:00:00:03"
+ * "id":"00:00:00:00:00:00:00:03",
+ * "type":"OF"
* },
* "portStatistic": [
* ..................
* ]
* }
*
- * 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>
* <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>
* <receiveCrcError>0</receiveCrcError>
* <collisionCount>0</collisionCount>
* </portStatistic>
- *
* </portStatistics>
* </list>
* </pre>
@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)) {
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;
}
/**
* @return Returns a list of all the Port Statistics across all the
* NodeConnectors in a given Node.
*
- * <pre>
+ * <pre>
+ *
* 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",
* },
* {
* "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",
* ]
* }
*
- * 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>
* <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>
*
* @return Returns a list of all the Table Statistics in a given Node.
*
- * <pre>
- *
- * Example:
+ * <pre>
*
- * 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
* ]
* }
*
- *
- * 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>
@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 "
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;
}
/**
* Identifier (e.g. MAC address)
* @return Returns a list of all the Table Statistics in a given Node.
*
- * <pre>
+ * <pre>
*
* 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>
*
- *
* </pre>
*/
@Path("/{containerName}/table/node/{nodeType}/{nodeId}")