Committed by
Gerrit Code Review
Add resource name param to diskMetrics and networkMetrics method
- Enable to add metrics of multiple disks - Enable to add metrics of multiple network interfaces Change-Id: I6e91d63b7a02f0d2f63fe445712a23e72d208789
Showing
6 changed files
with
183 additions
and
101 deletions
... | @@ -16,12 +16,13 @@ | ... | @@ -16,12 +16,13 @@ |
16 | package org.onosproject.cpman.rest; | 16 | package org.onosproject.cpman.rest; |
17 | 17 | ||
18 | import com.fasterxml.jackson.databind.JsonNode; | 18 | import com.fasterxml.jackson.databind.JsonNode; |
19 | +import com.fasterxml.jackson.databind.node.ArrayNode; | ||
19 | import com.fasterxml.jackson.databind.node.ObjectNode; | 20 | import com.fasterxml.jackson.databind.node.ObjectNode; |
20 | import org.onosproject.cpman.ControlMetric; | 21 | import org.onosproject.cpman.ControlMetric; |
21 | import org.onosproject.cpman.ControlMetricType; | 22 | import org.onosproject.cpman.ControlMetricType; |
22 | -import org.onosproject.cpman.impl.ControlMetricsSystemSpec; | ||
23 | import org.onosproject.cpman.ControlPlaneMonitorService; | 23 | import org.onosproject.cpman.ControlPlaneMonitorService; |
24 | import org.onosproject.cpman.MetricValue; | 24 | import org.onosproject.cpman.MetricValue; |
25 | +import org.onosproject.cpman.impl.ControlMetricsSystemSpec; | ||
25 | import org.onosproject.rest.AbstractWebResource; | 26 | import org.onosproject.rest.AbstractWebResource; |
26 | 27 | ||
27 | import javax.ws.rs.Consumes; | 28 | import javax.ws.rs.Consumes; |
... | @@ -34,6 +35,8 @@ import java.io.IOException; | ... | @@ -34,6 +35,8 @@ import java.io.IOException; |
34 | import java.io.InputStream; | 35 | import java.io.InputStream; |
35 | import java.util.Optional; | 36 | import java.util.Optional; |
36 | 37 | ||
38 | +import static org.onlab.util.Tools.nullIsIllegal; | ||
39 | + | ||
37 | /** | 40 | /** |
38 | * Collect control plane metrics. | 41 | * Collect control plane metrics. |
39 | */ | 42 | */ |
... | @@ -43,6 +46,7 @@ public class ControlMetricsCollectorWebResource extends AbstractWebResource { | ... | @@ -43,6 +46,7 @@ public class ControlMetricsCollectorWebResource extends AbstractWebResource { |
43 | final ControlPlaneMonitorService service = get(ControlPlaneMonitorService.class); | 46 | final ControlPlaneMonitorService service = get(ControlPlaneMonitorService.class); |
44 | public static final int UPDATE_INTERVAL = 1; // 1 minute update interval | 47 | public static final int UPDATE_INTERVAL = 1; // 1 minute update interval |
45 | public static final String INVALID_SYSTEM_SPECS = "Invalid system specifications"; | 48 | public static final String INVALID_SYSTEM_SPECS = "Invalid system specifications"; |
49 | + public static final String INVALID_RESOURCE_NAME = "Invalid resource name"; | ||
46 | 50 | ||
47 | /** | 51 | /** |
48 | * Collects CPU metrics. | 52 | * Collects CPU metrics. |
... | @@ -68,13 +72,13 @@ public class ControlMetricsCollectorWebResource extends AbstractWebResource { | ... | @@ -68,13 +72,13 @@ public class ControlMetricsCollectorWebResource extends AbstractWebResource { |
68 | 72 | ||
69 | if (cpuLoadJson != null) { | 73 | if (cpuLoadJson != null) { |
70 | cm = new ControlMetric(ControlMetricType.CPU_LOAD, | 74 | cm = new ControlMetric(ControlMetricType.CPU_LOAD, |
71 | - new MetricValue.Builder().load(cpuLoadJson.asLong()).add()); | 75 | + new MetricValue.Builder().load(cpuLoadJson.asLong()).add()); |
72 | service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null)); | 76 | service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null)); |
73 | } | 77 | } |
74 | 78 | ||
75 | if (totalCpuTimeJson != null) { | 79 | if (totalCpuTimeJson != null) { |
76 | cm = new ControlMetric(ControlMetricType.TOTAL_CPU_TIME, | 80 | cm = new ControlMetric(ControlMetricType.TOTAL_CPU_TIME, |
77 | - new MetricValue.Builder().load(totalCpuTimeJson.asLong()).add()); | 81 | + new MetricValue.Builder().load(totalCpuTimeJson.asLong()).add()); |
78 | service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null)); | 82 | service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null)); |
79 | } | 83 | } |
80 | 84 | ||
... | @@ -166,24 +170,29 @@ public class ControlMetricsCollectorWebResource extends AbstractWebResource { | ... | @@ -166,24 +170,29 @@ public class ControlMetricsCollectorWebResource extends AbstractWebResource { |
166 | @Produces(MediaType.APPLICATION_JSON) | 170 | @Produces(MediaType.APPLICATION_JSON) |
167 | public Response diskMetrics(InputStream stream) { | 171 | public Response diskMetrics(InputStream stream) { |
168 | ObjectNode root = mapper().createObjectNode(); | 172 | ObjectNode root = mapper().createObjectNode(); |
169 | - ControlMetric cm; | 173 | + final ControlMetric[] cm = new ControlMetric[1]; |
170 | try { | 174 | try { |
171 | ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream); | 175 | ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream); |
172 | - JsonNode readBytes = jsonTree.get("readBytes"); | 176 | + ArrayNode diskRes = (ArrayNode) jsonTree.get("disks"); |
173 | - JsonNode writeBytes = jsonTree.get("writeBytes"); | 177 | + diskRes.forEach(node-> { |
174 | - | 178 | + JsonNode resourceName = node.get("resourceName"); |
175 | - if (readBytes != null) { | 179 | + nullIsIllegal(resourceName, INVALID_RESOURCE_NAME); |
176 | - cm = new ControlMetric(ControlMetricType.DISK_READ_BYTES, | 180 | + |
177 | - new MetricValue.Builder().load(readBytes.asLong()).add()); | 181 | + JsonNode readBytes = jsonTree.get("readBytes"); |
178 | - service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null)); | 182 | + JsonNode writeBytes = jsonTree.get("writeBytes"); |
179 | - } | 183 | + |
180 | - | 184 | + if (readBytes != null) { |
181 | - if (writeBytes != null) { | 185 | + cm[0] = new ControlMetric(ControlMetricType.DISK_READ_BYTES, |
182 | - cm = new ControlMetric(ControlMetricType.DISK_WRITE_BYTES, | 186 | + new MetricValue.Builder().load(readBytes.asLong()).add()); |
183 | - new MetricValue.Builder().load(writeBytes.asLong()).add()); | 187 | + service.updateMetric(cm[0], UPDATE_INTERVAL, resourceName.asText()); |
184 | - service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null)); | 188 | + } |
185 | - } | 189 | + |
186 | - | 190 | + if (writeBytes != null) { |
191 | + cm[0] = new ControlMetric(ControlMetricType.DISK_WRITE_BYTES, | ||
192 | + new MetricValue.Builder().load(writeBytes.asLong()).add()); | ||
193 | + service.updateMetric(cm[0], UPDATE_INTERVAL, resourceName.asText()); | ||
194 | + } | ||
195 | + }); | ||
187 | } catch (IOException e) { | 196 | } catch (IOException e) { |
188 | throw new IllegalArgumentException(e.getMessage()); | 197 | throw new IllegalArgumentException(e.getMessage()); |
189 | } | 198 | } |
... | @@ -203,45 +212,49 @@ public class ControlMetricsCollectorWebResource extends AbstractWebResource { | ... | @@ -203,45 +212,49 @@ public class ControlMetricsCollectorWebResource extends AbstractWebResource { |
203 | @Produces(MediaType.APPLICATION_JSON) | 212 | @Produces(MediaType.APPLICATION_JSON) |
204 | public Response networkMetrics(InputStream stream) { | 213 | public Response networkMetrics(InputStream stream) { |
205 | ObjectNode root = mapper().createObjectNode(); | 214 | ObjectNode root = mapper().createObjectNode(); |
206 | - ControlMetric cm; | 215 | + final ControlMetric[] cm = new ControlMetric[1]; |
207 | try { | 216 | try { |
208 | ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream); | 217 | ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream); |
209 | - JsonNode inBytes = jsonTree.get("incomingBytes"); | 218 | + ArrayNode networkRes = (ArrayNode) jsonTree.get("networks"); |
210 | - JsonNode outBytes = jsonTree.get("outgoingBytes"); | 219 | + networkRes.forEach(node -> { |
211 | - JsonNode inPackets = jsonTree.get("incomingPackets"); | 220 | + JsonNode resourceName = node.get("resourceName"); |
212 | - JsonNode outPackets = jsonTree.get("outgoingPackets"); | 221 | + nullIsIllegal(resourceName, INVALID_RESOURCE_NAME); |
213 | - | 222 | + |
214 | - if (inBytes != null) { | 223 | + JsonNode inBytes = jsonTree.get("incomingBytes"); |
215 | - cm = new ControlMetric(ControlMetricType.NW_INCOMING_BYTES, | 224 | + JsonNode outBytes = jsonTree.get("outgoingBytes"); |
216 | - new MetricValue.Builder().load(inBytes.asLong()).add()); | 225 | + JsonNode inPackets = jsonTree.get("incomingPackets"); |
217 | - service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null)); | 226 | + JsonNode outPackets = jsonTree.get("outgoingPackets"); |
218 | - } | 227 | + |
219 | - | 228 | + if (inBytes != null) { |
220 | - if (outBytes != null) { | 229 | + cm[0] = new ControlMetric(ControlMetricType.NW_INCOMING_BYTES, |
221 | - cm = new ControlMetric(ControlMetricType.NW_OUTGOING_BYTES, | 230 | + new MetricValue.Builder().load(inBytes.asLong()).add()); |
222 | - new MetricValue.Builder().load(outBytes.asLong()).add()); | 231 | + service.updateMetric(cm[0], UPDATE_INTERVAL, resourceName.asText()); |
223 | - service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null)); | 232 | + } |
224 | - } | 233 | + |
225 | - | 234 | + if (outBytes != null) { |
226 | - if (inPackets != null) { | 235 | + cm[0] = new ControlMetric(ControlMetricType.NW_OUTGOING_BYTES, |
227 | - cm = new ControlMetric(ControlMetricType.NW_INCOMING_PACKETS, | 236 | + new MetricValue.Builder().load(outBytes.asLong()).add()); |
228 | - new MetricValue.Builder().load(inPackets.asLong()).add()); | 237 | + service.updateMetric(cm[0], UPDATE_INTERVAL, resourceName.asText()); |
229 | - service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null)); | 238 | + } |
230 | - } | 239 | + |
231 | - | 240 | + if (inPackets != null) { |
232 | - if (outPackets != null) { | 241 | + cm[0] = new ControlMetric(ControlMetricType.NW_INCOMING_PACKETS, |
233 | - cm = new ControlMetric(ControlMetricType.NW_OUTGOING_PACKETS, | 242 | + new MetricValue.Builder().load(inPackets.asLong()).add()); |
234 | - new MetricValue.Builder().load(outPackets.asLong()).add()); | 243 | + service.updateMetric(cm[0], UPDATE_INTERVAL, resourceName.asText()); |
235 | - service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null)); | 244 | + } |
236 | - } | 245 | + |
237 | - | 246 | + if (outPackets != null) { |
247 | + cm[0] = new ControlMetric(ControlMetricType.NW_OUTGOING_PACKETS, | ||
248 | + new MetricValue.Builder().load(outPackets.asLong()).add()); | ||
249 | + service.updateMetric(cm[0], UPDATE_INTERVAL, resourceName.asText()); | ||
250 | + } | ||
251 | + }); | ||
238 | } catch (IOException e) { | 252 | } catch (IOException e) { |
239 | throw new IllegalArgumentException(e.getMessage()); | 253 | throw new IllegalArgumentException(e.getMessage()); |
240 | } | 254 | } |
241 | return ok(root).build(); | 255 | return ok(root).build(); |
242 | } | 256 | } |
243 | 257 | ||
244 | - | ||
245 | /** | 258 | /** |
246 | * Collects system specifications. | 259 | * Collects system specifications. |
247 | * The system specs include the various control metrics | 260 | * The system specs include the various control metrics |
... | @@ -283,4 +296,4 @@ public class ControlMetricsCollectorWebResource extends AbstractWebResource { | ... | @@ -283,4 +296,4 @@ public class ControlMetricsCollectorWebResource extends AbstractWebResource { |
283 | } | 296 | } |
284 | return ok(root).build(); | 297 | return ok(root).build(); |
285 | } | 298 | } |
286 | -} | 299 | +} |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
1 | { | 1 | { |
2 | "type": "object", | 2 | "type": "object", |
3 | + "title": "disks", | ||
3 | "required": [ | 4 | "required": [ |
4 | - "readBytes", | 5 | + "disks" |
5 | - "writeBytes" | ||
6 | ], | 6 | ], |
7 | "properties": { | 7 | "properties": { |
8 | - "readBytes": { | 8 | + "disks": { |
9 | - "type": "integer", | 9 | + "type": "array", |
10 | - "format": "int64", | 10 | + "xml": { |
11 | - "example": "500" | 11 | + "name": "disks", |
12 | - }, | 12 | + "wrapped": true |
13 | - "writeBytes": { | 13 | + }, |
14 | - "type": "integer", | 14 | + "items": { |
15 | - "format": "int64", | 15 | + "type": "object", |
16 | - "example": "300" | 16 | + "title": "disks", |
17 | + "required": [ | ||
18 | + "resourceName", | ||
19 | + "readBytes", | ||
20 | + "writeBytes" | ||
21 | + ], | ||
22 | + "properties": { | ||
23 | + "resourceName": { | ||
24 | + "type": "string", | ||
25 | + "example": "disk1" | ||
26 | + }, | ||
27 | + "readBytes": { | ||
28 | + "type": "integer", | ||
29 | + "format": "int64", | ||
30 | + "example": "500" | ||
31 | + }, | ||
32 | + "writeBytes": { | ||
33 | + "type": "integer", | ||
34 | + "format": "int64", | ||
35 | + "example": "300" | ||
36 | + } | ||
37 | + } | ||
38 | + } | ||
17 | } | 39 | } |
18 | } | 40 | } |
19 | } | 41 | } |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
1 | { | 1 | { |
2 | "type": "object", | 2 | "type": "object", |
3 | + "title": "networks", | ||
3 | "required": [ | 4 | "required": [ |
4 | - "incomingBytes", | 5 | + "networks" |
5 | - "outgoingBytes", | ||
6 | - "incomingPackets", | ||
7 | - "outgoingPackets" | ||
8 | ], | 6 | ], |
9 | "properties": { | 7 | "properties": { |
10 | - "incomingBytes": { | 8 | + "networks": { |
11 | - "type": "integer", | 9 | + "type": "array", |
12 | - "format": "int64", | 10 | + "xml": { |
13 | - "example": "1024" | 11 | + "name": "networks", |
14 | - }, | 12 | + "wrapped": true |
15 | - "outgoingBytes": { | 13 | + }, |
16 | - "type": "integer", | 14 | + "items": { |
17 | - "format": "int64", | 15 | + "type": "object", |
18 | - "example": "1024" | 16 | + "title": "networks", |
19 | - }, | 17 | + "required": [ |
20 | - "incomingPackets": { | 18 | + "resourceName", |
21 | - "type": "integer", | 19 | + "incomingBytes", |
22 | - "format": "int64", | 20 | + "outgoingBytes", |
23 | - "example": "1000" | 21 | + "incomingPackets", |
24 | - }, | 22 | + "outgoingPackets" |
25 | - "outgoingPackets": { | 23 | + ], |
26 | - "type": "integer", | 24 | + "properties": { |
27 | - "format": "int64", | 25 | + "resourceName": { |
28 | - "example": "2000" | 26 | + "type": "string", |
27 | + "example": "eth0" | ||
28 | + }, | ||
29 | + "incomingBytes": { | ||
30 | + "type": "integer", | ||
31 | + "format": "int64", | ||
32 | + "example": "1024" | ||
33 | + }, | ||
34 | + "outgoingBytes": { | ||
35 | + "type": "integer", | ||
36 | + "format": "int64", | ||
37 | + "example": "1024" | ||
38 | + }, | ||
39 | + "incomingPackets": { | ||
40 | + "type": "integer", | ||
41 | + "format": "int64", | ||
42 | + "example": "1000" | ||
43 | + }, | ||
44 | + "outgoingPackets": { | ||
45 | + "type": "integer", | ||
46 | + "format": "int64", | ||
47 | + "example": "2000" | ||
48 | + } | ||
49 | + } | ||
50 | + } | ||
29 | } | 51 | } |
30 | } | 52 | } |
31 | } | 53 | } |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
... | @@ -37,6 +37,7 @@ import java.net.ServerSocket; | ... | @@ -37,6 +37,7 @@ import java.net.ServerSocket; |
37 | import java.util.Optional; | 37 | import java.util.Optional; |
38 | 38 | ||
39 | import static org.easymock.EasyMock.anyObject; | 39 | import static org.easymock.EasyMock.anyObject; |
40 | +import static org.easymock.EasyMock.anyString; | ||
40 | import static org.easymock.EasyMock.createMock; | 41 | import static org.easymock.EasyMock.createMock; |
41 | import static org.easymock.EasyMock.expectLastCall; | 42 | import static org.easymock.EasyMock.expectLastCall; |
42 | import static org.easymock.EasyMock.replay; | 43 | import static org.easymock.EasyMock.replay; |
... | @@ -84,19 +85,17 @@ public class ControlMetricsCollectorResourceTest extends JerseyTest { | ... | @@ -84,19 +85,17 @@ public class ControlMetricsCollectorResourceTest extends JerseyTest { |
84 | } | 85 | } |
85 | 86 | ||
86 | @Test | 87 | @Test |
87 | - public void testDiskMetricsPost() { | 88 | + public void testDiskMetricsWithNullName() { |
88 | - mockControlPlaneMonitorService.updateMetric(anyObject(), anyObject(), | 89 | + mockControlPlaneMonitorService.updateMetric(anyObject(), anyObject(), anyString()); |
89 | - (Optional<DeviceId>) anyObject()); | 90 | + expectLastCall().times(4); |
90 | - expectLastCall().times(2); | ||
91 | replay(mockControlPlaneMonitorService); | 91 | replay(mockControlPlaneMonitorService); |
92 | basePostTest("disk-metrics-post.json", PREFIX + "/disk_metrics"); | 92 | basePostTest("disk-metrics-post.json", PREFIX + "/disk_metrics"); |
93 | } | 93 | } |
94 | 94 | ||
95 | @Test | 95 | @Test |
96 | - public void testNetworkMetricsPost() { | 96 | + public void testNetworkMetricsWithNullName() { |
97 | - mockControlPlaneMonitorService.updateMetric(anyObject(), anyObject(), | 97 | + mockControlPlaneMonitorService.updateMetric(anyObject(), anyObject(), anyString()); |
98 | - (Optional<DeviceId>) anyObject()); | 98 | + expectLastCall().times(8); |
99 | - expectLastCall().times(4); | ||
100 | replay(mockControlPlaneMonitorService); | 99 | replay(mockControlPlaneMonitorService); |
101 | basePostTest("network-metrics-post.json", PREFIX + "/network_metrics"); | 100 | basePostTest("network-metrics-post.json", PREFIX + "/network_metrics"); |
102 | } | 101 | } |
... | @@ -106,16 +105,20 @@ public class ControlMetricsCollectorResourceTest extends JerseyTest { | ... | @@ -106,16 +105,20 @@ public class ControlMetricsCollectorResourceTest extends JerseyTest { |
106 | basePostTest("system-spec-post.json", PREFIX + "/system_specs"); | 105 | basePostTest("system-spec-post.json", PREFIX + "/system_specs"); |
107 | } | 106 | } |
108 | 107 | ||
109 | - private void basePostTest(String jsonFile, String path) { | 108 | + private ClientResponse baseTest(String jsonFile, String path) { |
110 | final WebResource rs = resource(); | 109 | final WebResource rs = resource(); |
111 | InputStream jsonStream = ControlMetricsCollectorResourceTest.class | 110 | InputStream jsonStream = ControlMetricsCollectorResourceTest.class |
112 | .getResourceAsStream(jsonFile); | 111 | .getResourceAsStream(jsonFile); |
113 | 112 | ||
114 | assertThat(jsonStream, notNullValue()); | 113 | assertThat(jsonStream, notNullValue()); |
115 | 114 | ||
116 | - ClientResponse response = rs.path(path) | 115 | + return rs.path(path) |
117 | .type(MediaType.APPLICATION_JSON_TYPE) | 116 | .type(MediaType.APPLICATION_JSON_TYPE) |
118 | .post(ClientResponse.class, jsonStream); | 117 | .post(ClientResponse.class, jsonStream); |
118 | + } | ||
119 | + | ||
120 | + private void basePostTest(String jsonFile, String path) { | ||
121 | + ClientResponse response = baseTest(jsonFile, path); | ||
119 | assertThat(response.getStatus(), is(HttpURLConnection.HTTP_OK)); | 122 | assertThat(response.getStatus(), is(HttpURLConnection.HTTP_OK)); |
120 | } | 123 | } |
121 | 124 | ... | ... |
1 | { | 1 | { |
2 | - "readBytes": 500, | 2 | + "disks": [ |
3 | - "writeBytes": 300 | 3 | + { |
4 | + "resourceName": "disk1", | ||
5 | + "readBytes": 500, | ||
6 | + "writeBytes": 300 | ||
7 | + }, | ||
8 | + { | ||
9 | + "resourceName": "disk2", | ||
10 | + "readBytes": 500, | ||
11 | + "writeBytes": 300 | ||
12 | + } | ||
13 | + ] | ||
4 | } | 14 | } |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
1 | { | 1 | { |
2 | - "incomingBytes": 1024, | 2 | + "networks": [ |
3 | - "outgoingBytes": 1024, | 3 | + { |
4 | - "incomingPackets": 1000, | 4 | + "resourceName": "eth0", |
5 | - "outgoingPackets": 2000 | 5 | + "incomingBytes": 1024, |
6 | + "outgoingBytes": 1024, | ||
7 | + "incomingPackets": 1000, | ||
8 | + "outgoingPackets": 2000 | ||
9 | + }, | ||
10 | + { | ||
11 | + "resourceName": "eth1", | ||
12 | + "incomingBytes": 1024, | ||
13 | + "outgoingBytes": 1024, | ||
14 | + "incomingPackets": 1000, | ||
15 | + "outgoingPackets": 2000 | ||
16 | + } | ||
17 | + ] | ||
6 | } | 18 | } |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or login to post a comment