blob: 7c6dd74e0f0be9c63661d0b36550a654863b4eea [file] [log] [blame]
Ray Milkeyb9af9462015-07-17 11:12:09 -07001/*
2 * Copyright 2015 Open Networking Laboratory
3 *
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;
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -070038import org.onosproject.net.device.DeviceService;
Srikanth Vavilapallid120f5c2015-11-24 14:15:01 -080039import org.onosproject.net.device.PortStatistics;
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -070040import org.onosproject.net.flow.FlowRuleService;
41import org.onosproject.net.flow.TableStatisticsEntry;
Ray Milkeyb9af9462015-07-17 11:12:09 -070042import org.onosproject.net.link.LinkService;
43import org.onosproject.net.statistic.Load;
44import org.onosproject.net.statistic.StatisticService;
45import org.onosproject.rest.AbstractWebResource;
46
47import com.fasterxml.jackson.databind.node.ArrayNode;
48import com.fasterxml.jackson.databind.node.ObjectNode;
49
50import static org.onosproject.net.DeviceId.deviceId;
51import static org.onosproject.net.PortNumber.portNumber;
52
53/**
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -070054 * Query flow statistics.
Ray Milkeyb9af9462015-07-17 11:12:09 -070055 */
56@Path("statistics")
57public class StatisticsWebResource extends AbstractWebResource {
58 @Context
59 UriInfo uriInfo;
60
61 /**
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -070062 * Get load statistics for all links or for a specific link.
Andrea Campanella10c4adc2015-12-03 15:27:54 -080063 * @onos.rsModel StatisticsFlowsLink
Ray Milkeyb9af9462015-07-17 11:12:09 -070064 * @param deviceId (optional) device ID for a specific link
65 * @param port (optional) port number for a specified link
66 * @return JSON encoded array lof Load objects
67 */
68 @GET
69 @Path("flows/link")
70 @Produces(MediaType.APPLICATION_JSON)
71 public Response getLoads(@QueryParam("device") String deviceId,
72 @QueryParam("port") String port) {
73 Iterable<Link> links;
74
75 if (deviceId == null || port == null) {
76 links = get(LinkService.class).getLinks();
77 } else {
78 ConnectPoint connectPoint = new ConnectPoint(deviceId(deviceId),
79 portNumber(port));
80 links = get(LinkService.class).getLinks(connectPoint);
81 }
82 ObjectNode result = mapper().createObjectNode();
83 ArrayNode loads = mapper().createArrayNode();
84 JsonCodec<Load> loadCodec = codec(Load.class);
85 StatisticService statsService = getService(StatisticService.class);
86
Ray Milkeyb9af9462015-07-17 11:12:09 -070087 StreamSupport.stream(Spliterators.spliteratorUnknownSize(
88 links.iterator(), Spliterator.ORDERED), false)
89 .forEach(link -> {
90 ObjectNode loadNode = loadCodec.encode(statsService.load(link), this);
91
92 UriBuilder locationBuilder = uriInfo.getBaseUriBuilder()
93 .path("links")
94 .queryParam("device", link.src().deviceId().toString())
95 .queryParam("port", link.src().port().toString());
96 loadNode.put("link", locationBuilder.build().toString());
97 loads.add(loadNode);
98 });
99 result.set("loads", loads);
100 return ok(result).build();
101 }
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -0700102
103 /**
104 * Get table statistics for all tables of all devices.
Andrea Campanella10c4adc2015-12-03 15:27:54 -0800105 * @onos.rsModel StatisticsFlowsTables
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -0700106 * @return JSON encoded array of table statistics
107 */
108 @GET
109 @Path("flows/tables")
110 @Produces(MediaType.APPLICATION_JSON)
111 public Response getTableStatistics() {
112 final FlowRuleService service = get(FlowRuleService.class);
113 final Iterable<Device> devices = get(DeviceService.class).getDevices();
114 final ObjectNode root = mapper().createObjectNode();
andrea1ce2bc82015-11-18 16:58:10 -0800115 final ArrayNode rootArrayNode = root.putArray("statistics");
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -0700116 for (final Device device : devices) {
117 final ObjectNode deviceStatsNode = mapper().createObjectNode();
118 deviceStatsNode.put("device", device.id().toString());
andrea1ce2bc82015-11-18 16:58:10 -0800119 final ArrayNode statisticsNode = deviceStatsNode.putArray("table");
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -0700120 final Iterable<TableStatisticsEntry> tableStatsEntries = service.getFlowTableStatistics(device.id());
121 if (tableStatsEntries != null) {
122 for (final TableStatisticsEntry entry : tableStatsEntries) {
123 statisticsNode.add(codec(TableStatisticsEntry.class).encode(entry, this));
124 }
125 }
126 rootArrayNode.add(deviceStatsNode);
127 }
128
129 return ok(root).build();
130 }
131
132 /**
133 * Get table statistics for all tables of a specified device.
Andrea Campanella10c4adc2015-12-03 15:27:54 -0800134 * @onos.rsModel StatisticsFlowsTables
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -0700135 * @param deviceId device ID
136 * @return JSON encoded array of table statistics
137 */
138 @GET
139 @Path("flows/tables/{deviceId}")
140 @Produces(MediaType.APPLICATION_JSON)
141 public Response getTableStatisticsByDeviceId(@PathParam("deviceId") String deviceId) {
142 final FlowRuleService service = get(FlowRuleService.class);
143 final Iterable<TableStatisticsEntry> tableStatisticsEntries =
144 service.getFlowTableStatistics(DeviceId.deviceId(deviceId));
145 final ObjectNode root = mapper().createObjectNode();
andrea1ce2bc82015-11-18 16:58:10 -0800146 final ArrayNode rootArrayNode = root.putArray("statistics");
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -0700147
148 final ObjectNode deviceStatsNode = mapper().createObjectNode();
149 deviceStatsNode.put("device", deviceId);
andrea1ce2bc82015-11-18 16:58:10 -0800150 final ArrayNode statisticsNode = deviceStatsNode.putArray("table");
Srikanth Vavilapalli95810f52015-09-14 15:49:56 -0700151 for (final TableStatisticsEntry entry : tableStatisticsEntries) {
152 statisticsNode.add(codec(TableStatisticsEntry.class).encode(entry, this));
153 }
154 rootArrayNode.add(deviceStatsNode);
155 return ok(root).build();
156 }
Srikanth Vavilapallid120f5c2015-11-24 14:15:01 -0800157
158 /**
159 * Get port statistics of all devices.
Andrea Campanella10c4adc2015-12-03 15:27:54 -0800160 * @onos.rsModel StatisticsPorts
Srikanth Vavilapallid120f5c2015-11-24 14:15:01 -0800161 * @return JSON encoded array of port statistics
162 */
163 @GET
164 @Path("ports")
165 @Produces(MediaType.APPLICATION_JSON)
166 public Response getPortStatistics() {
167 final DeviceService service = get(DeviceService.class);
168 final Iterable<Device> devices = service.getDevices();
169 final ObjectNode root = mapper().createObjectNode();
170 final ArrayNode rootArrayNode = root.putArray("statistics");
171 for (final Device device : devices) {
172 final ObjectNode deviceStatsNode = mapper().createObjectNode();
173 deviceStatsNode.put("device", device.id().toString());
174 final ArrayNode statisticsNode = deviceStatsNode.putArray("ports");
175 final Iterable<PortStatistics> portStatsEntries = service.getPortStatistics(device.id());
176 if (portStatsEntries != null) {
177 for (final PortStatistics entry : portStatsEntries) {
178 statisticsNode.add(codec(PortStatistics.class).encode(entry, this));
179 }
180 }
181 rootArrayNode.add(deviceStatsNode);
182 }
183
184 return ok(root).build();
185 }
186
187 /**
188 * Get port statistics of a specified devices.
Andrea Campanella10c4adc2015-12-03 15:27:54 -0800189 * @onos.rsModel StatisticsPorts
Srikanth Vavilapallid120f5c2015-11-24 14:15:01 -0800190 * @param deviceId device ID
191 * @return JSON encoded array of port statistics
192 */
193 @GET
194 @Path("ports/{deviceId}")
195 @Produces(MediaType.APPLICATION_JSON)
196 public Response getPortStatisticsByDeviceId(@PathParam("deviceId") String deviceId) {
197 final DeviceService service = get(DeviceService.class);
198 final Iterable<PortStatistics> portStatsEntries =
199 service.getPortStatistics(DeviceId.deviceId(deviceId));
200 final ObjectNode root = mapper().createObjectNode();
201 final ArrayNode rootArrayNode = root.putArray("statistics");
202 final ObjectNode deviceStatsNode = mapper().createObjectNode();
203 deviceStatsNode.put("device", deviceId);
204 final ArrayNode statisticsNode = deviceStatsNode.putArray("ports");
205 if (portStatsEntries != null) {
206 for (final PortStatistics entry : portStatsEntries) {
207 statisticsNode.add(codec(PortStatistics.class).encode(entry, this));
208 }
209 }
210 rootArrayNode.add(deviceStatsNode);
211
212 return ok(root).build();
213 }
214
Ray Milkeyb9af9462015-07-17 11:12:09 -0700215}