Andrea Campanella
Committed by Gerrit Code Review

ONOS-3182 Adding device badges and bug fixes

Change-Id: I84a0e8ec4e968ad80d08d086fa951cc4800aa70b
...@@ -30,7 +30,10 @@ import org.onosproject.net.topology.PathService; ...@@ -30,7 +30,10 @@ import org.onosproject.net.topology.PathService;
30 import org.onosproject.ui.RequestHandler; 30 import org.onosproject.ui.RequestHandler;
31 import org.onosproject.ui.UiConnection; 31 import org.onosproject.ui.UiConnection;
32 import org.onosproject.ui.UiMessageHandler; 32 import org.onosproject.ui.UiMessageHandler;
33 +import org.onosproject.ui.topo.DeviceHighlight;
33 import org.onosproject.ui.topo.Highlights; 34 import org.onosproject.ui.topo.Highlights;
35 +import org.onosproject.ui.topo.HostHighlight;
36 +import org.onosproject.ui.topo.NodeBadge;
34 import org.onosproject.ui.topo.TopoJson; 37 import org.onosproject.ui.topo.TopoJson;
35 import org.slf4j.Logger; 38 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory; 39 import org.slf4j.LoggerFactory;
...@@ -54,6 +57,11 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler { ...@@ -54,6 +57,11 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler {
54 57
55 private static final String ID = "id"; 58 private static final String ID = "id";
56 private static final String MODE = "mode"; 59 private static final String MODE = "mode";
60 + private static final String TYPE = "type";
61 + private static final String SWITCH = "switch";
62 + private static final String ENDSTATION = "endstation";
63 + public static final String DST = "Dst";
64 + public static final String SRC = "Src";
57 65
58 private Set<Link> allPathLinks; 66 private Set<Link> allPathLinks;
59 67
...@@ -66,6 +74,7 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler { ...@@ -66,6 +74,7 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler {
66 private PathService pathService; 74 private PathService pathService;
67 75
68 private ElementId src, dst; 76 private ElementId src, dst;
77 + private String srcType, dstType;
69 private Mode currentMode = Mode.SHORTEST; 78 private Mode currentMode = Mode.SHORTEST;
70 private List<Path> paths; 79 private List<Path> paths;
71 private int pathIndex; 80 private int pathIndex;
...@@ -96,6 +105,7 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler { ...@@ -96,6 +105,7 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler {
96 // === Handler classes 105 // === Handler classes
97 106
98 private final class SetSrcHandler extends RequestHandler { 107 private final class SetSrcHandler extends RequestHandler {
108 +
99 public SetSrcHandler() { 109 public SetSrcHandler() {
100 super(PAINTER_SET_SRC); 110 super(PAINTER_SET_SRC);
101 } 111 }
...@@ -104,10 +114,15 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler { ...@@ -104,10 +114,15 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler {
104 public void process(long sid, ObjectNode payload) { 114 public void process(long sid, ObjectNode payload) {
105 String id = string(payload, ID); 115 String id = string(payload, ID);
106 src = elementId(id); 116 src = elementId(id);
117 + srcType = string(payload, TYPE);
107 if (src.equals(dst)) { 118 if (src.equals(dst)) {
108 dst = null; 119 dst = null;
109 } 120 }
110 - findAndSendPaths(); 121 + sendMessage(TopoJson.highlightsMessage(addBadge(new Highlights(),
122 + srcType,
123 + src.toString(),
124 + SRC)));
125 + findAndSendPaths(currentMode);
111 } 126 }
112 } 127 }
113 128
...@@ -120,10 +135,16 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler { ...@@ -120,10 +135,16 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler {
120 public void process(long sid, ObjectNode payload) { 135 public void process(long sid, ObjectNode payload) {
121 String id = string(payload, ID); 136 String id = string(payload, ID);
122 dst = elementId(id); 137 dst = elementId(id);
138 + dstType = string(payload, TYPE);
123 if (src.equals(dst)) { 139 if (src.equals(dst)) {
124 src = null; 140 src = null;
125 } 141 }
126 - findAndSendPaths(); 142 +
143 + sendMessage(TopoJson.highlightsMessage(addBadge(new Highlights(),
144 + dstType,
145 + dst.toString(),
146 + DST)));
147 + findAndSendPaths(currentMode);
127 } 148 }
128 } 149 }
129 150
...@@ -137,7 +158,10 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler { ...@@ -137,7 +158,10 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler {
137 ElementId temp = src; 158 ElementId temp = src;
138 src = dst; 159 src = dst;
139 dst = temp; 160 dst = temp;
140 - findAndSendPaths(); 161 + String s = srcType;
162 + srcType = dstType;
163 + dstType = s;
164 + findAndSendPaths(currentMode);
141 } 165 }
142 } 166 }
143 167
...@@ -177,11 +201,7 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler { ...@@ -177,11 +201,7 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler {
177 Mode.SHORTEST : (mode.equals("disjoint") ? 201 Mode.SHORTEST : (mode.equals("disjoint") ?
178 Mode.DISJOINT : Mode.SRLG)); 202 Mode.DISJOINT : Mode.SRLG));
179 //TODO: add support for SRLG 203 //TODO: add support for SRLG
180 - if (currentMode.equals(Mode.SHORTEST)) { 204 + findAndSendPaths(currentMode);
181 - findAndSendPaths();
182 - } else {
183 - findAndSendDisjointPaths();
184 - }
185 } 205 }
186 } 206 }
187 207
...@@ -195,40 +215,40 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler { ...@@ -195,40 +215,40 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler {
195 } 215 }
196 } 216 }
197 217
198 - private void findAndSendPaths() { 218 + private void findAndSendPaths(Mode mode) {
219 + log.info("src={}; dst={}; mode={}", src, dst, currentMode);
199 if (src != null && dst != null) { 220 if (src != null && dst != null) {
200 - paths = ImmutableList.copyOf(pathService.getPaths(src, dst));
201 pathIndex = 0; 221 pathIndex = 0;
202 -
203 ImmutableSet.Builder<Link> builder = ImmutableSet.builder(); 222 ImmutableSet.Builder<Link> builder = ImmutableSet.builder();
204 - paths.forEach(path -> path.links().forEach(builder::add)); 223 + if (mode.equals(Mode.SHORTEST)) {
205 - allPathLinks = builder.build(); 224 + paths = ImmutableList.copyOf(pathService.getPaths(src, dst));
225 + allPathLinks = buildPaths(builder).build();
226 + } else if (mode.equals(Mode.DISJOINT)) {
227 + paths = ImmutableList.copyOf(pathService.getDisjointPaths(src, dst));
228 + allPathLinks = buildDisjointPaths(builder).build();
229 + } else {
230 + log.info("Unsupported MODE");
231 + }
206 } else { 232 } else {
207 paths = ImmutableList.of(); 233 paths = ImmutableList.of();
208 allPathLinks = ImmutableSet.of(); 234 allPathLinks = ImmutableSet.of();
209 } 235 }
210 hilightAndSendPaths(); 236 hilightAndSendPaths();
237 +
211 } 238 }
212 239
213 - private void findAndSendDisjointPaths() { 240 + private ImmutableSet.Builder<Link> buildPaths(ImmutableSet.Builder<Link> pathBuilder) {
214 - log.info("src={}; dst={}; mode={}", src, dst, currentMode); 241 + paths.forEach(path -> path.links().forEach(pathBuilder::add));
215 - if (src != null && dst != null) { 242 + return pathBuilder;
216 - log.info("test" + src + dst); 243 + }
217 - paths = ImmutableList.copyOf(pathService.getDisjointPaths(src, dst));
218 - pathIndex = 0;
219 244
220 - ImmutableSet.Builder<Link> builder = ImmutableSet.builder(); 245 + private ImmutableSet.Builder<Link> buildDisjointPaths(ImmutableSet.Builder<Link> pathBuilder) {
221 paths.forEach(path -> { 246 paths.forEach(path -> {
222 DisjointPath dp = (DisjointPath) path; 247 DisjointPath dp = (DisjointPath) path;
223 - builder.addAll(dp.primary().links()); 248 + pathBuilder.addAll(dp.primary().links());
224 - builder.addAll(dp.backup().links()); 249 + pathBuilder.addAll(dp.backup().links());
225 }); 250 });
226 - allPathLinks = builder.build(); 251 + return pathBuilder;
227 - } else {
228 - paths = ImmutableList.of();
229 - allPathLinks = ImmutableSet.of();
230 - }
231 - hilightAndSendPaths();
232 } 252 }
233 253
234 private void hilightAndSendPaths() { 254 private void hilightAndSendPaths() {
...@@ -253,23 +273,40 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler { ...@@ -253,23 +273,40 @@ public class PathPainterTopovMessageHandler extends UiMessageHandler {
253 plink.computeHilight(selectedPathLinks, allPathLinks); 273 plink.computeHilight(selectedPathLinks, allPathLinks);
254 highlights.add(plink.highlight(null)); 274 highlights.add(plink.highlight(null));
255 } 275 }
256 - 276 + if (src != null) {
277 + highlights = addBadge(highlights, srcType, src.toString(), SRC);
278 + }
279 + if (dst != null) {
280 + highlights = addBadge(highlights, dstType, dst.toString(), DST);
281 + }
257 sendMessage(TopoJson.highlightsMessage(highlights)); 282 sendMessage(TopoJson.highlightsMessage(highlights));
258 } 283 }
259 284
260 - /* 285 + private Highlights addBadge(Highlights highlights, String type, String elemId, String src) {
261 - private void addDeviceBadge(Highlights h, DeviceId devId, int n) { 286 + if (SWITCH.equals(type)) {
262 - DeviceHighlight dh = new DeviceHighlight(devId.toString()); 287 + highlights = addDeviceBadge(highlights, elemId, src);
263 - dh.setBadge(createBadge(n)); 288 + } else if (ENDSTATION.equals(type)) {
289 + highlights = addHostBadge(highlights, elemId, src);
290 + }
291 + return highlights;
292 + }
293 +
294 + private Highlights addDeviceBadge(Highlights h, String elemId, String type) {
295 + DeviceHighlight dh = new DeviceHighlight(elemId);
296 + dh.setBadge(createBadge(type));
264 h.add(dh); 297 h.add(dh);
298 + return h;
265 } 299 }
266 300
267 - private NodeBadge createBadge(int n) { 301 + private Highlights addHostBadge(Highlights h, String elemId, String type) {
268 - Status status = n > 3 ? Status.ERROR : Status.WARN; 302 + HostHighlight hh = new HostHighlight(elemId);
269 - String noun = n > 3 ? "(critical)" : "(problematic)"; 303 + hh.setBadge(createBadge(type));
270 - String msg = "Egress links: " + n + " " + noun; 304 + h.add(hh);
271 - return NodeBadge.number(status, n, msg); 305 + return h;
306 + }
307 +
308 + private NodeBadge createBadge(String type) {
309 + return NodeBadge.text(type);
272 } 310 }
273 - */
274 311
275 } 312 }
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -47,14 +47,16 @@ ...@@ -47,14 +47,16 @@
47 47
48 function setSrc(node) { 48 function setSrc(node) {
49 wss.sendEvent(srcMessage, { 49 wss.sendEvent(srcMessage, {
50 - id: node.id 50 + id: node.id,
51 + type: node.type
51 }); 52 });
52 flash.flash('Source node: ' + node.id); 53 flash.flash('Source node: ' + node.id);
53 } 54 }
54 55
55 function setDst(node) { 56 function setDst(node) {
56 wss.sendEvent(dstMessage, { 57 wss.sendEvent(dstMessage, {
57 - id: node.id 58 + id: node.id,
59 + type: node.type
58 }); 60 });
59 flash.flash('Destination node: ' + node.id); 61 flash.flash('Destination node: ' + node.id);
60 } 62 }
......
...@@ -26,38 +26,33 @@ ...@@ -26,38 +26,33 @@
26 glyphs: { 26 glyphs: {
27 src: { 27 src: {
28 vb: '0 0 110 110', 28 vb: '0 0 110 110',
29 - d: 'M26.9,57 M27,86c0.5-9.6,5.8-25.3,13.6-35.2c4.2-5.4,6.2-10.6,6.2-13.8' + 29 + d: 'M28.7,59.3 M14.9,53 M8.7,39 M32.4,92.5H25l-0.2-3.6' +
30 - 'c0-11-8.9-20-19.9-20h0C15.9,17,7,26,7,37c0,3.2,1.9,8.4,6.2,13.8c7.8,9.9,13.1,25.5,13.6,35.2H27z M27.7,86.7l0-0.7' + 30 + 'c-0.5-9-5.4-23.9-12.9-33.5c-5.2-6.6-7-12.8-7-16.3c0-13.3,10.7-24,23.8-24c13.1,0,23.8,10.8,23.8,24c0,3.5-1.8,9.7-7,16.3' +
31 - 'c0.5-9.3,5.6-24.8,13.4-34.7c4.7-5.9,6.3-11.3,6.3-14.3c0-11.4-9.3-20.7-20.6-20.7C15.5,16.3,6.2,25.6,6.2,37c0,3,1.7,8.3,6.3,14.3' + 31 + 'C38,65,33.1,80,32.6,88.9L32.4,92.5z M27.9,89.5h1.7l0-0.7c0.5-9.4,5.7-25.2,13.5-35.2c4.7-6,6.4-11.4,6.4-14.5' +
32 - 'c7.8,9.9,13,25.5,13.4,34.7l0,0.7H27.7L27.7,86.7z M26.9,17.8C37.4,17.8,46,26.4,46,37c0,2.6-1.6,7.7-6,13.3' + 32 + 'c0-11.6-9.3-21-20.8-21C17.3,18,7.9,27.5,7.9,39c0,3,1.7,8.4,6.4,14.5c7.9,10.1,13.1,25.8,13.5,35.2L27.9,89.5z M28.7,83.2' +
33 - 'c-6.6,8.4-11.4,20.8-13.1,30.2c-1.7-9.4-6.5-21.8-13.1-30.2c-4.4-5.6-6-10.7-6-13.3C7.7,26.4,16.3,17.8,26.9,17.8L26.9,17.8z' + 33 + 'M28.6,29.8c-4.7,0-8.5,3.8-8.5,8.5c0,4.7,3.8,8.5,8.5,8.5s8.5-3.8,8.5-8.5C37.1,33.6,33.3,29.8,28.6,29.8z M89.6,47 M89.6,29.5' +
34 - 'M87.3,35.5H46.9v2h40.4V35.5z M26.8,27.9c-4.7,0-8.4,3.8-8.4,8.4c0,4.6,3.8,8.4,8.4,8.4s8.4-3.7,8.4-8.4' + 34 + 'c-0.1,3.1-0.1,12.8,0,17c0.1,4.2,14.1-5.5,13.9-8.5C103.4,35.1,89.6,25.6,89.6,29.5z M51,38.1L89.5,38 M89.5,39.5l0-3L51,36.5l0,3' +
35 - 'C35.2,31.6,31.4,27.9,26.8,27.9z M87.3,44.9 M87.3,28.1c-0.1,3.1-0.1,12.6,0,16.7c0.1,4.1,13.9-5.5,13.8-8.4' + 35 + 'L89.5,39.5z'
36 - 'C101,33.6,87.3,24.2,87.3,28.1z'
37 }, 36 },
38 dst: { 37 dst: {
39 vb: '0 0 110 110', 38 vb: '0 0 110 110',
40 - d: 'M80.6,57 M80.7,86c0.5-9.6,5.8-25.3,13.5-35.2c4.2-5.4,6.1-10.6,6.1-13.8' + 39 + d: 'M80.3,59.8 M85.8,92.5h-7.2L78.4,89c-0.4-8.8-5.2-23.6-12.3-33' +
41 - 'c0-11-8.8-20-19.7-20h0C69.7,17,60.8,26,60.8,37c0,3.2,1.9,8.4,6.1,13.8c7.7,9.9,13,25.5,13.5,35.2H80.7z M81.4,86.7l0-0.7' + 40 + 'c-4.9-6.5-6.7-12.5-6.7-16c0-13,10.2-23.7,22.7-23.7c12.5,0,22.7,10.6,22.7,23.7c0,3.5-1.8,9.5-6.7,16C91.2,65.4,86.4,80.1,86,89' +
42 - 'c0.5-9.3,5.6-24.8,13.4-34.7c4.6-5.9,6.3-11.3,6.3-14.3c0-11.4-9.2-20.7-20.5-20.7S60.1,25.6,60.1,37c0,3,1.7,8.3,6.3,14.3' + 41 + 'L85.8,92.5z M81.4,89.5H83l0-0.7c0.5-9.3,5.4-24.8,12.9-34.7c4.5-5.9,6.1-11.2,6.1-14.2c0-11.4-8.9-20.7-19.8-20.7' +
43 - 'c7.8,9.9,12.9,25.5,13.4,34.7l0,0.7H81.4L81.4,86.7z M80.6,17.8c10.5,0,19,8.6,19,19.2c0,2.6-1.6,7.7-6,13.3' + 42 + 'c-10.9,0-19.8,9.3-19.8,20.7c0,3,1.6,8.3,6.1,14.2C76,64,80.9,79.5,81.4,88.8L81.4,89.5z M82.1,30.8c-4.5,0-8.1,3.7-8.1,8.4' +
44 - 'c-6.6,8.4-11.3,20.8-13,30.2c-1.7-9.4-6.4-21.8-13-30.2c-4.4-5.6-6-10.7-6-13.3C61.6,26.4,70.1,17.8,80.6,17.8L80.6,17.8z' + 43 + 's3.6,8.4,8.1,8.4c4.5,0,8.1-3.7,8.1-8.4S86.6,30.8,82.1,30.8z M47.2,47.5 M45.2,30.8c-0.1,3.1-0.1,12.6,0,16.7' +
45 - 'M46.3,35.2H6.2v2h40.1V35.2z M80.5,27.9c-4.6,0-8.4,3.7-8.4,8.4c0,4.6,3.7,8.4,8.4,8.4s8.4-3.7,8.4-8.4' + 44 + 'c0.1,4.1,13.4-5.4,13.3-8.4C58.4,36.2,45.2,26.9,45.2,30.8z M45.2,39.1L6.7,39.2 M45.2,40.6l0-3L6.7,37.7l0,3L45.2,40.6z'
46 - 'C88.9,31.6,85.1,27.9,80.5,27.9z M46.3,44.6 M46.3,27.9c-0.1,3.1-0.1,12.6,0,16.7c0.1,4.1,13.9-5.5,13.7-8.4' +
47 - 'C60,33.3,46.3,24,46.3,27.9z'
48 }, 45 },
49 jp: { 46 jp: {
50 vb: '0 0 110 110', 47 vb: '0 0 110 110',
51 - d: 'M27,26.8H7.4V7.6H27V26.8z M102.1,79.5H82.6v19.2h19.5V79.5z M59.3,47.1H39.8v19.2' + 48 + d: 'M84.3,89.3L58.9,64.2l-1.4,1.4L83,90.7L84.3,89.3z M27,7.6H7.4v19.2H27V7.6z' +
52 - 'h19.5V47.1z M41.7,47.5L17.1,25.2l-1.3,1.4l24.6,22.3L41.7,47.5z M84.5,89.5L59,64.3l-1.4,1.4l25.4,25.2L84.5,89.5z' 49 + 'M59.3,47.1H39.8v19.2h19.5V47.1z M102.1,79.5H82.6v19.2h19.5V79.5z M41.7,47.6L19,25.1l-1.2,1.2l22.7,22.5L41.7,47.6z'
53 }, 50 },
54 djp: { 51 djp: {
55 vb: '0 0 110 110', 52 vb: '0 0 110 110',
56 - d: 'M27.6,28.8H7.7V9h19.9V28.8z M103,37.2H83.1V57H103V37.2z M36.2,84.5H16.3v19.9' + 53 + d: 'M25.8,84l-9.2-57 M27.3,83.8l-9.2-57l-3,0.5l9.2,57L27.3,83.8z M83.2,37.7L26.8,15.5 M83.7,36.1L26.6,14' +
57 - 'h19.9V84.5z M27.9,85.7L18.7,28l-2,0.3L25.9,86L27.9,85.7z M92.2,59.1L91,57.4L34.6,96.8l1.1,1.6L92.2,59.1z M28.5,80.7' + 54 + 'l-1,3.2l57,22.1L83.7,36.1z M34.1,95l61.4-40.6 M96.4,55.7l-1.9-2.5L33.2,93.8l1.9,2.5L96.4,55.7z M26.6,27.6H6.7V7.7h19.9V27.6z' +
58 - 'c-0.8,0.2-3.5,0.7-4.6,1c-1.1,0.3,2.2,3.1,3,2.9S29.6,80.5,28.5,80.7z M88.8,57.5c0.5,0.7,2,2.9,2.7,3.8c0.7,0.9,2-3.2,1.5-3.9' + 55 + 'M102.1,36H82.2v19.9h19.9V36z M35.3,83.5H15.3v19.9h19.9V83.5z'
59 - 'C92.5,56.8,88.2,56.6,88.8,57.5z M97.7,42.5L27.2,17.9l-0.7,1.9l70.5,24.6L97.7,42.5z M30.7,22.6c0.3-0.8,1.2-3.3,1.5-4.4' +
60 - 'c0.4-1.1-3.8,0.3-4,1.1C27.9,20.1,30.3,23.7,30.7,22.6z'
61 } 56 }
62 57
63 }, 58 },
...@@ -70,7 +65,6 @@ ...@@ -70,7 +65,6 @@
70 }, 65 },
71 66
72 // detail panel button definitions 67 // detail panel button definitions
73 - // FIXME: new icons for src/dst
74 buttons: { 68 buttons: {
75 src: { 69 src: {
76 gid: '*src', 70 gid: '*src',
...@@ -93,7 +87,6 @@ ...@@ -93,7 +87,6 @@
93 // Key bindings for traffic overlay buttons 87 // Key bindings for traffic overlay buttons
94 // NOTE: fully qual. button ID is derived from overlay-id and key-name 88 // NOTE: fully qual. button ID is derived from overlay-id and key-name
95 // FIXME: use into [ and ] instead of 1 and 2 89 // FIXME: use into [ and ] instead of 1 and 2
96 - // FIXME: new icons for src/dst
97 // FIXME: find better keys for shortest paths & disjoint paths modes 90 // FIXME: find better keys for shortest paths & disjoint paths modes
98 keyBindings: { 91 keyBindings: {
99 1: { 92 1: {
......