blob: 0fd18e067e011e338af13f4f7fbf623f82b7dd2d [file] [log] [blame]
Jian Lic132c112016-01-28 20:27:34 -08001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Jian Lic132c112016-01-28 20:27:34 -08003 *
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.cpman.rest;
17
18import com.fasterxml.jackson.databind.JsonNode;
Jian Liba6b1172016-02-01 22:40:42 -080019import com.fasterxml.jackson.databind.node.ArrayNode;
Jian Lic132c112016-01-28 20:27:34 -080020import com.fasterxml.jackson.databind.node.ObjectNode;
Jian Li9f3a8852016-04-07 13:37:39 -070021import org.apache.commons.lang3.StringUtils;
Jian Li7eed4172016-04-07 22:12:03 -070022import org.onlab.metrics.MetricsService;
Jian Lic132c112016-01-28 20:27:34 -080023import org.onosproject.cpman.ControlMetric;
24import org.onosproject.cpman.ControlMetricType;
Jian Lic132c112016-01-28 20:27:34 -080025import org.onosproject.cpman.ControlPlaneMonitorService;
Jian Li9f3a8852016-04-07 13:37:39 -070026import org.onosproject.cpman.ControlResource;
Jian Lic132c112016-01-28 20:27:34 -080027import org.onosproject.cpman.MetricValue;
Jian Li1a424692016-02-03 16:21:18 -080028import org.onosproject.cpman.SystemInfo;
29import org.onosproject.cpman.impl.DefaultSystemInfo;
30import org.onosproject.cpman.impl.SystemInfoFactory;
Jian Lib1548ee2016-05-11 09:49:57 -070031import org.onosproject.cpman.impl.SystemMetricsAggregator;
Jian Lic132c112016-01-28 20:27:34 -080032import org.onosproject.rest.AbstractWebResource;
Jian Li9f3a8852016-04-07 13:37:39 -070033import org.slf4j.Logger;
34import org.slf4j.LoggerFactory;
Jian Lic132c112016-01-28 20:27:34 -080035
36import javax.ws.rs.Consumes;
37import javax.ws.rs.POST;
38import javax.ws.rs.Path;
Jian Lic132c112016-01-28 20:27:34 -080039import javax.ws.rs.core.MediaType;
40import javax.ws.rs.core.Response;
41import java.io.IOException;
42import java.io.InputStream;
Jian Li9f3a8852016-04-07 13:37:39 -070043import java.util.Iterator;
Jian Lic132c112016-01-28 20:27:34 -080044import java.util.Optional;
Jian Li9f3a8852016-04-07 13:37:39 -070045import java.util.Set;
46import java.util.stream.Collectors;
Jian Lic132c112016-01-28 20:27:34 -080047
Jian Liba6b1172016-02-01 22:40:42 -080048import static org.onlab.util.Tools.nullIsIllegal;
Ray Milkeyb784adb2018-04-02 15:33:07 -070049import static org.onlab.util.Tools.readTreeFromStream;
Jian Liba6b1172016-02-01 22:40:42 -080050
Jian Lic132c112016-01-28 20:27:34 -080051/**
Jian Li80c12702016-02-20 08:58:19 +090052 * Collect system metrics.
Jian Lic132c112016-01-28 20:27:34 -080053 */
Jian Li54df73e2016-02-01 17:09:03 -080054@Path("collector")
Jian Li80c12702016-02-20 08:58:19 +090055public class SystemMetricsCollectorWebResource extends AbstractWebResource {
Jian Lic132c112016-01-28 20:27:34 -080056
Jian Li9f3a8852016-04-07 13:37:39 -070057 private final Logger log = LoggerFactory.getLogger(getClass());
Jian Li7eed4172016-04-07 22:12:03 -070058 private final ControlPlaneMonitorService monitorService = get(ControlPlaneMonitorService.class);
59 private final MetricsService metricsService = get(MetricsService.class);
60
Jian Li80c12702016-02-20 08:58:19 +090061 private static final int UPDATE_INTERVAL_IN_MINUTE = 1;
62 private static final String INVALID_SYSTEM_SPECS = "Invalid system specifications";
63 private static final String INVALID_RESOURCE_NAME = "Invalid resource name";
64 private static final String INVALID_REQUEST = "Invalid request";
Jian Li9f3a8852016-04-07 13:37:39 -070065 private static final int PERCENT_CONSTANT = 100;
Jian Lia73fce32016-04-11 17:08:35 -070066 private static final String SYSTEM_TYPE = "system";
67 private static final String DISK_TYPE = "disk";
68 private static final String NETWORK_TYPE = "network";
Jian Li9f3a8852016-04-07 13:37:39 -070069
70 private static final Set<String> MEMORY_FIELD_SET = ControlResource.MEMORY_METRICS
71 .stream().map(type -> toCamelCase(type.toString(), true))
72 .collect(Collectors.toSet());
73
74 private static final Set<String> CPU_FIELD_SET = ControlResource.CPU_METRICS
75 .stream().map(type -> toCamelCase(type.toString(), true))
76 .collect(Collectors.toSet());
Jian Lic132c112016-01-28 20:27:34 -080077
Jian Lia73fce32016-04-11 17:08:35 -070078 private SystemMetricsAggregator aggregator = SystemMetricsAggregator.getInstance();
Jian Li7eed4172016-04-07 22:12:03 -070079
Jian Lic132c112016-01-28 20:27:34 -080080 /**
81 * Collects CPU metrics.
82 *
83 * @param stream JSON stream
84 * @return 200 OK
85 * @onos.rsModel CpuMetricsPost
86 */
87 @POST
Jian Li54df73e2016-02-01 17:09:03 -080088 @Path("cpu_metrics")
Jian Lic132c112016-01-28 20:27:34 -080089 @Consumes(MediaType.APPLICATION_JSON)
Jian Lic132c112016-01-28 20:27:34 -080090 public Response cpuMetrics(InputStream stream) {
91 ObjectNode root = mapper().createObjectNode();
92 ControlMetric cm;
93 try {
Ray Milkeyb784adb2018-04-02 15:33:07 -070094 ObjectNode jsonTree = readTreeFromStream(mapper(), stream);
Jian Li9f3a8852016-04-07 13:37:39 -070095
96 if (jsonTree == null || !checkFields(jsonTree, CPU_FIELD_SET)) {
Ray Milkeyfd4f8d32018-01-17 15:24:52 -080097 return ok(root).build();
Jian Li9f3a8852016-04-07 13:37:39 -070098 }
99
100 long cpuLoad = nullIsIllegal((long) (jsonTree.get("cpuLoad").asDouble()
101 * PERCENT_CONSTANT), INVALID_REQUEST);
Jian Li1fdd2242016-02-05 10:01:19 -0800102 long totalCpuTime = nullIsIllegal(jsonTree.get("totalCpuTime").asLong(), INVALID_REQUEST);
103 long sysCpuTime = nullIsIllegal(jsonTree.get("sysCpuTime").asLong(), INVALID_REQUEST);
104 long userCpuTime = nullIsIllegal(jsonTree.get("userCpuTime").asLong(), INVALID_REQUEST);
105 long cpuIdleTime = nullIsIllegal(jsonTree.get("cpuIdleTime").asLong(), INVALID_REQUEST);
Jian Lic132c112016-01-28 20:27:34 -0800106
Jian Lia73fce32016-04-11 17:08:35 -0700107 aggregator.setMetricsService(metricsService);
Jian Li67e1e152016-04-18 17:52:58 -0700108 aggregator.addMetrics(Optional.empty(), SYSTEM_TYPE);
Jian Lia73fce32016-04-11 17:08:35 -0700109
Jian Li1fdd2242016-02-05 10:01:19 -0800110 cm = new ControlMetric(ControlMetricType.CPU_LOAD,
111 new MetricValue.Builder().load(cpuLoad).add());
Jian Li67e1e152016-04-18 17:52:58 -0700112 monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
Jian Lia73fce32016-04-11 17:08:35 -0700113 aggregator.increment(ControlMetricType.CPU_LOAD, cpuLoad);
Jian Lic132c112016-01-28 20:27:34 -0800114
Jian Li1fdd2242016-02-05 10:01:19 -0800115 cm = new ControlMetric(ControlMetricType.TOTAL_CPU_TIME,
116 new MetricValue.Builder().load(totalCpuTime).add());
Jian Li67e1e152016-04-18 17:52:58 -0700117 monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
Jian Lia73fce32016-04-11 17:08:35 -0700118 aggregator.increment(ControlMetricType.TOTAL_CPU_TIME, totalCpuTime);
Jian Lic132c112016-01-28 20:27:34 -0800119
Jian Li1fdd2242016-02-05 10:01:19 -0800120 cm = new ControlMetric(ControlMetricType.SYS_CPU_TIME,
121 new MetricValue.Builder().load(sysCpuTime).add());
Jian Li67e1e152016-04-18 17:52:58 -0700122 monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
Jian Lia73fce32016-04-11 17:08:35 -0700123 aggregator.increment(ControlMetricType.SYS_CPU_TIME, sysCpuTime);
Jian Lic132c112016-01-28 20:27:34 -0800124
Jian Li1fdd2242016-02-05 10:01:19 -0800125 cm = new ControlMetric(ControlMetricType.USER_CPU_TIME,
126 new MetricValue.Builder().load(userCpuTime).add());
Jian Li67e1e152016-04-18 17:52:58 -0700127 monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
Jian Lia73fce32016-04-11 17:08:35 -0700128 aggregator.increment(ControlMetricType.USER_CPU_TIME, userCpuTime);
Jian Lic132c112016-01-28 20:27:34 -0800129
Jian Li1fdd2242016-02-05 10:01:19 -0800130 cm = new ControlMetric(ControlMetricType.CPU_IDLE_TIME,
131 new MetricValue.Builder().load(cpuIdleTime).add());
Jian Li67e1e152016-04-18 17:52:58 -0700132 monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
Jian Lia73fce32016-04-11 17:08:35 -0700133 aggregator.increment(ControlMetricType.CPU_IDLE_TIME, cpuIdleTime);
Jian Lic132c112016-01-28 20:27:34 -0800134
135 } catch (IOException e) {
Jian Lib1548ee2016-05-11 09:49:57 -0700136 throw new IllegalArgumentException(e);
Jian Lic132c112016-01-28 20:27:34 -0800137 }
138 return ok(root).build();
139 }
140
141 /**
142 * Collects memory metrics.
143 *
144 * @param stream JSON stream
145 * @return 200 OK
146 * @onos.rsModel MemoryMetricsPost
147 */
148 @POST
Jian Li54df73e2016-02-01 17:09:03 -0800149 @Path("memory_metrics")
Jian Lic132c112016-01-28 20:27:34 -0800150 @Consumes(MediaType.APPLICATION_JSON)
Jian Lic132c112016-01-28 20:27:34 -0800151 public Response memoryMetrics(InputStream stream) {
152 ObjectNode root = mapper().createObjectNode();
153 ControlMetric cm;
154 try {
Ray Milkeyb784adb2018-04-02 15:33:07 -0700155 ObjectNode jsonTree = readTreeFromStream(mapper(), stream);
Jian Li9f3a8852016-04-07 13:37:39 -0700156
157 if (jsonTree == null || !checkFields(jsonTree, MEMORY_FIELD_SET)) {
Ray Milkeyfd4f8d32018-01-17 15:24:52 -0800158 return ok(root).build();
Jian Li9f3a8852016-04-07 13:37:39 -0700159 }
160
Jian Li1fdd2242016-02-05 10:01:19 -0800161 long memUsed = nullIsIllegal(jsonTree.get("memoryUsed").asLong(), INVALID_REQUEST);
162 long memFree = nullIsIllegal(jsonTree.get("memoryFree").asLong(), INVALID_REQUEST);
Jian Li9f3a8852016-04-07 13:37:39 -0700163 long memTotal = memUsed + memFree;
164 long memUsedRatio = memTotal == 0L ? 0L : (memUsed * PERCENT_CONSTANT) / memTotal;
165 long memFreeRatio = memTotal == 0L ? 0L : (memFree * PERCENT_CONSTANT) / memTotal;
Jian Lic132c112016-01-28 20:27:34 -0800166
Jian Lia73fce32016-04-11 17:08:35 -0700167 aggregator.setMetricsService(metricsService);
Jian Li67e1e152016-04-18 17:52:58 -0700168 aggregator.addMetrics(Optional.empty(), SYSTEM_TYPE);
Jian Lia73fce32016-04-11 17:08:35 -0700169
Jian Li1fdd2242016-02-05 10:01:19 -0800170 cm = new ControlMetric(ControlMetricType.MEMORY_USED_RATIO,
171 new MetricValue.Builder().load(memUsedRatio).add());
Jian Li67e1e152016-04-18 17:52:58 -0700172 monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
Jian Lia73fce32016-04-11 17:08:35 -0700173 aggregator.increment(ControlMetricType.MEMORY_USED_RATIO, memUsedRatio);
Jian Lic132c112016-01-28 20:27:34 -0800174
Jian Li1fdd2242016-02-05 10:01:19 -0800175 cm = new ControlMetric(ControlMetricType.MEMORY_FREE_RATIO,
176 new MetricValue.Builder().load(memFreeRatio).add());
Jian Li67e1e152016-04-18 17:52:58 -0700177 monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
Jian Lia73fce32016-04-11 17:08:35 -0700178 aggregator.increment(ControlMetricType.MEMORY_FREE_RATIO, memFreeRatio);
Jian Lic132c112016-01-28 20:27:34 -0800179
Jian Li1fdd2242016-02-05 10:01:19 -0800180 cm = new ControlMetric(ControlMetricType.MEMORY_USED,
181 new MetricValue.Builder().load(memUsed).add());
Jian Li67e1e152016-04-18 17:52:58 -0700182 monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
Jian Lia73fce32016-04-11 17:08:35 -0700183 aggregator.increment(ControlMetricType.MEMORY_USED, memUsed);
Jian Lic132c112016-01-28 20:27:34 -0800184
Jian Li1fdd2242016-02-05 10:01:19 -0800185 cm = new ControlMetric(ControlMetricType.MEMORY_FREE,
186 new MetricValue.Builder().load(memFree).add());
Jian Li67e1e152016-04-18 17:52:58 -0700187 monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
Jian Lia73fce32016-04-11 17:08:35 -0700188 aggregator.increment(ControlMetricType.MEMORY_FREE, memFree);
Jian Lic132c112016-01-28 20:27:34 -0800189
190 } catch (IOException e) {
Jian Lib1548ee2016-05-11 09:49:57 -0700191 throw new IllegalArgumentException(e);
Jian Lic132c112016-01-28 20:27:34 -0800192 }
193 return ok(root).build();
194 }
195
196 /**
197 * Collects disk metrics.
198 *
199 * @param stream JSON stream
200 * @return 200 OK
201 * @onos.rsModel DiskMetricsPost
202 */
203 @POST
Jian Li54df73e2016-02-01 17:09:03 -0800204 @Path("disk_metrics")
Jian Lic132c112016-01-28 20:27:34 -0800205 @Consumes(MediaType.APPLICATION_JSON)
Jian Lic132c112016-01-28 20:27:34 -0800206 public Response diskMetrics(InputStream stream) {
207 ObjectNode root = mapper().createObjectNode();
Jian Li1fdd2242016-02-05 10:01:19 -0800208 ControlMetric cm;
Jian Lic132c112016-01-28 20:27:34 -0800209 try {
Ray Milkeyb784adb2018-04-02 15:33:07 -0700210 ObjectNode jsonTree = readTreeFromStream(mapper(), stream);
Jian Li9f3a8852016-04-07 13:37:39 -0700211 ArrayNode diskRes =
Jian Lia73fce32016-04-11 17:08:35 -0700212 jsonTree.get("disks") == null ?
213 mapper().createArrayNode() : (ArrayNode) jsonTree.get("disks");
Jian Li9f3a8852016-04-07 13:37:39 -0700214
Jian Li1fdd2242016-02-05 10:01:19 -0800215 for (JsonNode node : diskRes) {
Jian Liba6b1172016-02-01 22:40:42 -0800216 JsonNode resourceName = node.get("resourceName");
217 nullIsIllegal(resourceName, INVALID_RESOURCE_NAME);
Jian Lic132c112016-01-28 20:27:34 -0800218
Jian Lia73fce32016-04-11 17:08:35 -0700219 aggregator.setMetricsService(metricsService);
220 aggregator.addMetrics(Optional.of(resourceName.asText()), DISK_TYPE);
Jian Li7eed4172016-04-07 22:12:03 -0700221
Jian Li1fdd2242016-02-05 10:01:19 -0800222 long readBytes = nullIsIllegal(node.get("readBytes").asLong(), INVALID_REQUEST);
223 long writeBytes = nullIsIllegal(node.get("writeBytes").asLong(), INVALID_REQUEST);
Jian Lic132c112016-01-28 20:27:34 -0800224
Jian Li1fdd2242016-02-05 10:01:19 -0800225 cm = new ControlMetric(ControlMetricType.DISK_READ_BYTES,
226 new MetricValue.Builder().load(readBytes).add());
Jian Li7eed4172016-04-07 22:12:03 -0700227 monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, resourceName.asText());
Jian Lia73fce32016-04-11 17:08:35 -0700228 aggregator.increment(resourceName.asText(), DISK_TYPE,
229 ControlMetricType.DISK_READ_BYTES, readBytes);
Jian Li1fdd2242016-02-05 10:01:19 -0800230 cm = new ControlMetric(ControlMetricType.DISK_WRITE_BYTES,
231 new MetricValue.Builder().load(writeBytes).add());
Jian Li7eed4172016-04-07 22:12:03 -0700232 monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, resourceName.asText());
Jian Lia73fce32016-04-11 17:08:35 -0700233 aggregator.increment(resourceName.asText(), DISK_TYPE,
234 ControlMetricType.DISK_WRITE_BYTES, writeBytes);
Jian Li1fdd2242016-02-05 10:01:19 -0800235 }
Jian Lic132c112016-01-28 20:27:34 -0800236 } catch (IOException e) {
Jian Lib1548ee2016-05-11 09:49:57 -0700237 throw new IllegalArgumentException(e);
Jian Lic132c112016-01-28 20:27:34 -0800238 }
239 return ok(root).build();
240 }
241
242 /**
243 * Collects network metrics.
244 *
245 * @param stream JSON stream
246 * @return 200 OK
247 * @onos.rsModel NetworkMetricsPost
248 */
249 @POST
Jian Li54df73e2016-02-01 17:09:03 -0800250 @Path("network_metrics")
Jian Lic132c112016-01-28 20:27:34 -0800251 @Consumes(MediaType.APPLICATION_JSON)
Jian Lic132c112016-01-28 20:27:34 -0800252 public Response networkMetrics(InputStream stream) {
253 ObjectNode root = mapper().createObjectNode();
Jian Li1fdd2242016-02-05 10:01:19 -0800254 ControlMetric cm;
Jian Lic132c112016-01-28 20:27:34 -0800255 try {
Ray Milkeyb784adb2018-04-02 15:33:07 -0700256 ObjectNode jsonTree = readTreeFromStream(mapper(), stream);
Jian Li9f3a8852016-04-07 13:37:39 -0700257
258 ArrayNode networkRes = jsonTree.get("networks") == null
259 ? mapper().createArrayNode() : (ArrayNode) jsonTree.get("networks");
260
Jian Li1fdd2242016-02-05 10:01:19 -0800261 for (JsonNode node : networkRes) {
Jian Liba6b1172016-02-01 22:40:42 -0800262 JsonNode resourceName = node.get("resourceName");
263 nullIsIllegal(resourceName, INVALID_RESOURCE_NAME);
Jian Lic132c112016-01-28 20:27:34 -0800264
Jian Lia73fce32016-04-11 17:08:35 -0700265 aggregator.setMetricsService(metricsService);
266 aggregator.addMetrics(Optional.of(resourceName.asText()), NETWORK_TYPE);
Jian Li7eed4172016-04-07 22:12:03 -0700267
Jian Li1fdd2242016-02-05 10:01:19 -0800268 long inBytes = nullIsIllegal(node.get("incomingBytes").asLong(), INVALID_REQUEST);
269 long outBytes = nullIsIllegal(node.get("outgoingBytes").asLong(), INVALID_REQUEST);
270 long inPackets = nullIsIllegal(node.get("incomingPackets").asLong(), INVALID_REQUEST);
271 long outPackets = nullIsIllegal(node.get("outgoingPackets").asLong(), INVALID_REQUEST);
Jian Lic132c112016-01-28 20:27:34 -0800272
Jian Li1fdd2242016-02-05 10:01:19 -0800273 cm = new ControlMetric(ControlMetricType.NW_INCOMING_BYTES,
274 new MetricValue.Builder().load(inBytes).add());
Jian Li7eed4172016-04-07 22:12:03 -0700275 monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, resourceName.asText());
Jian Lia73fce32016-04-11 17:08:35 -0700276 aggregator.increment(resourceName.asText(), NETWORK_TYPE,
277 ControlMetricType.NW_INCOMING_BYTES, inBytes);
Jian Lic132c112016-01-28 20:27:34 -0800278
Jian Li1fdd2242016-02-05 10:01:19 -0800279 cm = new ControlMetric(ControlMetricType.NW_OUTGOING_BYTES,
280 new MetricValue.Builder().load(outBytes).add());
Jian Li7eed4172016-04-07 22:12:03 -0700281 monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, resourceName.asText());
Jian Lia73fce32016-04-11 17:08:35 -0700282 aggregator.increment(resourceName.asText(), NETWORK_TYPE,
283 ControlMetricType.NW_OUTGOING_BYTES, outBytes);
Jian Lic132c112016-01-28 20:27:34 -0800284
Jian Li1fdd2242016-02-05 10:01:19 -0800285 cm = new ControlMetric(ControlMetricType.NW_INCOMING_PACKETS,
286 new MetricValue.Builder().load(inPackets).add());
Jian Li7eed4172016-04-07 22:12:03 -0700287 monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, resourceName.asText());
Jian Lia73fce32016-04-11 17:08:35 -0700288 aggregator.increment(resourceName.asText(), NETWORK_TYPE,
289 ControlMetricType.NW_INCOMING_PACKETS, inPackets);
Jian Lic132c112016-01-28 20:27:34 -0800290
Jian Li1fdd2242016-02-05 10:01:19 -0800291 cm = new ControlMetric(ControlMetricType.NW_OUTGOING_PACKETS,
292 new MetricValue.Builder().load(outPackets).add());
Jian Li7eed4172016-04-07 22:12:03 -0700293 monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, resourceName.asText());
Jian Lia73fce32016-04-11 17:08:35 -0700294 aggregator.increment(resourceName.asText(), NETWORK_TYPE,
295 ControlMetricType.NW_OUTGOING_PACKETS, outPackets);
Jian Li1fdd2242016-02-05 10:01:19 -0800296 }
Jian Lic132c112016-01-28 20:27:34 -0800297 } catch (IOException e) {
Jian Lib1548ee2016-05-11 09:49:57 -0700298 throw new IllegalArgumentException(e);
Jian Lic132c112016-01-28 20:27:34 -0800299 }
300 return ok(root).build();
301 }
302
Jian Lic132c112016-01-28 20:27:34 -0800303 /**
Jian Li1a424692016-02-03 16:21:18 -0800304 * Collects system information.
305 * The system information includes the various control metrics
Jian Lic132c112016-01-28 20:27:34 -0800306 * which do not require aggregation.
307 *
308 * @param stream JSON stream
309 * @return 200 OK
Jian Li1a424692016-02-03 16:21:18 -0800310 * @onos.rsModel SystemInfoPost
Jian Lic132c112016-01-28 20:27:34 -0800311 */
312 @POST
Jian Li1a424692016-02-03 16:21:18 -0800313 @Path("system_info")
Jian Lic132c112016-01-28 20:27:34 -0800314 @Consumes(MediaType.APPLICATION_JSON)
Jian Li1a424692016-02-03 16:21:18 -0800315 public Response systemInfo(InputStream stream) {
Jian Lic132c112016-01-28 20:27:34 -0800316 ObjectNode root = mapper().createObjectNode();
317
318 try {
Ray Milkeyb784adb2018-04-02 15:33:07 -0700319 ObjectNode jsonTree = readTreeFromStream(mapper(), stream);
Jian Lic132c112016-01-28 20:27:34 -0800320 JsonNode numOfCores = jsonTree.get("numOfCores");
321 JsonNode numOfCpus = jsonTree.get("numOfCpus");
322 JsonNode cpuSpeed = jsonTree.get("cpuSpeed");
323 JsonNode totalMemory = jsonTree.get("totalMemory");
324
Jian Li1a424692016-02-03 16:21:18 -0800325 if (numOfCores != null && numOfCpus != null &&
326 cpuSpeed != null && totalMemory != null) {
327 SystemInfo systemInfo = new DefaultSystemInfo.Builder()
328 .numOfCores(numOfCores.asInt())
Jian Lic132c112016-01-28 20:27:34 -0800329 .numOfCpus(numOfCpus.asInt())
330 .cpuSpeed(cpuSpeed.asInt())
Jian Li1a424692016-02-03 16:21:18 -0800331 .totalMemory(totalMemory.asInt())
Jian Lic132c112016-01-28 20:27:34 -0800332 .build();
Jian Lic132c112016-01-28 20:27:34 -0800333
Jian Li1a424692016-02-03 16:21:18 -0800334 // try to store the system info.
335 SystemInfoFactory.getInstance().setSystemInfo(systemInfo);
Jian Lic132c112016-01-28 20:27:34 -0800336 } else {
337 throw new IllegalArgumentException(INVALID_SYSTEM_SPECS);
338 }
339
340 } catch (IOException e) {
Jian Lib1548ee2016-05-11 09:49:57 -0700341 throw new IllegalArgumentException(e);
Jian Lic132c112016-01-28 20:27:34 -0800342 }
343 return ok(root).build();
344 }
Jian Li9f3a8852016-04-07 13:37:39 -0700345
346 private boolean checkFields(ObjectNode node, Set<String> original) {
347 Iterator<String> fieldNames = node.fieldNames();
348 while (fieldNames.hasNext()) {
349 String fieldName = fieldNames.next();
350 if (!original.contains(fieldName) || node.get(fieldName) == null) {
351 log.warn("Illegal field name: {}", fieldName);
352 return false;
353 }
354 }
355 return true;
356 }
357
358 private static String toCamelCase(String value, boolean startWithLowerCase) {
359 String[] strings = StringUtils.split(value.toLowerCase(), "_");
360 for (int i = startWithLowerCase ? 1 : 0; i < strings.length; i++) {
361 strings[i] = StringUtils.capitalize(strings[i]);
362 }
363 return StringUtils.join(strings);
364 }
Jian Li9d616492016-03-09 10:52:49 -0800365}