GUI -- [ONOS-347] - Suppress display of offline-devices (press the 'M' key).
- also minor cleanup of link "online" state, based on src/tgt nodes online state. Change-Id: I6d4c634e4d9f7f994f9871b7c95e3264d6ada2bb
Showing
4 changed files
with
105 additions
and
24 deletions
| 1 | +{ | ||
| 2 | + "event": "removeDevice", | ||
| 3 | + "payload": { | ||
| 4 | + "id": "of:0000ffffffff0003", | ||
| 5 | + "type": "switch", | ||
| 6 | + "online": false, | ||
| 7 | + "location": { | ||
| 8 | + "type": "latlng", | ||
| 9 | + "lat": 40.7127, | ||
| 10 | + "lng": -74.0059 | ||
| 11 | + }, | ||
| 12 | + "labels": [ | ||
| 13 | + "", | ||
| 14 | + "sw-3", | ||
| 15 | + "0000ffffffff0003" | ||
| 16 | + ], | ||
| 17 | + "metaUi": { | ||
| 18 | + "x": 800, | ||
| 19 | + "y": 280 | ||
| 20 | + } | ||
| 21 | + } | ||
| 22 | +} |
| ... | @@ -3,6 +3,7 @@ | ... | @@ -3,6 +3,7 @@ |
| 3 | "payload": { | 3 | "payload": { |
| 4 | "id": "of:0000ffffffff0003/21-of:0000ffffffff0008/20", | 4 | "id": "of:0000ffffffff0003/21-of:0000ffffffff0008/20", |
| 5 | "type": "direct", | 5 | "type": "direct", |
| 6 | + "online": true, | ||
| 6 | "linkWidth": 2, | 7 | "linkWidth": 2, |
| 7 | "src": "of:0000ffffffff0003", | 8 | "src": "of:0000ffffffff0003", |
| 8 | "srcPort": "21", | 9 | "srcPort": "21", | ... | ... |
| ... | @@ -24,6 +24,7 @@ | ... | @@ -24,6 +24,7 @@ |
| 24 | "10. update link (increase width, update props)", | 24 | "10. update link (increase width, update props)", |
| 25 | "11. update link (reduce width, update props)", | 25 | "11. update link (reduce width, update props)", |
| 26 | "12. remove link", | 26 | "12. remove link", |
| 27 | - "13. remove host (10.0.0.17)" | 27 | + "13. remove host (10.0.0.17)", |
| 28 | + "13. remove device [3]" | ||
| 28 | ] | 29 | ] |
| 29 | } | 30 | } | ... | ... |
| ... | @@ -145,6 +145,7 @@ | ... | @@ -145,6 +145,7 @@ |
| 145 | D: [toggleDetails, 'Disable / enable details pane'], | 145 | D: [toggleDetails, 'Disable / enable details pane'], |
| 146 | B: [toggleBg, 'Toggle background image'], | 146 | B: [toggleBg, 'Toggle background image'], |
| 147 | H: [toggleHosts, 'Toggle host visibility'], | 147 | H: [toggleHosts, 'Toggle host visibility'], |
| 148 | + M: [toggleOffline, 'Toggle offline visibility'], | ||
| 148 | L: [cycleLabels, 'Cycle device labels'], | 149 | L: [cycleLabels, 'Cycle device labels'], |
| 149 | P: togglePorts, | 150 | P: togglePorts, |
| 150 | U: [unpin, 'Unpin node (hover mouse over)'], | 151 | U: [unpin, 'Unpin node (hover mouse over)'], |
| ... | @@ -203,6 +204,7 @@ | ... | @@ -203,6 +204,7 @@ |
| 203 | cat7 = d3u.cat7(), | 204 | cat7 = d3u.cat7(), |
| 204 | colorAffinity = false, | 205 | colorAffinity = false, |
| 205 | showHosts = false, | 206 | showHosts = false, |
| 207 | + showOffline = true, | ||
| 206 | useDetails = true, | 208 | useDetails = true, |
| 207 | haveDetails = false; | 209 | haveDetails = false; |
| 208 | 210 | ||
| ... | @@ -330,6 +332,12 @@ | ... | @@ -330,6 +332,12 @@ |
| 330 | flash('Hosts ' + visVal(showHosts)); | 332 | flash('Hosts ' + visVal(showHosts)); |
| 331 | } | 333 | } |
| 332 | 334 | ||
| 335 | + function toggleOffline() { | ||
| 336 | + showOffline = !showOffline; | ||
| 337 | + updateOfflineVisibility(); | ||
| 338 | + flash('Offline devices ' + visVal(showOffline)); | ||
| 339 | + } | ||
| 340 | + | ||
| 333 | function cycleLabels() { | 341 | function cycleLabels() { |
| 334 | deviceLabelIndex = (deviceLabelIndex === 2) | 342 | deviceLabelIndex = (deviceLabelIndex === 2) |
| 335 | ? 0 : deviceLabelIndex + 1; | 343 | ? 0 : deviceLabelIndex + 1; |
| ... | @@ -711,13 +719,20 @@ | ... | @@ -711,13 +719,20 @@ |
| 711 | evTrace(data); | 719 | evTrace(data); |
| 712 | var device = data.payload, | 720 | var device = data.payload, |
| 713 | id = device.id, | 721 | id = device.id, |
| 714 | - d = network.lookup[id]; | 722 | + d = network.lookup[id], |
| 723 | + wasOnline; | ||
| 724 | + | ||
| 715 | if (d) { | 725 | if (d) { |
| 726 | + wasOnline = d.online; | ||
| 716 | $.extend(d, device); | 727 | $.extend(d, device); |
| 717 | if (positionNode(d, true)) { | 728 | if (positionNode(d, true)) { |
| 718 | sendUpdateMeta(d, true); | 729 | sendUpdateMeta(d, true); |
| 719 | } | 730 | } |
| 720 | updateNodes(); | 731 | updateNodes(); |
| 732 | + if (wasOnline !== d.online) { | ||
| 733 | + findAttachedLinks(d.id).forEach(restyleLinkElement); | ||
| 734 | + updateOfflineVisibility(d); | ||
| 735 | + } | ||
| 721 | } else { | 736 | } else { |
| 722 | logicError('updateDevice lookup fail. ID = "' + id + '"'); | 737 | logicError('updateDevice lookup fail. ID = "' + id + '"'); |
| 723 | } | 738 | } |
| ... | @@ -742,7 +757,10 @@ | ... | @@ -742,7 +757,10 @@ |
| 742 | d = network.lookup[id]; | 757 | d = network.lookup[id]; |
| 743 | if (d) { | 758 | if (d) { |
| 744 | $.extend(d, host); | 759 | $.extend(d, host); |
| 745 | - updateHostState(d); | 760 | + if (positionNode(d, true)) { |
| 761 | + sendUpdateMeta(d, true); | ||
| 762 | + } | ||
| 763 | + updateNodes(d); | ||
| 746 | } else { | 764 | } else { |
| 747 | logicError('updateHost lookup fail. ID = "' + id + '"'); | 765 | logicError('updateHost lookup fail. ID = "' + id + '"'); |
| 748 | } | 766 | } |
| ... | @@ -1339,8 +1357,10 @@ | ... | @@ -1339,8 +1357,10 @@ |
| 1339 | class: 'link', | 1357 | class: 'link', |
| 1340 | 1358 | ||
| 1341 | type: function () { return 'hostLink'; }, | 1359 | type: function () { return 'hostLink'; }, |
| 1342 | - // TODO: ideally, we should see if our edge switch is online... | 1360 | + online: function () { |
| 1343 | - online: function () { return true; }, | 1361 | + // hostlink target is edge switch |
| 1362 | + return lnk.target.online; | ||
| 1363 | + }, | ||
| 1344 | linkWidth: function () { return 1; } | 1364 | linkWidth: function () { return 1; } |
| 1345 | }); | 1365 | }); |
| 1346 | return lnk; | 1366 | return lnk; |
| ... | @@ -1366,8 +1386,9 @@ | ... | @@ -1366,8 +1386,9 @@ |
| 1366 | }, | 1386 | }, |
| 1367 | online: function () { | 1387 | online: function () { |
| 1368 | var s = lnk.fromSource, | 1388 | var s = lnk.fromSource, |
| 1369 | - t = lnk.fromTarget; | 1389 | + t = lnk.fromTarget, |
| 1370 | - return (s && s.online) || (t && t.online); | 1390 | + both = lnk.source.online && lnk.target.online; |
| 1391 | + return both && ((s && s.online) || (t && t.online)); | ||
| 1371 | }, | 1392 | }, |
| 1372 | linkWidth: function () { | 1393 | linkWidth: function () { |
| 1373 | var s = lnk.fromSource, | 1394 | var s = lnk.fromSource, |
| ... | @@ -1435,12 +1456,12 @@ | ... | @@ -1435,12 +1456,12 @@ |
| 1435 | 1456 | ||
| 1436 | // operate on exiting links: | 1457 | // operate on exiting links: |
| 1437 | link.exit() | 1458 | link.exit() |
| 1438 | - .attr('stroke-dasharray', '3, 3') | 1459 | + .attr('stroke-dasharray', '3 3') |
| 1439 | .style('opacity', 0.5) | 1460 | .style('opacity', 0.5) |
| 1440 | .transition() | 1461 | .transition() |
| 1441 | .duration(1500) | 1462 | .duration(1500) |
| 1442 | .attr({ | 1463 | .attr({ |
| 1443 | - 'stroke-dasharray': '3, 12', | 1464 | + 'stroke-dasharray': '3 12', |
| 1444 | stroke: config.topo.linkOutColor, | 1465 | stroke: config.topo.linkOutColor, |
| 1445 | 'stroke-width': config.topo.linkOutWidth | 1466 | 'stroke-width': config.topo.linkOutWidth |
| 1446 | }) | 1467 | }) |
| ... | @@ -1575,8 +1596,6 @@ | ... | @@ -1575,8 +1596,6 @@ |
| 1575 | node.fixed = true; | 1596 | node.fixed = true; |
| 1576 | node.px = node.x = x; | 1597 | node.px = node.x = x; |
| 1577 | node.py = node.y = y; | 1598 | node.py = node.y = y; |
| 1578 | - //node.px = x; | ||
| 1579 | - //node.py = y; | ||
| 1580 | return; | 1599 | return; |
| 1581 | } | 1600 | } |
| 1582 | 1601 | ||
| ... | @@ -1586,8 +1605,6 @@ | ... | @@ -1586,8 +1605,6 @@ |
| 1586 | node.fixed = true; | 1605 | node.fixed = true; |
| 1587 | node.px = node.x = coord[0]; | 1606 | node.px = node.x = coord[0]; |
| 1588 | node.py = node.y = coord[1]; | 1607 | node.py = node.y = coord[1]; |
| 1589 | - //node.x = coord[0]; | ||
| 1590 | - //node.y = coord[1]; | ||
| 1591 | return true; | 1608 | return true; |
| 1592 | } | 1609 | } |
| 1593 | 1610 | ||
| ... | @@ -1726,15 +1743,8 @@ | ... | @@ -1726,15 +1743,8 @@ |
| 1726 | } | 1743 | } |
| 1727 | 1744 | ||
| 1728 | function updateHostLabel(d) { | 1745 | function updateHostLabel(d) { |
| 1729 | - var label = hostLabel(d), | 1746 | + var label = trimLabel(hostLabel(d)); |
| 1730 | - host = d.el; | 1747 | + d.el.select('text').text(label); |
| 1731 | - | ||
| 1732 | - host.select('text').text(label); | ||
| 1733 | - } | ||
| 1734 | - | ||
| 1735 | - // FIXME : fold this into updateNodes. | ||
| 1736 | - function updateHostState(hostData) { | ||
| 1737 | - updateHostLabel(hostData); | ||
| 1738 | } | 1748 | } |
| 1739 | 1749 | ||
| 1740 | function updateHostVisibility() { | 1750 | function updateHostVisibility() { |
| ... | @@ -1743,6 +1753,53 @@ | ... | @@ -1743,6 +1753,53 @@ |
| 1743 | linkG.selectAll('.hostLink').style('visibility', v); | 1753 | linkG.selectAll('.hostLink').style('visibility', v); |
| 1744 | } | 1754 | } |
| 1745 | 1755 | ||
| 1756 | + function findOfflineNodes() { | ||
| 1757 | + var a = []; | ||
| 1758 | + network.nodes.forEach(function (d) { | ||
| 1759 | + if (d.class === 'device' && !d.online) { | ||
| 1760 | + a.push(d); | ||
| 1761 | + } | ||
| 1762 | + }); | ||
| 1763 | + return a; | ||
| 1764 | + } | ||
| 1765 | + | ||
| 1766 | + function updateOfflineVisibility(dev) { | ||
| 1767 | + var so = showOffline, | ||
| 1768 | + sh = showHosts, | ||
| 1769 | + vb = 'visibility', | ||
| 1770 | + v, off, al, ah, db, b; | ||
| 1771 | + | ||
| 1772 | + function updAtt(show) { | ||
| 1773 | + al.forEach(function (d) { | ||
| 1774 | + b = show && ((d.type() !== 'hostLink') || sh); | ||
| 1775 | + d.el.style(vb, visVal(b)); | ||
| 1776 | + }); | ||
| 1777 | + ah.forEach(function (d) { | ||
| 1778 | + b = show && sh; | ||
| 1779 | + d.el.style(vb, visVal(b)); | ||
| 1780 | + }); | ||
| 1781 | + } | ||
| 1782 | + | ||
| 1783 | + if (dev) { | ||
| 1784 | + // updating a specific device that just toggled off/on-line | ||
| 1785 | + db = dev.online || so; | ||
| 1786 | + dev.el.style(vb, visVal(db)); | ||
| 1787 | + al = findAttachedLinks(dev.id); | ||
| 1788 | + ah = findAttachedHosts(dev.id); | ||
| 1789 | + updAtt(db); | ||
| 1790 | + } else { | ||
| 1791 | + // updating all offline devices | ||
| 1792 | + v = visVal(so); | ||
| 1793 | + off = findOfflineNodes(); | ||
| 1794 | + off.forEach(function (d) { | ||
| 1795 | + d.el.style(vb, v); | ||
| 1796 | + al = findAttachedLinks(d.id); | ||
| 1797 | + ah = findAttachedHosts(d.id); | ||
| 1798 | + updAtt(so); | ||
| 1799 | + }); | ||
| 1800 | + } | ||
| 1801 | + } | ||
| 1802 | + | ||
| 1746 | function nodeMouseOver(d) { | 1803 | function nodeMouseOver(d) { |
| 1747 | hovered = d; | 1804 | hovered = d; |
| 1748 | requestTrafficForMode(); | 1805 | requestTrafficForMode(); |
| ... | @@ -1779,8 +1836,8 @@ | ... | @@ -1779,8 +1836,8 @@ |
| 1779 | }); | 1836 | }); |
| 1780 | 1837 | ||
| 1781 | node.filter('.host').each(function (d) { | 1838 | node.filter('.host').each(function (d) { |
| 1782 | - var node = d.el; | 1839 | + updateHostLabel(d); |
| 1783 | - // TODO: appropriate update of host visuals | 1840 | + positionNode(d, true); |
| 1784 | }); | 1841 | }); |
| 1785 | 1842 | ||
| 1786 | // operate on entering nodes: | 1843 | // operate on entering nodes: | ... | ... |
-
Please register or login to post a comment