Repository: qpid-dispatch Updated Branches: refs/heads/master 48845b998 -> 368e18108
DISPATCH-1184 Fix traffic animations for similar router names on console's topology page Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/368e1810 Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/368e1810 Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/368e1810 Branch: refs/heads/master Commit: 368e181087109f8f838aa3557282e0cff1aa2864 Parents: 48845b9 Author: Ernest Allen <[email protected]> Authored: Tue Nov 13 11:03:53 2018 -0500 Committer: Ernest Allen <[email protected]> Committed: Tue Nov 13 11:03:53 2018 -0500 ---------------------------------------------------------------------- .../stand-alone/plugin/html/qdrTopology.html | 4 ++ console/stand-alone/plugin/js/amqp/topology.js | 45 ++++++++++++++++---- console/stand-alone/plugin/js/topology/links.js | 1 + console/stand-alone/plugin/js/topology/nodes.js | 5 +-- .../plugin/js/topology/qdrTopology.js | 35 +++++++-------- .../stand-alone/plugin/js/topology/traffic.js | 7 +-- 6 files changed, 66 insertions(+), 31 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/368e1810/console/stand-alone/plugin/html/qdrTopology.html ---------------------------------------------------------------------- diff --git a/console/stand-alone/plugin/html/qdrTopology.html b/console/stand-alone/plugin/html/qdrTopology.html index 42f06c0..0ad9dc8 100644 --- a/console/stand-alone/plugin/html/qdrTopology.html +++ b/console/stand-alone/plugin/html/qdrTopology.html @@ -243,6 +243,10 @@ div.titleBar button { top: -4px; } +td.more-info { + font-size: 0.5em; + color: blue; +} </style> http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/368e1810/console/stand-alone/plugin/js/amqp/topology.js ---------------------------------------------------------------------- diff --git a/console/stand-alone/plugin/js/amqp/topology.js b/console/stand-alone/plugin/js/amqp/topology.js index 3fd1764..8c88e50 100644 --- a/console/stand-alone/plugin/js/amqp/topology.js +++ b/console/stand-alone/plugin/js/amqp/topology.js @@ -71,20 +71,46 @@ class Topology { nodeInfo() { return this._nodeInfo; } + saveResults(workInfo) { + let workSet = new Set(Object.keys(workInfo)); + for (let rId in this._nodeInfo) { + if (!workSet.has(rId)) { + // mark any routers that went away since the last request as removed + this._nodeInfo[rId]['removed'] = true; + } else { + if (this._nodeInfo[rId]['removed']) + delete this._nodeInfo[rId]['removed']; + // copy entities + for (let entity in workInfo[rId]) { + if (!this._nodeInfo[rId][entity] || + (workInfo[rId][entity]['timestamp']+'' > this._nodeInfo[rId][entity]['timestamp']+'')) { + this._nodeInfo[rId][entity] = utils.copy(workInfo[rId][entity]); + } + } + } + } + // add any new routers + let nodeSet = new Set(Object.keys(this._nodeInfo)); + for (let rId in workInfo) { + if (!nodeSet.has(rId)) { + this._nodeInfo[rId] = utils.copy(workInfo[rId]); + } + } + } get() { return new Promise((function (resolve, reject) { this.connection.sendMgmtQuery('GET-MGMT-NODES') .then((function (results) { - let response = results.response; - if (Object.prototype.toString.call(response) === '[object Array]') { + let routerIds = results.response; + if (Object.prototype.toString.call(routerIds) === '[object Array]') { // if there is only one node, it will not be returned - if (response.length === 0) { + if (routerIds.length === 0) { var parts = this.connection.getReceiverAddress().split('/'); parts[parts.length - 1] = '$management'; - response.push(parts.join('/')); + routerIds.push(parts.join('/')); } let finish = function (workInfo) { - this._nodeInfo = utils.copy(workInfo); + this.saveResults(workInfo); this.onDone(this._nodeInfo); resolve(this._nodeInfo); }; @@ -109,10 +135,10 @@ class Topology { } return routerId; }; - this.doget(response) + this.doget(routerIds) .then( function (workInfo) { // test for edge case - let routerId = connectedToEdge(response, workInfo); + let routerId = connectedToEdge(routerIds, workInfo); if (routerId) { this.connection.sendMgmtQuery('GET-MGMT-NODES', routerId) .then((function (results) { @@ -149,6 +175,7 @@ class Topology { } var gotResponse = function (nodeName, entity, response) { workInfo[nodeName][entity] = response; + workInfo[nodeName][entity]['timestamp'] = new Date(); }; var q = d3.queue(this.connection.availableQeueuDepth()); for (var id in workInfo) { @@ -273,8 +300,9 @@ class Topology { this.addUpdateEntities(entityAttribs); this.doget(nodes) .then( function (results) { + this.saveResults(results); callback(extra, results); - }); + }.bind(this)); } addNodeInfo(id, entity, values) { // save the results in the nodeInfo object @@ -284,6 +312,7 @@ class Topology { } // copy the values to allow garbage collection this._nodeInfo[id][entity] = values; + this._nodeInfo[id][entity]['timestamp'] = new Date(); } } isLargeNetwork() { http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/368e1810/console/stand-alone/plugin/js/topology/links.js ---------------------------------------------------------------------- diff --git a/console/stand-alone/plugin/js/topology/links.js b/console/stand-alone/plugin/js/topology/links.js index 0ca9967..6caae44 100644 --- a/console/stand-alone/plugin/js/topology/links.js +++ b/console/stand-alone/plugin/js/topology/links.js @@ -164,6 +164,7 @@ export class Links { node.host = connection.host; node.connectionId = connection.identity; node.cdir = cdir; + node.uuid = `${node.routerId}${node.nodeType}${node.cdir}`; // determine arrow direction by using the link directions if (!normalsParent[nodeType+cdir]) { normalsParent[nodeType+cdir] = node; http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/368e1810/console/stand-alone/plugin/js/topology/nodes.js ---------------------------------------------------------------------- diff --git a/console/stand-alone/plugin/js/topology/nodes.js b/console/stand-alone/plugin/js/topology/nodes.js index 2b51898..25ecb6c 100644 --- a/console/stand-alone/plugin/js/topology/nodes.js +++ b/console/stand-alone/plugin/js/topology/nodes.js @@ -85,7 +85,7 @@ export class Node { else { title += `<tr><td>Count</td><td>${this.normals.length}</td></tr>`; } - title += '</table>'; + title += '<tr><td colspan=2 class="more-info">Click circle for more info</td></tr></table>'; return title; } @@ -134,8 +134,7 @@ export class Node { return nodeProperties[this.nodeType].radius; } uid(srv) { - return srv.utilities.nameFromId(this.key).replace(/ /g,'').replace(/\./g,'') + - (this.connectionId ? this.connectionId : ''); + return this.uuid ? this.uuid : srv.utilities.nameFromId(this.key); } } const nodeProperties = { http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/368e1810/console/stand-alone/plugin/js/topology/qdrTopology.js ---------------------------------------------------------------------- diff --git a/console/stand-alone/plugin/js/topology/qdrTopology.js b/console/stand-alone/plugin/js/topology/qdrTopology.js index 5425bad..2499ca4 100644 --- a/console/stand-alone/plugin/js/topology/qdrTopology.js +++ b/console/stand-alone/plugin/js/topology/qdrTopology.js @@ -393,14 +393,17 @@ export class TopologyController { unknownNodes[unknowns[i].key] = 1; } unknownNodes = Object.keys(unknownNodes); - QDRService.management.topology.ensureEntities(unknownNodes, [ - {entity: 'router.link', attrs: ['linkType','connectionId','linkDir','owningAddr'], force: true}], function (foo, results) { - forceData.links = links = new Links(QDRService, QDRLog); - links.initializeLinks(results, nodes, [], localStorage, height); - animate = true; - force.nodes(nodes.nodes).links(links.links).start(); - restart(false); - }); + QDRService.management.topology.ensureEntities(unknownNodes, + [{entity: 'router.link', + attrs: ['linkType','connectionId','linkDir','owningAddr'], + force: true}], + function (foo, results) { + forceData.links = links = new Links(QDRService, QDRLog); + links.initializeLinks(results, nodes, [], localStorage, height); + animate = true; + force.nodes(nodes.nodes).links(links.links).start(); + restart(false); + }); }; function resetMouseVars() { @@ -654,6 +657,10 @@ export class TopologyController { clearAllHighlights(); $scope.mousedown_node = null; if (!$scope.$$phase) $scope.$apply(); + // handle clicking on nodes that represent multiple sub-nodes + if (d.normals) { + //doDialog(d); + } restart(false); }) @@ -692,9 +699,6 @@ export class TopologyController { window.location = $location.protocol() + '://localhost:8161/hawtio' + artemisPath; } return; - } else { - // handle clicking on nodes that represent multiple sub-nodes - //doDialog(d); } d3.event.stopPropagation(); }); @@ -973,8 +977,6 @@ export class TopologyController { if (routers.length > cnodes.length) { return -1; } - - if (cnodes.length != Object.keys(savedKeys).length) { return cnodes.length > Object.keys(savedKeys).length ? 1 : -1; } @@ -1037,8 +1039,8 @@ export class TopologyController { // after the graph is displayed fetch all .router.node info. This is done so highlighting between nodes // doesn't incur a delay QDRService.management.topology.addUpdateEntities([ - {entity: 'router.node', attrs: ['id','nextHop']}, - {entity: 'router.link', attrs: ['linkType', 'connectionId', 'owningAddr', 'linkDir']}]); + {entity: 'router.node', attrs: ['id','nextHop']} + ]); // call this function every time a background update is done QDRService.management.topology.addUpdatedAction('topology', function() { let changed = hasChanged(); @@ -1077,8 +1079,7 @@ export class TopologyController { function setupInitialUpdate() { // make sure all router nodes have .connection info. if not then fetch any missing info QDRService.management.topology.ensureAllEntities( - [{entity: 'connection'}, - {entity: 'router.link', attrs: ['linkType', 'connectionId', 'owningAddr', 'linkDir']}], + [{entity: 'connection'}], handleInitialUpdate); } if (!QDRService.management.connection.is_connected()) { http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/368e1810/console/stand-alone/plugin/js/topology/traffic.js ---------------------------------------------------------------------- diff --git a/console/stand-alone/plugin/js/topology/traffic.js b/console/stand-alone/plugin/js/topology/traffic.js index a7f5c62..610e01f 100644 --- a/console/stand-alone/plugin/js/topology/traffic.js +++ b/console/stand-alone/plugin/js/topology/traffic.js @@ -325,7 +325,7 @@ class Dots extends TrafficAnimation { let matrixMessages = matrix.matrixMessages(); // the fastest traffic rate gets 3 times as many dots as the slowest let minmax = matrix.getMinMax(); - let flowScale = d3.scale.linear().domain(minmax).range([1, 1.75]); + let flowScale = d3.scale.linear().domain(minmax).range([1, 1.1]); // row is ingress router, col is egress router. Value at [row][col] is the rate matrixMessages.forEach(function (row, r) { row.forEach(function (val, c) { @@ -363,8 +363,9 @@ class Dots extends TrafficAnimation { let hop = hops[id]; for (let h = 0; h < hop.length; h++) { let ahop = hop[h]; - let flowId = id + '-' + this.addressIndex(this, ahop.address) + (ahop.back ? 'b' : ''); - let path = d3.select('#path' + id); + let pathId = id.replace(/\./g, '\\.').replace(/ /g, '\\ '); + let flowId = id.replace(/\./g, '').replace(/ /g, '') + '-' + this.addressIndex(this, ahop.address) + (ahop.back ? 'b' : ''); + let path = d3.select('#path' + pathId); // start the animation. If the animation is already running, this will have no effect this.startAnimation(path, flowId, ahop, flowScale(ahop.val)); keep[flowId] = true; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
