Thomas Vachuska
Committed by Gerrit Code Review

GUI Fixes.

Change-Id: I5b5de2b74b65f1af613e04e226ee633ee50f695d
...@@ -164,16 +164,18 @@ public class TopologyViewIntentFilter { ...@@ -164,16 +164,18 @@ public class TopologyViewIntentFilter {
164 164
165 // Indicates whether the specified intent involves the given device. 165 // Indicates whether the specified intent involves the given device.
166 private boolean isIntentRelevantToDevice(List<Intent> installables, Device device) { 166 private boolean isIntentRelevantToDevice(List<Intent> installables, Device device) {
167 - for (Intent installable : installables) { 167 + if (installables != null) {
168 - if (installable instanceof PathIntent) { 168 + for (Intent installable : installables) {
169 - PathIntent pathIntent = (PathIntent) installable; 169 + if (installable instanceof PathIntent) {
170 - if (pathContainsDevice(pathIntent.path().links(), device.id())) { 170 + PathIntent pathIntent = (PathIntent) installable;
171 - return true; 171 + if (pathContainsDevice(pathIntent.path().links(), device.id())) {
172 - } 172 + return true;
173 - } else if (installable instanceof LinkCollectionIntent) { 173 + }
174 - LinkCollectionIntent linksIntent = (LinkCollectionIntent) installable; 174 + } else if (installable instanceof LinkCollectionIntent) {
175 - if (pathContainsDevice(linksIntent.links(), device.id())) { 175 + LinkCollectionIntent linksIntent = (LinkCollectionIntent) installable;
176 - return true; 176 + if (pathContainsDevice(linksIntent.links(), device.id())) {
177 + return true;
178 + }
177 } 179 }
178 } 180 }
179 } 181 }
......
...@@ -124,7 +124,6 @@ svg .node.host circle { ...@@ -124,7 +124,6 @@ svg .node.host circle {
124 124
125 #topo svg .link { 125 #topo svg .link {
126 opacity: .7; 126 opacity: .7;
127 - stroke-width: 1.2px;
128 } 127 }
129 128
130 #topo svg .link.inactive { 129 #topo svg .link.inactive {
...@@ -210,15 +209,17 @@ svg .node.host circle { ...@@ -210,15 +209,17 @@ svg .node.host circle {
210 text-align: center; 209 text-align: center;
211 210
212 /* theme specific... */ 211 /* theme specific... */
213 - border: 1px solid #ddf; 212 + border: 2px solid #ddd;
214 - color: #99f; 213 + border-radius: 4px;
214 + color: #eee;
215 + background: #888;
215 } 216 }
216 217
217 #topo-detail .actionBtn:hover { 218 #topo-detail .actionBtn:hover {
218 /* theme specific... */ 219 /* theme specific... */
219 - border: 1px solid #ddf; 220 + border: 2px solid #ddd;
220 - background: #eef; 221 + color: #eee;
221 - color: #77d; 222 + background: #444;
222 } 223 }
223 224
224 225
......
...@@ -741,21 +741,15 @@ ...@@ -741,21 +741,15 @@
741 741
742 function showTraffic(data) { 742 function showTraffic(data) {
743 evTrace(data); 743 evTrace(data);
744 - var paths = data.payload.paths; 744 + var paths = data.payload.paths,
745 + hasTraffic = false;
745 746
746 // Revert any links hilighted previously. 747 // Revert any links hilighted previously.
747 - link.attr('stroke-width', null) 748 + link.style('stroke-width', null)
748 - .style('stroke-width', null)
749 .classed('primary secondary animated optical', false); 749 .classed('primary secondary animated optical', false);
750 // Remove all previous labels. 750 // Remove all previous labels.
751 removeLinkLabels(); 751 removeLinkLabels();
752 752
753 - if (paths.length && !antTimer) {
754 - startAntTimer();
755 - } else if (!paths.length && antTimer) {
756 - stopAntTimer();
757 - }
758 -
759 // Now hilight all links in the paths payload, and attach 753 // Now hilight all links in the paths payload, and attach
760 // labels to them, if they are defined. 754 // labels to them, if they are defined.
761 paths.forEach(function (p) { 755 paths.forEach(function (p) {
...@@ -763,15 +757,23 @@ ...@@ -763,15 +757,23 @@
763 i, 757 i,
764 ldata; 758 ldata;
765 759
760 + hasTraffic = hasTraffic || p.traffic;
766 for (i=0; i<n; i++) { 761 for (i=0; i<n; i++) {
767 ldata = findLinkById(p.links[i]); 762 ldata = findLinkById(p.links[i]);
768 - if (ldata) { 763 + if (ldata && ldata.el) {
769 ldata.el.classed(p.class, true); 764 ldata.el.classed(p.class, true);
770 ldata.label = p.labels[i]; 765 ldata.label = p.labels[i];
771 } 766 }
772 } 767 }
773 }); 768 });
769 +
774 updateLinks(); 770 updateLinks();
771 +
772 + if (hasTraffic && !antTimer) {
773 + startAntTimer();
774 + } else if (!hasTraffic && antTimer) {
775 + stopAntTimer();
776 + }
775 } 777 }
776 778
777 // ............................... 779 // ...............................
...@@ -1736,14 +1738,17 @@ ...@@ -1736,14 +1738,17 @@
1736 1738
1737 linkLabel.each(function (d) { 1739 linkLabel.each(function (d) {
1738 var el = d3.select(this); 1740 var el = d3.select(this);
1739 - var lnk = findLinkById(d.key), 1741 + var lnk = findLinkById(d.key);
1740 - parms = { 1742 +
1743 + if (lnk) {
1744 + var parms = {
1741 x1: lnk.source.x, 1745 x1: lnk.source.x,
1742 y1: lnk.source.y, 1746 y1: lnk.source.y,
1743 x2: lnk.target.x, 1747 x2: lnk.target.x,
1744 y2: lnk.target.y 1748 y2: lnk.target.y
1745 }; 1749 };
1746 - el.attr('transform', transformLabel(parms)); 1750 + el.attr('transform', transformLabel(parms));
1751 + }
1747 }); 1752 });
1748 } 1753 }
1749 1754
...@@ -1973,7 +1978,7 @@ ...@@ -1973,7 +1978,7 @@
1973 table = detailPane.append("table"), 1978 table = detailPane.append("table"),
1974 tbody = table.append("tbody"); 1979 tbody = table.append("tbody");
1975 1980
1976 - title.text('Multi-Select...'); 1981 + title.text('Selected Nodes');
1977 1982
1978 selectOrder.forEach(function (d, i) { 1983 selectOrder.forEach(function (d, i) {
1979 addProp(tbody, i+1, d); 1984 addProp(tbody, i+1, d);
...@@ -2000,22 +2005,26 @@ ...@@ -2000,22 +2005,26 @@
2000 } 2005 }
2001 }); 2006 });
2002 2007
2003 - addSingleSelectActions(); 2008 + addSingleSelectActions(data);
2004 } 2009 }
2005 2010
2006 - function addSingleSelectActions() { 2011 + function addSingleSelectActions(data) {
2007 detailPane.append('hr'); 2012 detailPane.append('hr');
2008 // always want to allow 'show traffic' 2013 // always want to allow 'show traffic'
2009 - addAction(detailPane, 'Show Traffic', showTrafficAction); 2014 + addAction(detailPane, 'Show Related Traffic', showTrafficAction);
2015 +
2016 + if (data.type === 'switch') {
2017 + addAction(detailPane, 'Show Device Flows', showDeviceLinkFlowsAction);
2018 + }
2010 } 2019 }
2011 2020
2012 function addMultiSelectActions() { 2021 function addMultiSelectActions() {
2013 detailPane.append('hr'); 2022 detailPane.append('hr');
2014 // always want to allow 'show traffic' 2023 // always want to allow 'show traffic'
2015 - addAction(detailPane, 'Show Traffic', showTrafficAction); 2024 + addAction(detailPane, 'Show Related Traffic', showTrafficAction);
2016 // if exactly two hosts are selected, also want 'add host intent' 2025 // if exactly two hosts are selected, also want 'add host intent'
2017 if (nSel() === 2 && allSelectionsClass('host')) { 2026 if (nSel() === 2 && allSelectionsClass('host')) {
2018 - addAction(detailPane, 'Add Host Intent', addIntentAction); 2027 + addAction(detailPane, 'Add Host-to-Host Intent', addIntentAction);
2019 } 2028 }
2020 } 2029 }
2021 2030
...@@ -2306,13 +2315,15 @@ ...@@ -2306,13 +2315,15 @@
2306 } 2315 }
2307 2316
2308 function startAntTimer() { 2317 function startAntTimer() {
2309 - var pulses = [ 5, 3, 1.2, 3 ], 2318 + if (!antTimer) {
2310 - pulse = 0; 2319 + var pulses = [5, 3, 1.2, 3],
2311 - antTimer = setInterval(function () { 2320 + pulse = 0;
2312 - pulse = pulse + 1; 2321 + antTimer = setInterval(function () {
2313 - pulse = pulse === pulses.length ? 0 : pulse; 2322 + pulse = pulse + 1;
2314 - d3.selectAll('.animated').style('stroke-width', pulses[pulse]); 2323 + pulse = pulse === pulses.length ? 0 : pulse;
2315 - }, 200); 2324 + d3.selectAll('.animated').style('stroke-width', pulses[pulse]);
2325 + }, 200);
2326 + }
2316 } 2327 }
2317 2328
2318 function stopAntTimer() { 2329 function stopAntTimer() {
......