Added GUI integration for device & host properties.
Fixed cell files to remove ONOS_CELL definition within; this is defined externally based on the cell itself.
Showing
8 changed files
with
77 additions
and
12 deletions
1 | # Local VirtualBox-based single ONOS instance & ONOS mininet box | 1 | # Local VirtualBox-based single ONOS instance & ONOS mininet box |
2 | 2 | ||
3 | -export ONOS_CELL="cbench" | ||
4 | - | ||
5 | export ONOS_NIC=192.168.56.* | 3 | export ONOS_NIC=192.168.56.* |
6 | export OC1="192.168.56.103" | 4 | export OC1="192.168.56.103" |
7 | export OCN="192.168.56.103" | 5 | export OCN="192.168.56.103" | ... | ... |
1 | # Local VirtualBox-based ONOS instances 1,2 & ONOS mininet box | 1 | # Local VirtualBox-based ONOS instances 1,2 & ONOS mininet box |
2 | 2 | ||
3 | -export ONOS_CELL="local" | ||
4 | - | ||
5 | export ONOS_NIC=192.168.56.* | 3 | export ONOS_NIC=192.168.56.* |
6 | export OC1="192.168.56.101" | 4 | export OC1="192.168.56.101" |
7 | export OC2="192.168.56.102" | 5 | export OC2="192.168.56.102" | ... | ... |
1 | # ProxMox-based cell of ONOS instance; no mininet-box | 1 | # ProxMox-based cell of ONOS instance; no mininet-box |
2 | 2 | ||
3 | -export ONOS_CELL="office" | ||
4 | - | ||
5 | export ONOS_NIC="10.1.10.*" | 3 | export ONOS_NIC="10.1.10.*" |
6 | export OC1="10.1.10.223" | 4 | export OC1="10.1.10.223" |
7 | export OCI="${OC1}" | 5 | export OCI="${OC1}" | ... | ... |
1 | # ProxMox-based cell of ONOS instances 1,2 & ONOS mininet box | 1 | # ProxMox-based cell of ONOS instances 1,2 & ONOS mininet box |
2 | 2 | ||
3 | -export ONOS_CELL="prox" | ||
4 | - | ||
5 | export ONOS_NIC="10.1.9.*" | 3 | export ONOS_NIC="10.1.9.*" |
6 | export OC1="10.1.9.94" | 4 | export OC1="10.1.9.94" |
7 | export OC2="10.1.9.82" | 5 | export OC2="10.1.9.82" | ... | ... |
1 | # Local VirtualBox-based single ONOS instance & ONOS mininet box | 1 | # Local VirtualBox-based single ONOS instance & ONOS mininet box |
2 | 2 | ||
3 | -export ONOS_CELL="single" | ||
4 | - | ||
5 | export ONOS_NIC=192.168.56.* | 3 | export ONOS_NIC=192.168.56.* |
6 | export OC1="192.168.56.101" | 4 | export OC1="192.168.56.101" |
7 | export OCN="192.168.56.103" | 5 | export OCN="192.168.56.103" | ... | ... |
1 | # Local VirtualBox-based ONOS instances 1,2,3 & ONOS mininet box | 1 | # Local VirtualBox-based ONOS instances 1,2,3 & ONOS mininet box |
2 | 2 | ||
3 | -export ONOS_CELL="triple" | ||
4 | - | ||
5 | export ONOS_NIC=192.168.56.* | 3 | export ONOS_NIC=192.168.56.* |
6 | export OC1="192.168.56.101" | 4 | export OC1="192.168.56.101" |
7 | export OC2="192.168.56.102" | 5 | export OC2="192.168.56.102" | ... | ... |
... | @@ -18,9 +18,12 @@ package org.onlab.onos.gui; | ... | @@ -18,9 +18,12 @@ package org.onlab.onos.gui; |
18 | import com.fasterxml.jackson.databind.ObjectMapper; | 18 | import com.fasterxml.jackson.databind.ObjectMapper; |
19 | import com.fasterxml.jackson.databind.node.ArrayNode; | 19 | import com.fasterxml.jackson.databind.node.ArrayNode; |
20 | import com.fasterxml.jackson.databind.node.ObjectNode; | 20 | import com.fasterxml.jackson.databind.node.ObjectNode; |
21 | +import org.onlab.onos.net.Annotations; | ||
21 | import org.onlab.onos.net.ConnectPoint; | 22 | import org.onlab.onos.net.ConnectPoint; |
22 | import org.onlab.onos.net.Device; | 23 | import org.onlab.onos.net.Device; |
24 | +import org.onlab.onos.net.DeviceId; | ||
23 | import org.onlab.onos.net.Host; | 25 | import org.onlab.onos.net.Host; |
26 | +import org.onlab.onos.net.HostId; | ||
24 | import org.onlab.onos.net.HostLocation; | 27 | import org.onlab.onos.net.HostLocation; |
25 | import org.onlab.onos.net.Link; | 28 | import org.onlab.onos.net.Link; |
26 | import org.onlab.onos.net.device.DeviceService; | 29 | import org.onlab.onos.net.device.DeviceService; |
... | @@ -35,6 +38,7 @@ import org.onlab.packet.MacAddress; | ... | @@ -35,6 +38,7 @@ import org.onlab.packet.MacAddress; |
35 | import org.onlab.rest.BaseResource; | 38 | import org.onlab.rest.BaseResource; |
36 | 39 | ||
37 | import javax.ws.rs.GET; | 40 | import javax.ws.rs.GET; |
41 | +import javax.ws.rs.PathParam; | ||
38 | import javax.ws.rs.Produces; | 42 | import javax.ws.rs.Produces; |
39 | import javax.ws.rs.core.Response; | 43 | import javax.ws.rs.core.Response; |
40 | import java.util.HashMap; | 44 | import java.util.HashMap; |
... | @@ -43,12 +47,17 @@ import java.util.Iterator; | ... | @@ -43,12 +47,17 @@ import java.util.Iterator; |
43 | import java.util.Map; | 47 | import java.util.Map; |
44 | import java.util.Set; | 48 | import java.util.Set; |
45 | 49 | ||
50 | +import static org.onlab.onos.net.DeviceId.deviceId; | ||
51 | +import static org.onlab.onos.net.HostId.hostId; | ||
52 | + | ||
46 | /** | 53 | /** |
47 | * Topology viewer resource. | 54 | * Topology viewer resource. |
48 | */ | 55 | */ |
49 | @javax.ws.rs.Path("topology") | 56 | @javax.ws.rs.Path("topology") |
50 | public class TopologyResource extends BaseResource { | 57 | public class TopologyResource extends BaseResource { |
51 | 58 | ||
59 | + private static final String HOST_SEP = "/"; | ||
60 | + | ||
52 | @javax.ws.rs.Path("/graph") | 61 | @javax.ws.rs.Path("/graph") |
53 | @GET | 62 | @GET |
54 | @Produces("application/json") | 63 | @Produces("application/json") |
... | @@ -70,6 +79,60 @@ public class TopologyResource extends BaseResource { | ... | @@ -70,6 +79,60 @@ public class TopologyResource extends BaseResource { |
70 | return Response.ok(rootNode.toString()).build(); | 79 | return Response.ok(rootNode.toString()).build(); |
71 | } | 80 | } |
72 | 81 | ||
82 | + @javax.ws.rs.Path("/graph/{id}") | ||
83 | + @GET | ||
84 | + @Produces("application/json") | ||
85 | + public Response details(@PathParam("id") String id) { | ||
86 | + if (id.contains(HOST_SEP)) { | ||
87 | + return hostDetails(hostId(id)); | ||
88 | + } | ||
89 | + return deviceDetails(deviceId(id)); | ||
90 | + } | ||
91 | + | ||
92 | + // Returns device details response. | ||
93 | + private Response deviceDetails(DeviceId deviceId) { | ||
94 | + DeviceService deviceService = get(DeviceService.class); | ||
95 | + Device device = deviceService.getDevice(deviceId); | ||
96 | + Annotations annot = device.annotations(); | ||
97 | + ObjectNode r = json(deviceId.toString(), | ||
98 | + new Prop("Name", annot.value("name")), | ||
99 | + new Prop("Vendor", device.manufacturer()), | ||
100 | + new Prop("H/W Version", device.hwVersion()), | ||
101 | + new Prop("S/W Version", device.swVersion()), | ||
102 | + new Prop("S/W Version", device.serialNumber()), | ||
103 | + new Prop("Latitude", annot.value("latitude")), | ||
104 | + new Prop("Longitude", annot.value("longitude"))); | ||
105 | + return Response.ok(r.toString()).build(); | ||
106 | + } | ||
107 | + | ||
108 | + // Returns host details response. | ||
109 | + private Response hostDetails(HostId hostId) { | ||
110 | + HostService hostService = get(HostService.class); | ||
111 | + Host host = hostService.getHost(hostId); | ||
112 | + Annotations annot = host.annotations(); | ||
113 | + ObjectNode r = json(hostId.toString(), | ||
114 | + new Prop("MAC", host.mac().toString()), | ||
115 | + new Prop("IP", host.ipAddresses().toString()), | ||
116 | + new Prop("Latitude", annot.value("latitude")), | ||
117 | + new Prop("Longitude", annot.value("longitude"))); | ||
118 | + return Response.ok(r.toString()).build(); | ||
119 | + } | ||
120 | + | ||
121 | + // Produces JSON property details. | ||
122 | + private ObjectNode json(String id, Prop... props) { | ||
123 | + ObjectMapper mapper = new ObjectMapper(); | ||
124 | + ObjectNode result = mapper.createObjectNode().put("id", id); | ||
125 | + ObjectNode pnode = mapper.createObjectNode(); | ||
126 | + ArrayNode porder = mapper.createArrayNode(); | ||
127 | + for (Prop p : props) { | ||
128 | + porder.add(p.key); | ||
129 | + pnode.put(p.key, p.value); | ||
130 | + } | ||
131 | + result.set("propOrder", porder); | ||
132 | + result.set("props", pnode); | ||
133 | + return result; | ||
134 | + } | ||
135 | + | ||
73 | // Encodes all infrastructure devices. | 136 | // Encodes all infrastructure devices. |
74 | private ArrayNode getDevices(ObjectMapper mapper, DeviceService deviceService, | 137 | private ArrayNode getDevices(ObjectMapper mapper, DeviceService deviceService, |
75 | TopologyGraph graph) { | 138 | TopologyGraph graph) { |
... | @@ -209,4 +272,14 @@ public class TopologyResource extends BaseResource { | ... | @@ -209,4 +272,14 @@ public class TopologyResource extends BaseResource { |
209 | return cp.elementId().toString(); | 272 | return cp.elementId().toString(); |
210 | } | 273 | } |
211 | 274 | ||
275 | + // Auxiliary key/value carrier. | ||
276 | + private final class Prop { | ||
277 | + private final String key; | ||
278 | + private final String value; | ||
279 | + | ||
280 | + private Prop(String key, String value) { | ||
281 | + this.key = key; | ||
282 | + this.value = value; | ||
283 | + } | ||
284 | + } | ||
212 | } | 285 | } | ... | ... |
... | @@ -38,6 +38,7 @@ | ... | @@ -38,6 +38,7 @@ |
38 | collisionPrevention: true | 38 | collisionPrevention: true |
39 | }, | 39 | }, |
40 | XjsonUrl: 'rs/topology/graph', | 40 | XjsonUrl: 'rs/topology/graph', |
41 | + XjsonPrefix: '', | ||
41 | jsonUrl: 'json/network.json', | 42 | jsonUrl: 'json/network.json', |
42 | jsonPrefix: 'json/', | 43 | jsonPrefix: 'json/', |
43 | iconUrl: { | 44 | iconUrl: { |
... | @@ -889,9 +890,12 @@ | ... | @@ -889,9 +890,12 @@ |
889 | } | 890 | } |
890 | 891 | ||
891 | function detailUrl(id) { | 892 | function detailUrl(id) { |
893 | + if (config.jsonPrefix) { | ||
892 | var safeId = id.replace(/[^a-z0-9]/gi, '_'); | 894 | var safeId = id.replace(/[^a-z0-9]/gi, '_'); |
893 | return config.jsonPrefix + safeId + '.json'; | 895 | return config.jsonPrefix + safeId + '.json'; |
894 | } | 896 | } |
897 | + return config.jsonUrl + '/' + encodeURIComponent(id); | ||
898 | + } | ||
895 | 899 | ||
896 | function flyinPane(obj) { | 900 | function flyinPane(obj) { |
897 | var pane = d3.select('#flyout'), | 901 | var pane = d3.select('#flyout'), | ... | ... |
-
Please register or login to post a comment