mirror of
https://github.com/opennetworkinglab/onos.git
synced 2025-12-16 14:52:15 +01:00
CORD-12:Adding support for port statistics REST API
Change-Id: Ibf0f7848ed891500e797d8f66bf7cd785b41c29c
This commit is contained in:
parent
a6b2e92e0f
commit
d120f5c1ae
@ -38,6 +38,7 @@ import org.onosproject.net.driver.Driver;
|
|||||||
import org.onosproject.net.flow.FlowEntry;
|
import org.onosproject.net.flow.FlowEntry;
|
||||||
import org.onosproject.net.flow.FlowRule;
|
import org.onosproject.net.flow.FlowRule;
|
||||||
import org.onosproject.net.flow.TableStatisticsEntry;
|
import org.onosproject.net.flow.TableStatisticsEntry;
|
||||||
|
import org.onosproject.net.device.PortStatistics;
|
||||||
import org.onosproject.net.flow.TrafficSelector;
|
import org.onosproject.net.flow.TrafficSelector;
|
||||||
import org.onosproject.net.flow.TrafficTreatment;
|
import org.onosproject.net.flow.TrafficTreatment;
|
||||||
import org.onosproject.net.flow.criteria.Criterion;
|
import org.onosproject.net.flow.criteria.Criterion;
|
||||||
@ -102,6 +103,7 @@ public class CodecManager implements CodecService {
|
|||||||
registerCodec(GroupBucket.class, new GroupBucketCodec());
|
registerCodec(GroupBucket.class, new GroupBucketCodec());
|
||||||
registerCodec(Load.class, new LoadCodec());
|
registerCodec(Load.class, new LoadCodec());
|
||||||
registerCodec(TableStatisticsEntry.class, new TableStatisticsEntryCodec());
|
registerCodec(TableStatisticsEntry.class, new TableStatisticsEntryCodec());
|
||||||
|
registerCodec(PortStatistics.class, new PortStatisticsCodec());
|
||||||
log.info("Started");
|
log.info("Started");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -39,6 +39,7 @@ public final class FlowEntryCodec extends JsonCodec<FlowEntry> {
|
|||||||
|
|
||||||
final ObjectNode result = context.mapper().createObjectNode()
|
final ObjectNode result = context.mapper().createObjectNode()
|
||||||
.put("id", Long.toString(flowEntry.id().value()))
|
.put("id", Long.toString(flowEntry.id().value()))
|
||||||
|
.put("tableId", flowEntry.tableId())
|
||||||
.put("appId", service.getAppId(flowEntry.appId()).name())
|
.put("appId", service.getAppId(flowEntry.appId()).name())
|
||||||
.put("groupId", flowEntry.groupId().id())
|
.put("groupId", flowEntry.groupId().id())
|
||||||
.put("priority", flowEntry.priority())
|
.put("priority", flowEntry.priority())
|
||||||
|
|||||||
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 Open Networking Laboratory
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.onosproject.codec.impl;
|
||||||
|
|
||||||
|
import org.onosproject.codec.CodecContext;
|
||||||
|
import org.onosproject.codec.JsonCodec;
|
||||||
|
import org.onosproject.net.device.PortStatistics;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Port statistics entry JSON codec.
|
||||||
|
*/
|
||||||
|
public final class PortStatisticsCodec extends JsonCodec<PortStatistics> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ObjectNode encode(PortStatistics entry, CodecContext context) {
|
||||||
|
checkNotNull(entry, "Port Statistics cannot be null");
|
||||||
|
|
||||||
|
final ObjectNode result = context.mapper().createObjectNode()
|
||||||
|
.put("port", entry.port())
|
||||||
|
.put("packetsReceived", entry.packetsReceived())
|
||||||
|
.put("packetsSent", entry.packetsSent())
|
||||||
|
.put("bytesReceived", entry.bytesReceived())
|
||||||
|
.put("bytesSent", entry.bytesSent())
|
||||||
|
.put("packetsRxDropped", entry.packetsRxDropped())
|
||||||
|
.put("packetsTxDropped", entry.packetsTxDropped())
|
||||||
|
.put("packetsRxErrors", entry.packetsRxErrors())
|
||||||
|
.put("packetsTxErrors", entry.packetsTxErrors())
|
||||||
|
.put("durationSec", entry.durationSec());
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@ -36,6 +36,7 @@ import org.onosproject.net.Device;
|
|||||||
import org.onosproject.net.DeviceId;
|
import org.onosproject.net.DeviceId;
|
||||||
import org.onosproject.net.Link;
|
import org.onosproject.net.Link;
|
||||||
import org.onosproject.net.device.DeviceService;
|
import org.onosproject.net.device.DeviceService;
|
||||||
|
import org.onosproject.net.device.PortStatistics;
|
||||||
import org.onosproject.net.flow.FlowRuleService;
|
import org.onosproject.net.flow.FlowRuleService;
|
||||||
import org.onosproject.net.flow.TableStatisticsEntry;
|
import org.onosproject.net.flow.TableStatisticsEntry;
|
||||||
import org.onosproject.net.link.LinkService;
|
import org.onosproject.net.link.LinkService;
|
||||||
@ -153,4 +154,62 @@ public class StatisticsWebResource extends AbstractWebResource {
|
|||||||
rootArrayNode.add(deviceStatsNode);
|
rootArrayNode.add(deviceStatsNode);
|
||||||
return ok(root).build();
|
return ok(root).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get port statistics of all devices.
|
||||||
|
* @rsModel StatisticsPorts
|
||||||
|
* @return JSON encoded array of port statistics
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@Path("ports")
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
public Response getPortStatistics() {
|
||||||
|
final DeviceService service = get(DeviceService.class);
|
||||||
|
final Iterable<Device> devices = service.getDevices();
|
||||||
|
final ObjectNode root = mapper().createObjectNode();
|
||||||
|
final ArrayNode rootArrayNode = root.putArray("statistics");
|
||||||
|
for (final Device device : devices) {
|
||||||
|
final ObjectNode deviceStatsNode = mapper().createObjectNode();
|
||||||
|
deviceStatsNode.put("device", device.id().toString());
|
||||||
|
final ArrayNode statisticsNode = deviceStatsNode.putArray("ports");
|
||||||
|
final Iterable<PortStatistics> portStatsEntries = service.getPortStatistics(device.id());
|
||||||
|
if (portStatsEntries != null) {
|
||||||
|
for (final PortStatistics entry : portStatsEntries) {
|
||||||
|
statisticsNode.add(codec(PortStatistics.class).encode(entry, this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rootArrayNode.add(deviceStatsNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok(root).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get port statistics of a specified devices.
|
||||||
|
* @rsModel StatisticsPorts
|
||||||
|
* @param deviceId device ID
|
||||||
|
* @return JSON encoded array of port statistics
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@Path("ports/{deviceId}")
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
public Response getPortStatisticsByDeviceId(@PathParam("deviceId") String deviceId) {
|
||||||
|
final DeviceService service = get(DeviceService.class);
|
||||||
|
final Iterable<PortStatistics> portStatsEntries =
|
||||||
|
service.getPortStatistics(DeviceId.deviceId(deviceId));
|
||||||
|
final ObjectNode root = mapper().createObjectNode();
|
||||||
|
final ArrayNode rootArrayNode = root.putArray("statistics");
|
||||||
|
final ObjectNode deviceStatsNode = mapper().createObjectNode();
|
||||||
|
deviceStatsNode.put("device", deviceId);
|
||||||
|
final ArrayNode statisticsNode = deviceStatsNode.putArray("ports");
|
||||||
|
if (portStatsEntries != null) {
|
||||||
|
for (final PortStatistics entry : portStatsEntries) {
|
||||||
|
statisticsNode.add(codec(PortStatistics.class).encode(entry, this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rootArrayNode.add(deviceStatsNode);
|
||||||
|
|
||||||
|
return ok(root).build();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,6 +16,7 @@
|
|||||||
"title": "flow",
|
"title": "flow",
|
||||||
"required": [
|
"required": [
|
||||||
"id",
|
"id",
|
||||||
|
"tableId",
|
||||||
"appId",
|
"appId",
|
||||||
"groupId",
|
"groupId",
|
||||||
"priority",
|
"priority",
|
||||||
@ -33,6 +34,11 @@
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"example": "12103425214920339"
|
"example": "12103425214920339"
|
||||||
},
|
},
|
||||||
|
"tableId": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int64",
|
||||||
|
"example": 3
|
||||||
|
},
|
||||||
"appId": {
|
"appId": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"example": "org.onosproject.core"
|
"example": "org.onosproject.core"
|
||||||
|
|||||||
107
web/api/src/main/resources/definitions/StatisticsPorts.json
Normal file
107
web/api/src/main/resources/definitions/StatisticsPorts.json
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"title": "all-port-statistics",
|
||||||
|
"required": [
|
||||||
|
"statistics"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"statistics": {
|
||||||
|
"type": "array",
|
||||||
|
"required": [
|
||||||
|
"statistics"
|
||||||
|
],
|
||||||
|
"xml": {
|
||||||
|
"name": "statistics",
|
||||||
|
"wrapped": true
|
||||||
|
},
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "statistics",
|
||||||
|
"required": [
|
||||||
|
"ports"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"deviceId": {
|
||||||
|
"type": "string",
|
||||||
|
"example": "of:0000000000000001"
|
||||||
|
},
|
||||||
|
"ports": {
|
||||||
|
"type": "array",
|
||||||
|
"xml": {
|
||||||
|
"name": "ports",
|
||||||
|
"wrapped": true
|
||||||
|
},
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "ports",
|
||||||
|
"required": [
|
||||||
|
"port",
|
||||||
|
"packetsReceived",
|
||||||
|
"packetsSent",
|
||||||
|
"bytesReceived",
|
||||||
|
"bytesSent",
|
||||||
|
"packetsRxDropped",
|
||||||
|
"packetsTxDropped",
|
||||||
|
"packetsRxErrors",
|
||||||
|
"packetsTxErrors",
|
||||||
|
"durationSec"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"port": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int64",
|
||||||
|
"example": 1
|
||||||
|
},
|
||||||
|
"packetsReceived": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int64",
|
||||||
|
"example": 98
|
||||||
|
},
|
||||||
|
"packetsSent": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int64",
|
||||||
|
"example": 98
|
||||||
|
},
|
||||||
|
"bytesReceived": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int64",
|
||||||
|
"example": 9162
|
||||||
|
},
|
||||||
|
"bytesSent": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int64",
|
||||||
|
"example": 9162
|
||||||
|
},
|
||||||
|
"packetsRxDropped": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int64",
|
||||||
|
"example": 0
|
||||||
|
},
|
||||||
|
"packetsTxDropped": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int64",
|
||||||
|
"example": 0
|
||||||
|
},
|
||||||
|
"packetsRxErrors": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int64",
|
||||||
|
"example": 0
|
||||||
|
},
|
||||||
|
"packetsTxErrors": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int64",
|
||||||
|
"example": 0
|
||||||
|
},
|
||||||
|
"durationSec": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int64",
|
||||||
|
"example": 90
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user