Thomas Vachuska
Committed by Gerrit Code Review

Prototyping mouse-over behaviour for path/traffic selection; needs re-work.

Change-Id: I27507e8129b790e56192077bfb56028f2ec56d90
...@@ -91,7 +91,7 @@ public class TopologyWebSocket ...@@ -91,7 +91,7 @@ public class TopologyWebSocket
91 private final IntentListener intentListener = new InternalIntentListener(); 91 private final IntentListener intentListener = new InternalIntentListener();
92 92
93 // Intents that are being monitored for the GUI 93 // Intents that are being monitored for the GUI
94 - private static Map<Intent, Long> intentsToMonitor = new ConcurrentHashMap<>(); 94 + private Map<Intent, Long> intentsToMonitor = new ConcurrentHashMap<>();
95 95
96 private long lastActive = System.currentTimeMillis(); 96 private long lastActive = System.currentTimeMillis();
97 private boolean listenersRemoved = false; 97 private boolean listenersRemoved = false;
...@@ -118,6 +118,8 @@ public class TopologyWebSocket ...@@ -118,6 +118,8 @@ public class TopologyWebSocket
118 118
119 /** 119 /**
120 * Indicates if this connection is idle. 120 * Indicates if this connection is idle.
121 + *
122 + * @return true if idle or closed
121 */ 123 */
122 synchronized boolean isIdle() { 124 synchronized boolean isIdle() {
123 boolean idle = (System.currentTimeMillis() - lastActive) > MAX_AGE_MS; 125 boolean idle = (System.currentTimeMillis() - lastActive) > MAX_AGE_MS;
...@@ -293,6 +295,10 @@ public class TopologyWebSocket ...@@ -293,6 +295,10 @@ public class TopologyWebSocket
293 // Produces a set of intents that target all selected hosts or connect points. 295 // Produces a set of intents that target all selected hosts or connect points.
294 private Set<Intent> getIntents(Set<Host> hosts, Set<ConnectPoint> edgePoints) { 296 private Set<Intent> getIntents(Set<Host> hosts, Set<ConnectPoint> edgePoints) {
295 Set<Intent> intents = new HashSet<>(); 297 Set<Intent> intents = new HashSet<>();
298 + if (hosts.isEmpty()) {
299 + return intents;
300 + }
301 +
296 for (Intent intent : intentService.getIntents()) { 302 for (Intent intent : intentService.getIntents()) {
297 boolean isRelevant = false; 303 boolean isRelevant = false;
298 if (intent instanceof HostToHostIntent) { 304 if (intent instanceof HostToHostIntent) {
...@@ -454,6 +460,7 @@ public class TopologyWebSocket ...@@ -454,6 +460,7 @@ public class TopologyWebSocket
454 ObjectNode payload = pathMessage(path, "host") 460 ObjectNode payload = pathMessage(path, "host")
455 .put("intentId", intent.id().toString()); 461 .put("intentId", intent.id().toString());
456 sendMessage(envelope("showPath", sid, payload)); 462 sendMessage(envelope("showPath", sid, payload));
463 + sendMessage(trafficMessage(intentsToMonitor.keySet(), sid));
457 } 464 }
458 } 465 }
459 } 466 }
......
...@@ -88,7 +88,7 @@ ...@@ -88,7 +88,7 @@
88 linkDistance: { 88 linkDistance: {
89 direct: 100, 89 direct: 100,
90 optical: 120, 90 optical: 120,
91 - hostLink: 5 91 + hostLink: 3
92 }, 92 },
93 linkStrength: { 93 linkStrength: {
94 direct: 1.0, 94 direct: 1.0,
...@@ -98,7 +98,7 @@ ...@@ -98,7 +98,7 @@
98 note_for_nodes: 'node.class is used to differentiate', 98 note_for_nodes: 'node.class is used to differentiate',
99 charge: { 99 charge: {
100 device: -8000, 100 device: -8000,
101 - host: -300 101 + host: -5000
102 }, 102 },
103 pad: 20, 103 pad: 20,
104 translate: function() { 104 translate: function() {
...@@ -497,14 +497,16 @@ ...@@ -497,14 +497,16 @@
497 497
498 function showTraffic(data) { 498 function showTraffic(data) {
499 fnTrace('showTraffic', data.payload.id); 499 fnTrace('showTraffic', data.payload.id);
500 - data.payload.paths.forEach(function () { 500 + var paths = data.payload.paths;
501 - var links = data.payload.links, 501 +
502 - s = [ data.event + "\n" + links.length ]; 502 + // Revert any links hilighted previously.
503 - links.forEach(function (d, i) { 503 + network.links.forEach(function (d) {
504 - s.push(d); 504 + d.el.classed('showPath', false);
505 }); 505 });
506 - network.view.alert(s.join('\n'));
507 506
507 + // Now hilight all links in the paths payload.
508 + paths.forEach(function (d) {
509 + var links = d.links;
508 links.forEach(function (d, i) { 510 links.forEach(function (d, i) {
509 var link = network.lookup[d]; 511 var link = network.lookup[d];
510 if (link) { 512 if (link) {
...@@ -559,10 +561,11 @@ ...@@ -559,10 +561,11 @@
559 return true; 561 return true;
560 } 562 }
561 563
562 - function requestTraffic() { 564 + function requestTraffic(hoverNode) {
563 - if (nSel() > 0) { 565 + if (nSel() > 0 || hoverNode) {
566 + var nodes = hoverNode ? selectOrder.concat(hoverNode.id) : selectOrder;
564 sendMessage('requestTraffic', { 567 sendMessage('requestTraffic', {
565 - ids: selectOrder 568 + ids: nodes
566 }); 569 });
567 } else { 570 } else {
568 userFeedback('Request-Traffic requires one or\n' + 571 userFeedback('Request-Traffic requires one or\n' +
...@@ -582,12 +585,16 @@ ...@@ -582,12 +585,16 @@
582 } 585 }
583 } 586 }
584 587
585 - function cancelTraffic() { 588 + function cancelTraffic(hoverNode) {
589 + if (hoverNode && selectOrder.length) {
590 + requestTraffic();
591 + } else {
586 // FIXME: from where do we get the intent id(s) to send to the server? 592 // FIXME: from where do we get the intent id(s) to send to the server?
587 sendMessage('cancelTraffic', { 593 sendMessage('cancelTraffic', {
588 ids: ["need_the_intent_id"] 594 ids: ["need_the_intent_id"]
589 }); 595 });
590 } 596 }
597 + }
591 598
592 // request details for the selected element 599 // request details for the selected element
593 function requestDetails() { 600 function requestDetails() {
...@@ -943,7 +950,18 @@ ...@@ -943,7 +950,18 @@
943 opacity: 0 950 opacity: 0
944 }) 951 })
945 .call(network.drag) 952 .call(network.drag)
946 - //.on('mouseover', function (d) {}) 953 + .on('mouseover', function (d) {
954 + console.log(d);
955 + if (d.class === 'host') {
956 + requestTraffic(d);
957 + }
958 + })
959 + .on('mouseout', function (d) {
960 + console.log(d);
961 + if (d.class === 'host') {
962 + cancelTraffic(d);
963 + }
964 + })
947 //.on('mouseover', function (d) {}) 965 //.on('mouseover', function (d) {})
948 .transition() 966 .transition()
949 .attr('opacity', 1); 967 .attr('opacity', 1);
......