blob: 966718278da11c4eb9e26ef7a9c3675dea562814 [file] [log] [blame]
Ray Milkeyb9af9462015-07-17 11:12:09 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
Ray Milkeyb9af9462015-07-17 11:12:09 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.rest.resources;
17
18import java.util.Spliterator;
19import java.util.Spliterators;
20import java.util.stream.StreamSupport;
21
22import javax.ws.rs.GET;
23import javax.ws.rs.Path;
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -070024import javax.ws.rs.PathParam;
Ray Milkeyb9af9462015-07-17 11:12:09 -070025import javax.ws.rs.Produces;
26import javax.ws.rs.QueryParam;
27import javax.ws.rs.core.Context;
28import javax.ws.rs.core.MediaType;
29import javax.ws.rs.core.Response;
30import javax.ws.rs.core.UriBuilder;
31import javax.ws.rs.core.UriInfo;
32
33import org.onosproject.codec.JsonCodec;
34import org.onosproject.net.ConnectPoint;
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -070035import org.onosproject.net.Device;
36import org.onosproject.net.DeviceId;
Ray Milkeyb9af9462015-07-17 11:12:09 -070037import org.onosproject.net.Link;
Viswanath KSP8ffb7752016-08-23 22:19:06 +053038import org.onosproject.net.PortNumber;
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -070039import org.onosproject.net.device.DeviceService;
Srikanth Vavilapallid120f5c2015-11-24 14:15:01 -080040import org.onosproject.net.device.PortStatistics;
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -070041import org.onosproject.net.flow.FlowRuleService;
42import org.onosproject.net.flow.TableStatisticsEntry;
Ray Milkeyb9af9462015-07-17 11:12:09 -070043import org.onosproject.net.link.LinkService;
44import org.onosproject.net.statistic.Load;
45import org.onosproject.net.statistic.StatisticService;
46import org.onosproject.rest.AbstractWebResource;
47
48import com.fasterxml.jackson.databind.node.ArrayNode;
49import com.fasterxml.jackson.databind.node.ObjectNode;
50
51import static org.onosproject.net.DeviceId.deviceId;
52import static org.onosproject.net.PortNumber.portNumber;
53
54/**
Laszlo Pappb2a91f22018-01-10 16:41:22 +000055 * Query statistics.
Ray Milkeyb9af9462015-07-17 11:12:09 -070056 */
57@Path("statistics")
58public class StatisticsWebResource extends AbstractWebResource {
59 @Context
Jian Licc730a62016-05-10 16:36:16 -070060 private UriInfo uriInfo;
Ray Milkeyb9af9462015-07-17 11:12:09 -070061
62 /**
Jian Licc730a62016-05-10 16:36:16 -070063 * Gets load statistics for all links or for a specific link.
64 *
Andrea Campanella10c4adc2015-12-03 15:27:54 -080065 * @onos.rsModel StatisticsFlowsLink
Ray Milkeyb9af9462015-07-17 11:12:09 -070066 * @param deviceId (optional) device ID for a specific link
67 * @param port (optional) port number for a specified link
Jian Licc730a62016-05-10 16:36:16 -070068 * @return 200 OK with JSON encoded array of Load objects
Ray Milkeyb9af9462015-07-17 11:12:09 -070069 */
70 @GET
71 @Path("flows/link")
72 @Produces(MediaType.APPLICATION_JSON)
73 public Response getLoads(@QueryParam("device") String deviceId,
74 @QueryParam("port") String port) {
75 Iterable<Link> links;
76
77 if (deviceId == null || port == null) {
78 links = get(LinkService.class).getLinks();
79 } else {
80 ConnectPoint connectPoint = new ConnectPoint(deviceId(deviceId),
81 portNumber(port));
82 links = get(LinkService.class).getLinks(connectPoint);
83 }
84 ObjectNode result = mapper().createObjectNode();
85 ArrayNode loads = mapper().createArrayNode();
86 JsonCodec<Load> loadCodec = codec(Load.class);
87 StatisticService statsService = getService(StatisticService.class);
88
Ray Milkeyb9af9462015-07-17 11:12:09 -070089 StreamSupport.stream(Spliterators.spliteratorUnknownSize(
90 links.iterator(), Spliterator.ORDERED), false)
91 .forEach(link -> {
92 ObjectNode loadNode = loadCodec.encode(statsService.load(link), this);
93
94 UriBuilder locationBuilder = uriInfo.getBaseUriBuilder()
95 .path("links")
96 .queryParam("device", link.src().deviceId().toString())
97 .queryParam("port", link.src().port().toString());
98 loadNode.put("link", locationBuilder.build().toString());
99 loads.add(loadNode);
100 });
101 result.set("loads", loads);
102 return ok(result).build();
103 }
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -0700104
105 /**
Jian Licc730a62016-05-10 16:36:16 -0700106 * Gets table statistics for all tables of all devices.
107 *
Andrea Campanella10c4adc2015-12-03 15:27:54 -0800108 * @onos.rsModel StatisticsFlowsTables
Jian Licc730a62016-05-10 16:36:16 -0700109 * @return 200 OK with JSON encoded array of table statistics
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -0700110 */
111 @GET
112 @Path("flows/tables")
113 @Produces(MediaType.APPLICATION_JSON)
114 public Response getTableStatistics() {
115 final FlowRuleService service = get(FlowRuleService.class);
116 final Iterable<Device> devices = get(DeviceService.class).getDevices();
117 final ObjectNode root = mapper().createObjectNode();
andrea1ce2bc82015-11-18 16:58:10 -0800118 final ArrayNode rootArrayNode = root.putArray("statistics");
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -0700119 for (final Device device : devices) {
120 final ObjectNode deviceStatsNode = mapper().createObjectNode();
121 deviceStatsNode.put("device", device.id().toString());
andrea1ce2bc82015-11-18 16:58:10 -0800122 final ArrayNode statisticsNode = deviceStatsNode.putArray("table");
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -0700123 final Iterable<TableStatisticsEntry> tableStatsEntries = service.getFlowTableStatistics(device.id());
124 if (tableStatsEntries != null) {
125 for (final TableStatisticsEntry entry : tableStatsEntries) {
126 statisticsNode.add(codec(TableStatisticsEntry.class).encode(entry, this));
127 }
128 }
129 rootArrayNode.add(deviceStatsNode);
130 }
131
132 return ok(root).build();
133 }
134
135 /**
Jian Licc730a62016-05-10 16:36:16 -0700136 * Gets table statistics for all tables of a specified device.
137 *
Andrea Campanella10c4adc2015-12-03 15:27:54 -0800138 * @onos.rsModel StatisticsFlowsTables
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -0700139 * @param deviceId device ID
Jian Licc730a62016-05-10 16:36:16 -0700140 * @return 200 OK with JSON encoded array of table statistics
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -0700141 */
142 @GET
143 @Path("flows/tables/{deviceId}")
144 @Produces(MediaType.APPLICATION_JSON)
145 public Response getTableStatisticsByDeviceId(@PathParam("deviceId") String deviceId) {
146 final FlowRuleService service = get(FlowRuleService.class);
147 final Iterable<TableStatisticsEntry> tableStatisticsEntries =
148 service.getFlowTableStatistics(DeviceId.deviceId(deviceId));
149 final ObjectNode root = mapper().createObjectNode();
andrea1ce2bc82015-11-18 16:58:10 -0800150 final ArrayNode rootArrayNode = root.putArray("statistics");
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -0700151
152 final ObjectNode deviceStatsNode = mapper().createObjectNode();
153 deviceStatsNode.put("device", deviceId);
andrea1ce2bc82015-11-18 16:58:10 -0800154 final ArrayNode statisticsNode = deviceStatsNode.putArray("table");
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -0700155 for (final TableStatisticsEntry entry : tableStatisticsEntries) {
156 statisticsNode.add(codec(TableStatisticsEntry.class).encode(entry, this));
157 }
158 rootArrayNode.add(deviceStatsNode);
159 return ok(root).build();
160 }
Srikanth Vavilapallid120f5c2015-11-24 14:15:01 -0800161
162 /**
Jian Licc730a62016-05-10 16:36:16 -0700163 * Gets port statistics of all devices.
Andrea Campanella10c4adc2015-12-03 15:27:54 -0800164 * @onos.rsModel StatisticsPorts
Jian Licc730a62016-05-10 16:36:16 -0700165 * @return 200 OK with JSON encoded array of port statistics
Srikanth Vavilapallid120f5c2015-11-24 14:15:01 -0800166 */
167 @GET
168 @Path("ports")
169 @Produces(MediaType.APPLICATION_JSON)
170 public Response getPortStatistics() {
171 final DeviceService service = get(DeviceService.class);
172 final Iterable<Device> devices = service.getDevices();
173 final ObjectNode root = mapper().createObjectNode();
174 final ArrayNode rootArrayNode = root.putArray("statistics");
175 for (final Device device : devices) {
176 final ObjectNode deviceStatsNode = mapper().createObjectNode();
177 deviceStatsNode.put("device", device.id().toString());
178 final ArrayNode statisticsNode = deviceStatsNode.putArray("ports");
179 final Iterable<PortStatistics> portStatsEntries = service.getPortStatistics(device.id());
180 if (portStatsEntries != null) {
181 for (final PortStatistics entry : portStatsEntries) {
182 statisticsNode.add(codec(PortStatistics.class).encode(entry, this));
183 }
184 }
185 rootArrayNode.add(deviceStatsNode);
186 }
187
188 return ok(root).build();
189 }
190
191 /**
Jian Licc730a62016-05-10 16:36:16 -0700192 * Gets port statistics of a specified devices.
Andrea Campanella10c4adc2015-12-03 15:27:54 -0800193 * @onos.rsModel StatisticsPorts
Srikanth Vavilapallid120f5c2015-11-24 14:15:01 -0800194 * @param deviceId device ID
Jian Licc730a62016-05-10 16:36:16 -0700195 * @return 200 OK with JSON encoded array of port statistics
Srikanth Vavilapallid120f5c2015-11-24 14:15:01 -0800196 */
197 @GET
198 @Path("ports/{deviceId}")
199 @Produces(MediaType.APPLICATION_JSON)
200 public Response getPortStatisticsByDeviceId(@PathParam("deviceId") String deviceId) {
201 final DeviceService service = get(DeviceService.class);
202 final Iterable<PortStatistics> portStatsEntries =
203 service.getPortStatistics(DeviceId.deviceId(deviceId));
204 final ObjectNode root = mapper().createObjectNode();
205 final ArrayNode rootArrayNode = root.putArray("statistics");
206 final ObjectNode deviceStatsNode = mapper().createObjectNode();
207 deviceStatsNode.put("device", deviceId);
208 final ArrayNode statisticsNode = deviceStatsNode.putArray("ports");
209 if (portStatsEntries != null) {
210 for (final PortStatistics entry : portStatsEntries) {
211 statisticsNode.add(codec(PortStatistics.class).encode(entry, this));
212 }
213 }
214 rootArrayNode.add(deviceStatsNode);
215
216 return ok(root).build();
217 }
218
Viswanath KSP8ffb7752016-08-23 22:19:06 +0530219 /**
220 * Gets port statistics of a specified device and port.
221 * @onos.rsModel StatisticsPorts
222 * @param deviceId device ID
223 * @param port port
224 * @return 200 OK with JSON encoded array of port statistics for the specified port
225 */
226 @GET
227 @Path("ports/{deviceId}/{port}")
228 @Produces(MediaType.APPLICATION_JSON)
229 public Response getPortStatisticsByDeviceIdAndPort(@PathParam("deviceId") String deviceId,
230 @PathParam("port") String port) {
231 final DeviceService service = get(DeviceService.class);
232 final PortNumber portNumber = portNumber(port);
233 final PortStatistics portStatsEntry =
234 service.getStatisticsForPort(DeviceId.deviceId(deviceId), portNumber);
235 final ObjectNode root = mapper().createObjectNode();
236 final ArrayNode rootArrayNode = root.putArray("statistics");
237 final ObjectNode deviceStatsNode = mapper().createObjectNode();
238 deviceStatsNode.put("device", deviceId);
239 final ArrayNode statisticsNode = deviceStatsNode.putArray("ports");
240 if (portStatsEntry != null) {
241 statisticsNode.add(codec(PortStatistics.class).encode(portStatsEntry, this));
242 }
243 rootArrayNode.add(deviceStatsNode);
244
245 return ok(root).build();
246 }
247
Viswanath KSP13e5b512016-08-25 12:33:16 +0530248 /**
249 * Gets port delta statistics of all devices.
250 * @onos.rsModel StatisticsPorts
251 * @return 200 OK with JSON encoded array of port delta statistics
252 */
253 @GET
254 @Path("delta/ports")
255 @Produces(MediaType.APPLICATION_JSON)
256 public Response getPortDeltaStatistics() {
257 final DeviceService service = get(DeviceService.class);
258 final Iterable<Device> devices = service.getDevices();
259 final ObjectNode root = mapper().createObjectNode();
260 final ArrayNode rootArrayNode = root.putArray("statistics");
261 for (final Device device : devices) {
262 final ObjectNode deviceStatsNode = mapper().createObjectNode();
263 deviceStatsNode.put("device", device.id().toString());
264 final ArrayNode statisticsNode = deviceStatsNode.putArray("ports");
265 final Iterable<PortStatistics> portStatsEntries = service.getPortDeltaStatistics(device.id());
266 if (portStatsEntries != null) {
267 for (final PortStatistics entry : portStatsEntries) {
268 statisticsNode.add(codec(PortStatistics.class).encode(entry, this));
269 }
270 }
271 rootArrayNode.add(deviceStatsNode);
272 }
273
274 return ok(root).build();
275 }
276
277 /**
278 * Gets port delta statistics of a specified devices.
279 * @onos.rsModel StatisticsPorts
280 * @param deviceId device ID
281 * @return 200 OK with JSON encoded array of port delta statistics
282 */
283 @GET
284 @Path("delta/ports/{deviceId}")
285 @Produces(MediaType.APPLICATION_JSON)
286 public Response getPortDeltaStatisticsByDeviceId(@PathParam("deviceId") String deviceId) {
287 final DeviceService service = get(DeviceService.class);
288 final Iterable<PortStatistics> portStatsEntries =
289 service.getPortDeltaStatistics(DeviceId.deviceId(deviceId));
290 final ObjectNode root = mapper().createObjectNode();
291 final ArrayNode rootArrayNode = root.putArray("statistics");
292 final ObjectNode deviceStatsNode = mapper().createObjectNode();
293 deviceStatsNode.put("device", deviceId);
294 final ArrayNode statisticsNode = deviceStatsNode.putArray("ports");
295 if (portStatsEntries != null) {
296 for (final PortStatistics entry : portStatsEntries) {
297 statisticsNode.add(codec(PortStatistics.class).encode(entry, this));
298 }
299 }
300 rootArrayNode.add(deviceStatsNode);
301
302 return ok(root).build();
303 }
304
305 /**
306 * Gets port delta statistics of a specified device and port.
307 * @onos.rsModel StatisticsPorts
308 * @param deviceId device ID
309 * @param port port
310 * @return 200 OK with JSON encoded array of port delta statistics for the specified port
311 */
312 @GET
313 @Path("delta/ports/{deviceId}/{port}")
314 @Produces(MediaType.APPLICATION_JSON)
315 public Response getPortDeltaStatisticsByDeviceIdAndPort(@PathParam("deviceId") String deviceId,
316 @PathParam("port") String port) {
317 final DeviceService service = get(DeviceService.class);
318 final PortNumber portNumber = portNumber(port);
319 final PortStatistics portStatsEntry =
320 service.getDeltaStatisticsForPort(DeviceId.deviceId(deviceId), portNumber);
321 final ObjectNode root = mapper().createObjectNode();
322 final ArrayNode rootArrayNode = root.putArray("statistics");
323 final ObjectNode deviceStatsNode = mapper().createObjectNode();
324 deviceStatsNode.put("device", deviceId);
325 final ArrayNode statisticsNode = deviceStatsNode.putArray("ports");
326 if (portStatsEntry != null) {
327 statisticsNode.add(codec(PortStatistics.class).encode(portStatsEntry, this));
328 }
329 rootArrayNode.add(deviceStatsNode);
330
331 return ok(root).build();
332 }
333
Patryk Konopka7e40c012017-06-06 13:38:06 +0200334 /**
335 * Gets sum of active entries in all tables for all devices.
336 *
337 * @onos.rsModel StatisticsFlowsActiveEntries
338 * @return 200 OK with JSON encoded array of active entry count per device
339 */
340 @GET
341 @Path("flows/activeentries")
342 @Produces(MediaType.APPLICATION_JSON)
343 public Response getActiveEntriesCountPerDevice() {
344 final FlowRuleService service = get(FlowRuleService.class);
345 final Iterable<Device> devices = get(DeviceService.class).getDevices();
346 final ObjectNode root = mapper().createObjectNode();
347 final ArrayNode rootArrayNode = root.putArray("statistics");
348 for (final Device device : devices) {
349 long activeEntries = service.getActiveFlowRuleCount(device.id());
350 final ObjectNode entry = mapper().createObjectNode();
351 entry.put("device", device.id().toString());
352 entry.put("activeEntries", activeEntries);
353 rootArrayNode.add(entry);
354 }
355
356 return ok(root).build();
357 }
Ray Milkeyb9af9462015-07-17 11:12:09 -0700358}