CORD-12:Adding support for port statistics REST API

Change-Id: Ibf0f7848ed891500e797d8f66bf7cd785b41c29c
This commit is contained in:
Srikanth Vavilapalli 2015-11-24 14:15:01 -08:00 committed by Gerrit Code Review
parent a6b2e92e0f
commit d120f5c1ae
6 changed files with 226 additions and 0 deletions

View File

@ -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");
} }

View File

@ -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())

View File

@ -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;
}
}

View File

@ -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();
}
} }

View File

@ -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"

View 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
}
}
}
}
}
}
}
}
}