You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ea...@apache.org on 2016/10/19 12:49:03 UTC
[04/10] qpid-dispatch git commit: DISPATCH-531 Initial version of
openstack horizon plugin
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0c58c381/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/overv/overview.controller.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/overv/overview.controller.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/overv/overview.controller.js
new file mode 100644
index 0000000..8ed64a1
--- /dev/null
+++ b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/overv/overview.controller.js
@@ -0,0 +1,1428 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+/**
+ * @module QDR
+ */
+/**
+ * @module QDR
+ */
+var QDR = (function (QDR) {
+ 'use strict';
+
+ /**
+ * @method OverviewController
+ * @param $scope
+ * @param QDRService
+ * @param QDRChartServer
+ * dialogServer
+ * $location
+ *
+ * Controller that handles the QDR overview page
+ */
+ angular
+ .module('horizon.dashboard.dispatch.overv')
+ .controller('horizon.dashboard.dispatch.overv.OverviewController', OverviewController);
+
+ OverviewController.$inject = [
+ '$scope',
+ 'horizon.dashboard.dispatch.comService',
+ 'horizon.dashboard.dispatch.chartService',
+ '$location',
+ '$timeout',
+ 'horizon.dashboard.dispatch.overv.basePath',
+ 'uiGridConstants',
+ ];
+
+ var FILTERKEY = "QDROverviewFilters"
+ function OverviewController(
+ $scope,
+ QDRService,
+ QDRChartService,
+ $location,
+ $timeout,
+ basePath,
+ uiGridConstants) {
+
+ var ctrl = this;
+
+ QDR.log.debug("QDR.OverviewController started");
+
+ QDRService.addConnectAction( function () {
+ Overview(
+ $scope,
+ QDRService,
+ QDRChartService,
+ $location,
+ $timeout,
+ basePath,
+ uiGridConstants);
+ })
+ QDRService.loadConnectOptions(QDRService.connect);
+
+ $scope.filter = angular.fromJson(localStorage[FILTERKEY]) || {endpointsOnly: true, hideConsoles: true};
+ var showConsoleLinksTitle = function () {
+ return ($scope.filter.hideConsoles ? "Show" : "Hide") + " Console Links"
+ }
+ var showHideConsoleMenuItem = {
+ title: showConsoleLinksTitle(),
+ action: function($event) {
+ $scope.filter.hideConsoles = !$scope.filter.hideConsoles
+ // assumes this is always the 1st custom menu item added
+ this.context.col.colDef.menuItems[0].title = showConsoleLinksTitle()
+ $timeout($scope.allLinkInfo)
+ },
+ }
+ var endpointLinksTitle = function () {
+ return "Show" + ($scope.filter.endpointsOnly ? " all link types" : " endpoints only")
+ }
+
+ $scope.allRouterFields = [];
+ $scope.allRouters = {
+ saveKey: 'allRouters',
+ data: 'allRouterFields',
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ columnDefs: [
+ {
+ field: 'routerId',
+ saveKey: 'allRouters',
+ displayName: 'Router'
+ },
+ {
+ field: 'area',
+ displayName: 'Area'
+ },
+ {
+ field: 'mode',
+ displayName: 'Mode'
+ },
+ {
+ field: 'connections',
+ displayName: 'External connections'
+ },
+ {
+ field: 'addrCount',
+ displayName: 'Address count'
+ },
+ {
+ field: 'linkCount',
+ displayName: 'Link count'
+ }
+ ],
+ enableRowSelection: true,
+ enableRowHeaderSelection: false,
+ multiSelect: false,
+ enableColumnResize: true,
+ enableColumnReordering: true,
+ onRegisterApi: function(gridApi){
+ gridApi.selection.on.rowSelectionChanged($scope,function(row){
+ $scope.setActivated('router' , row.entity.nodeId, 'nodeId')
+ });
+ }
+ };
+ $scope.routerFields = []
+ $scope.routerGrid = {
+ saveKey: 'routerGrid',
+ data: 'routerFields',
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ columnDefs: [
+ {
+ field: 'attribute',
+ displayName: 'Attribute',
+ saveKey: 'routerGrid',
+ },
+ {
+ field: 'value',
+ displayName: 'Value',
+ }
+ ],
+ enableColumnResize: true,
+ multiSelect: false
+ }
+ $scope.addressesData = []
+ $scope.addressesGrid = {
+ saveKey: 'addressesGrid',
+ data: 'addressesData',
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ columnDefs: [
+ {
+ field: 'address',
+ saveKey: 'addressesGrid',
+ displayName: 'address'
+ },
+ {
+ field: 'class',
+ displayName: 'class'
+ },
+ {
+ field: 'phase',
+ displayName: 'phase',
+ width: 80,
+ cellClass: 'grid-align-value'
+ },
+ {
+ field: 'inproc',
+ width: 80,
+ displayName: 'in-proc'
+ },
+ {
+ field: 'local',
+ displayName: 'local',
+ width: 80,
+ cellClass: 'grid-align-value'
+ },
+ {
+ field: 'remote',
+ displayName: 'remote',
+ width: 80,
+ cellClass: 'grid-align-value'
+ },
+ {
+ field: 'in',
+ displayName: 'in',
+ cellClass: 'grid-align-value'
+ },
+ {
+ field: 'out',
+ displayName: 'out',
+ cellClass: 'grid-align-value'
+ }
+ ],
+
+ enableRowSelection: true,
+ enableRowHeaderSelection: false,
+ multiSelect: false,
+ enableColumnResize: true,
+ enableColumnReordering: true,
+ onRegisterApi: function(gridApi){
+ gridApi.selection.on.rowSelectionChanged($scope,function(row){
+ $scope.setActivated('address', row.entity.uid, 'uid')
+ });
+ }
+ };
+ // get info for a all links
+ $scope.linkFields = []
+ $scope.linksGrid = {
+ saveKey: 'linksGrid',
+ data: 'linkFields',
+ enableFiltering: true,
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ columnDefs: [
+ {
+ saveKey: 'linksGrid',
+ field: 'link',
+ displayName: 'Link',
+ filter: {placeholder: 'filter link name...'},
+ menuItems: [showHideConsoleMenuItem],
+ },
+ {
+ field: 'linkType',
+ displayName: 'Link type',
+ filter: {
+ term: $scope.filter.endpointsOnly ? 'endpoint' : '',
+ placeholder: 'filter link type...',
+ },
+ menuItems: [showHideConsoleMenuItem,
+ {
+ title: endpointLinksTitle(),
+ action: function($event) {
+ $scope.filter.endpointsOnly = !$scope.filter.endpointsOnly
+ // assumes this is the 2nd custom menu item added
+ this.context.col.colDef.menuItems[1].title = endpointLinksTitle()
+ this.context.col.filters[0].term = $scope.filter.endpointsOnly ? 'endpoint' : ''
+ $timeout($scope.allLinkInfo)
+ },
+ }],
+ },
+ {
+ field: 'linkDir',
+ displayName: 'Link dir',
+ filter: {placeholder: 'filter link dir...'},
+ menuItems: [showHideConsoleMenuItem],
+ },
+ {
+ field: 'adminStatus',
+ displayName: 'Admin status',
+ filter: {placeholder: 'filter admin status...'},
+ menuItems: [showHideConsoleMenuItem],
+ },
+ {
+ field: 'operStatus',
+ displayName: 'Oper status',
+ filter: {placeholder: 'filter oper status...'},
+ menuItems: [showHideConsoleMenuItem],
+ },
+ {
+ field: 'deliveryCount',
+ displayName: 'Delivery Count',
+ enableFiltering: false,
+ menuItems: [showHideConsoleMenuItem],
+ },
+ {
+ field: 'rate',
+ displayName: 'Rate',
+ enableFiltering: false,
+ menuItems: [showHideConsoleMenuItem],
+ },
+ {
+ field: 'uncounts',
+ displayName: 'Outstanding',
+ enableFiltering: false,
+ menuItems: [showHideConsoleMenuItem],
+ },
+ {
+ field: 'owningAddr',
+ displayName: 'Address',
+ filter: {placeholder: 'filter address...'},
+ menuItems: [showHideConsoleMenuItem],
+ }/*,
+ {
+ displayName: 'Quiesce',
+ cellClass: 'gridCellButton',
+ cellTemplate: '<button title="{$quiesceLinkText(row)$} this link" type="button" ng-class="quiesceLinkClass(row)" class="btn" ng-click="quiesceLink(row, $event)" ng-disabled="quiesceLinkDisabled(row)">{$quiesceLinkText(row)$}</button>',
+ width: '10%'
+ }*/
+ ],
+ enableRowSelection: true,
+ enableRowHeaderSelection: false,
+ multiSelect: false,
+ enableColumnReordering: true,
+ showColumnMenu: true,
+ rowTemplate: 'dispatch/tplLinkRow.html',
+ onRegisterApi: function(gridApi){
+ gridApi.selection.on.rowSelectionChanged($scope,function(row){
+ $scope.setActivated('link', row.entity.uid, 'uid')
+ });
+ gridApi.core.on.filterChanged( $scope, function() {
+ var column = this.grid.columns[1];
+ $scope.filter.endpointsOnly = (column.filters[0].term === 'endpoint' )
+ column.colDef.menuItems[1].title = endpointLinksTitle()
+ });
+ }
+ };
+ $scope.allConnectionFields = []
+ $scope.allConnectionGrid = {
+ saveKey: 'allConnGrid',
+ data: 'allConnectionFields',
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ columnDefs: [
+ {
+ field: 'host',
+ saveKey: 'allConnGrid',
+ displayName: 'host'
+ },
+ {
+ field: 'container',
+ displayName: 'container'
+ },
+ {
+ field: 'role',
+ displayName: 'role'
+ },
+ {
+ field: 'dir',
+ displayName: 'dir'
+ },
+ {
+ field: 'security',
+ displayName: 'security'
+ },
+ {
+ field: 'authentication',
+ displayName: 'authentication'
+ }
+ ],
+ enableRowSelection: true,
+ enableRowHeaderSelection: false,
+ multiSelect: false,
+ enableColumnResize: true,
+ enableColumnReordering: true,
+ onRegisterApi: function(gridApi){
+ gridApi.selection.on.rowSelectionChanged($scope,function(row){
+ $scope.setActivated('connection', row.entity.uid, 'uid')
+ });
+ }
+ };
+ $scope.addressFields = []
+ $scope.addressGrid = {
+ saveKey: 'addGrid',
+ data: 'addressFields',
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ columnDefs: [
+ {
+ field: 'attribute',
+ displayName: 'Attribute',
+ saveKey: 'addGrid',
+ },
+ {
+ field: 'value',
+ displayName: 'Value',
+ }
+ ],
+ enableColumnResize: true,
+ multiSelect: false
+ }
+ $scope.singleLinkFields = []
+ $scope.linkGrid = {
+ saveKey: 'linkGrid',
+ data: 'singleLinkFields',
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ columnDefs: [
+ {
+ field: 'attribute',
+ displayName: 'Attribute',
+ },
+ {
+ field: 'value',
+ displayName: 'Value',
+ }
+ ],
+ enableColumnResize: true,
+ multiSelect: false
+ }
+ $scope.connectionFields = []
+ $scope.connectionGrid = {
+ saveKey: 'connGrid',
+ data: 'connectionFields',
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ columnDefs: [
+ {
+ field: 'attribute',
+ displayName: 'Attribute',
+ saveKey: 'connGrid',
+ },
+ {
+ field: 'value',
+ displayName: 'Value',
+ }
+ ],
+ enableColumnResize: true,
+ multiSelect: false
+ }
+ $scope.allLogFields = []
+ $scope.allLogGrid = {
+ saveKey: 'allLogGrid',
+ data: 'allLogFields',
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ columnDefs: [
+ {
+ field: 'module',
+ saveKey: 'allLogGrid',
+ displayName: 'Module'
+ },
+ {
+ field: 'enable',
+ displayName: 'Enable'
+ },
+ {
+ field: 'count',
+ displayName: 'Count'
+ }
+ ],
+ enableRowSelection: true,
+ enableRowHeaderSelection: false,
+ multiSelect: false,
+ enableColumnResize: true,
+ enableColumnReordering: true,
+ onRegisterApi: function(gridApi){
+ gridApi.selection.on.rowSelectionChanged($scope,function(row){
+ $scope.setActivated('log', row.entity.module, 'module')
+ });
+ }
+ };
+ }
+
+ function Overview (
+ $scope,
+ QDRService,
+ QDRChartService,
+ $location,
+ $timeout,
+ basePath,
+ uiGridConstants) {
+
+ var COLUMNSTATEKEY = 'QDRColumnKey.';
+ var OVERVIEWEXPANDEDKEY = "QDROverviewExpanded"
+ var OVERVIEWACTIVATEDKEY = "QDROverviewActivated"
+ var OVERVIEWMODEIDS = "QDROverviewModeIds"
+
+ // we want attributes to be listed first, so add it at index 0
+
+ $scope.subLevelTabs = [{
+ content: '<i class="icon-list"></i> Attributes',
+ title: "View the attribute values on your selection",
+ isValid: function (workspace) { return true; },
+ href: function () { return "#/" + QDR.pluginName + "/attributes"; },
+ index: 0
+ },
+ {
+ content: '<i class="icon-leaf"></i> Operations',
+ title: "Execute operations on your selection",
+ isValid: function (workspace) { return true; },
+ href: function () { return "#/" + QDR.pluginName + "/operations"; },
+ index: 1
+ }]
+
+ $scope.activeTab = $scope.subLevelTabs[0];
+ $scope.setActive = function (nav) {
+ $scope.activeTab = nav;
+ };
+ $scope.isValid = function (nav) {
+ return nav.isValid()
+ }
+ $scope.isActive = function (nav) {
+ return nav == $scope.activeTab;
+ }
+ var refreshInterval = 5000
+ $scope.modes = [
+ {title: 'Overview', name: 'Overview', right: false}
+ ];
+
+ // get info for all routers
+ var allRouterInfo = function () {
+ var nodeIds = QDRService.nodeIdList()
+ var expected = Object.keys(nodeIds).length
+ var received = 0;
+ var allRouterFields = [];
+ var gotNodeInfo = function (nodeName, entity, response) {
+ var results = response.results;
+ var name = QDRService.nameFromId(nodeName)
+ var connections = 0;
+ results.forEach( function (result) {
+ var role = QDRService.valFor(response.attributeNames, result, "role")
+ if (role != 'inter-router') {
+ ++connections
+ }
+ })
+ allRouterFields.push({routerId: name, connections: connections, nodeId: nodeName})
+ ++received
+ if (expected == received) {
+ allRouterFields.sort ( function (a,b) { return a.routerId < b.routerId ? -1 : a.routerId > b.routerId ? 1 : 0})
+ // now get each router's node info
+ QDRService.getMultipleNodeInfo(nodeIds, "router", [], function (nodeIds, entity, responses) {
+ for(var r in responses) {
+ var result = responses[r]
+ var routerId = QDRService.valFor(result.attributeNames, result.results[0], "id")
+ allRouterFields.some( function (connField) {
+ if (routerId === connField.routerId) {
+ result.attributeNames.forEach ( function (attrName) {
+ connField[attrName] = QDRService.valFor(result.attributeNames, result.results[0], attrName)
+ })
+ connField['routerId'] = connField.id; // like QDR.A
+ return true
+ }
+ return false
+ })
+ }
+ $scope.allRouterFields = allRouterFields
+ updateRouterTree(allRouterFields)
+ }, nodeIds[0], false)
+ }
+ }
+ nodeIds.forEach ( function (nodeId, i) {
+ QDRService.getNodeInfo(nodeId, ".connection", ["role"], gotNodeInfo)
+ })
+ loadColState($scope.allRouters)
+ }
+
+ // get info for a single router
+ var routerInfo = function (node) {
+ $scope.router = node
+
+ $scope.routerFields = [];
+ var fields = Object.keys(node.fields)
+ fields.forEach( function (field) {
+ var attr = (field === 'connections') ? 'External connections' : field
+ $scope.routerFields.push({attribute: attr, value: node.fields[field]})
+ })
+ loadColState($scope.routerGrid);
+ }
+
+ // get info for all addresses
+ var allAddressInfo = function () {
+ var gotAllAddressFields = function ( addressFields ) {
+ if (!addressFields || addressFields.length === 0)
+ return;
+ // update the grid's data
+ addressFields.sort ( function (a,b) { return a.address < b.address ? -1 : a.address > b.address ? 1 : 0})
+ addressFields[0].title = addressFields[0].address
+ for (var i=1; i<addressFields.length; ++i) {
+ if (addressFields[i].address === addressFields[i-1].address) {
+ addressFields[i-1].title = addressFields[i-1].address + " (" + addressFields[i-1]['class'] + ")"
+ addressFields[i].title = addressFields[i].address + " (" + addressFields[i]['class'] + ")"
+ } else
+ addressFields[i].title = addressFields[i].address
+ }
+ $scope.addressesData = addressFields
+
+ // repopulate the tree's child nodes
+ updateAddressTree(addressFields)
+ }
+ getAllAddressFields(gotAllAddressFields)
+ loadColState($scope.addressesGrid);
+ }
+
+ var getAllAddressFields = function (callback) {
+ var nodeIds = QDRService.nodeIdList()
+ var addr_class = function (addr) {
+ if (!addr) return "-"
+ if (addr[0] == 'M') return "mobile"
+ if (addr[0] == 'R') return "router"
+ if (addr[0] == 'A') return "area"
+ if (addr[0] == 'L') return "local"
+ if (addr[0] == 'C') return "link-incoming"
+ if (addr[0] == 'D') return "link-outgoing"
+ if (addr[0] == 'T') return "topo"
+ return "unknown: " + addr[0]
+ }
+
+ var addr_phase = function (addr) {
+ if (!addr)
+ return "-"
+ if (addr[0] == 'M')
+ return addr[1]
+ return ''
+ }
+
+ var addressFields = []
+ QDRService.getMultipleNodeInfo(nodeIds, "router.address", [], function (nodeIds, entity, response) {
+ response.aggregates.forEach( function (result) {
+ var prettySum = function (field) {
+ var fieldIndex = response.attributeNames.indexOf(field)
+ if (fieldIndex < 0) {
+ return "-"
+ }
+ var val = result[fieldIndex].sum
+ return QDRService.pretty(val)
+ }
+
+ var uid = QDRService.valFor(response.attributeNames, result, "identity").sum
+ var identity = QDRService.identity_clean(uid)
+
+ addressFields.push({
+ address: QDRService.addr_text(identity),
+ 'class': QDRService.addr_class(identity),
+ phase: addr_phase(identity),
+ inproc: prettySum("inProcess"),
+ local: prettySum("subscriberCount"),
+ remote: prettySum("remoteCount"),
+ 'in': prettySum("deliveriesIngress"),
+ out: prettySum("deliveriesEgress"),
+ thru: prettySum("deliveriesTransit"),
+ toproc: prettySum("deliveriesToContainer"),
+ fromproc:prettySum("deliveriesFromContainer"),
+ uid: uid
+ })
+ })
+ callback(addressFields)
+ }, nodeIds[0])
+ }
+
+ var updateLinkGrid = function ( linkFields ) {
+ // apply the filter
+
+ var filteredLinks = linkFields.filter( function (link) {
+ var include = true;
+/*
+ if ($scope.filter.endpointsOnly === true) {
+ if (link.linkType !== 'endpoint')
+ include = false;
+ }
+*/
+ if ($scope.filter.hideConsoles) {
+ if (QDRService.isConsoleLink(link))
+ include = false;
+ }
+ return include;
+ })
+ $scope.linkFields = filteredLinks;
+ }
+
+ $scope.$watch("filter", function (newValue, oldValue) {
+ if (newValue !== oldValue) {
+ $timeout($scope.allLinkInfo);
+ localStorage[FILTERKEY] = JSON.stringify($scope.filter)
+ }
+ }, true)
+
+ $scope.$on('ngGridEventColumns', function (e, columns) {
+ var saveInfo = columns.map( function (col) {
+ return [col.width, col.visible]
+ })
+ var saveKey = columns[0].colDef.saveKey
+ if (saveKey)
+ localStorage.setItem(COLUMNSTATEKEY+saveKey, JSON.stringify(saveInfo));
+ })
+
+ var loadColState = function (grid) {
+ if (!grid)
+ return;
+ var columns = localStorage.getItem(COLUMNSTATEKEY+grid.saveKey);
+ if (columns) {
+ var cols = JSON.parse(columns);
+ cols.forEach( function (col, index) {
+ if (grid.columnDefs[index]) {
+ grid.columnDefs[index].width = col[0];
+ grid.columnDefs[index].visible = col[1]
+ }
+ })
+ }
+ }
+
+ $scope.allLinkInfo = function () {
+ getAllLinkFields([updateLinkGrid, updateLinkTree])
+// loadColState($scope.linksGrid);
+ }
+
+ var getAllLinkFields = function (completionCallbacks, selectionCallback) {
+ var nodeIds = QDRService.nodeIdList()
+ var linkFields = []
+ var now = Date.now()
+ var rate = function (linkName, response, result) {
+ if (!$scope.linkFields)
+ return 0;
+ var oldname = $scope.linkFields.filter(function (link) {
+ return link.link === linkName
+ })
+ if (oldname.length === 1) {
+ var elapsed = (now - oldname[0].timestamp) / 1000;
+ if (elapsed < 0)
+ return 0
+ var delivered = QDRService.valFor(response.attributeNames, result, "deliveryCount") - oldname[0].rawDeliveryCount
+ //QDR.log.debug("elapsed " + elapsed + " delivered " + delivered)
+ return elapsed > 0 ? parseFloat(Math.round((delivered/elapsed) * 100) / 100).toFixed(2) : 0;
+ } else {
+ //QDR.log.debug("unable to find old linkName")
+ return 0
+ }
+ }
+ var expected = nodeIds.length;
+ var received = 0;
+ var gotLinkInfo = function (nodeName, entity, response) {
+ response.results.forEach( function (result) {
+ var nameIndex = response.attributeNames.indexOf('name')
+ var prettyVal = function (field) {
+ var fieldIndex = response.attributeNames.indexOf(field)
+ if (fieldIndex < 0) {
+ return "-"
+ }
+ var val = result[fieldIndex]
+ return QDRService.pretty(val)
+ }
+ var uncounts = function () {
+ var und = QDRService.valFor(response.attributeNames, result, "undeliveredCount")
+ var uns = QDRService.valFor(response.attributeNames, result, "unsettledCount")
+ return QDRService.pretty(und + uns)
+ }
+ var linkName = function () {
+ var namestr = QDRService.nameFromId(nodeName)
+ return namestr + ':' + QDRService.valFor(response.attributeNames, result, "identity")
+ }
+ var fixAddress = function () {
+ var addresses = []
+ var owningAddr = QDRService.valFor(response.attributeNames, result, "owningAddr") || ""
+ var rawAddress = owningAddr
+ /*
+ - "L*" => "* (local)"
+ - "M0*" => "* (direct)"
+ - "M1*" => "* (dequeue)"
+ - "MX*" => "* (phase X)"
+ */
+ var address = undefined;
+ var starts = {'L': '(local)', 'M0': '(direct)', 'M1': '(dequeue)'}
+ for (var start in starts) {
+ if (owningAddr.startsWith(start)) {
+ var ends = owningAddr.substr(start.length)
+ address = ends + " " + starts[start]
+ rawAddress = ends
+ break;
+ }
+ }
+ if (!address) {
+ // check for MX*
+ if (owningAddr.length > 3) {
+ if (owningAddr[0] === 'M') {
+ var phase = parseInt(owningAddress.substr(1))
+ if (phase && !isNaN(phase)) {
+ var phaseStr = phase + "";
+ var star = owningAddress.substr(2 + phaseStr.length)
+ address = star + " " + "(phase " + phaseStr + ")"
+ }
+ }
+ }
+ }
+ addresses[0] = address || owningAddr
+ addresses[1] = rawAddress
+ return addresses
+ }
+ if (!selectionCallback || selectionCallback(response, result)) {
+ var adminStatus = QDRService.valFor(response.attributeNames, result, "adminStatus")
+ var operStatus = QDRService.valFor(response.attributeNames, result, "operStatus")
+ var linkName = linkName()
+ var linkType = QDRService.valFor(response.attributeNames, result, "linkType")
+ var rawRate = rate(linkName, response, result)
+ var addresses = fixAddress();
+ linkFields.push({
+ link: linkName,
+ title: linkName,
+ uncounts: uncounts(),
+ operStatus: operStatus,
+ adminStatus:adminStatus,
+ owningAddr: addresses[0],
+
+ acceptedCount: prettyVal("acceptedCount"),
+ modifiedCount: prettyVal("modifiedCount"),
+ presettledCount: prettyVal("presettledCount"),
+ rejectedCount: prettyVal("rejectedCount"),
+ releasedCount: prettyVal("releasedCount"),
+ deliveryCount:prettyVal("deliveryCount") + " ",
+
+ rate: QDRService.pretty(rawRate),
+ rawRate: rawRate,
+ capacity: QDRService.valFor(response.attributeNames, result, "capacity"),
+ undeliveredCount: QDRService.valFor(response.attributeNames, result, "undeliveredCount"),
+ unsettledCount: QDRService.valFor(response.attributeNames, result, "unsettledCount"),
+
+ rawAddress: addresses[1],
+ rawDeliveryCount: QDRService.valFor(response.attributeNames, result, "deliveryCount"),
+ name: QDRService.valFor(response.attributeNames, result, "name"),
+ linkName: QDRService.valFor(response.attributeNames, result, "linkName"),
+ connectionId: QDRService.valFor(response.attributeNames, result, "connectionId"),
+ linkDir: QDRService.valFor(response.attributeNames, result, "linkDir"),
+ linkType: linkType,
+ peer: QDRService.valFor(response.attributeNames, result, "peer"),
+ type: QDRService.valFor(response.attributeNames, result, "type"),
+
+ uid: linkName,
+ timestamp: now,
+ nodeId: nodeName,
+ identity: QDRService.valFor(response.attributeNames, result, "identity")
+ })
+ }
+ })
+ if (expected === ++received) {
+ linkFields.sort ( function (a,b) { return a.link < b.link ? -1 : a.link > b.link ? 1 : 0})
+ completionCallbacks.forEach( function (cb) {
+ cb(linkFields)
+ })
+ }
+ }
+ nodeIds.forEach( function (nodeId) {
+ QDRService.getNodeInfo(nodeId, "router.link", [], gotLinkInfo);
+ })
+ }
+
+ // get info for a all connections
+ var allConnectionInfo = function () {
+ getAllConnectionFields([updateConnectionGrid, updateConnectionTree])
+ loadColState($scope.allConnectionGrid);
+ }
+ // called after conection data is available
+ var updateConnectionGrid = function (connectionFields) {
+ $scope.allConnectionFields = connectionFields;
+ }
+
+ // get the connection data for all nodes
+ // called periodically
+ // creates a connectionFields array and calls the callbacks (updateTree and updateGrid)
+ var getAllConnectionFields = function (callbacks) {
+ var nodeIds = QDRService.nodeIdList()
+ var connectionFields = [];
+ var expected = nodeIds.length;
+ var received = 0;
+ var gotConnectionInfo = function (nodeName, entity, response) {
+ response.results.forEach( function (result) {
+
+ var auth = "no_auth"
+ var sasl = QDRService.valFor(response.attributeNames, result, "sasl")
+ if (QDRService.valFor(response.attributeNames, result, "isAuthenticated")) {
+ auth = sasl
+ if (sasl === "ANONYMOUS")
+ auth = "anonymous-user"
+ else {
+ if (sasl === "GSSAPI")
+ sasl = "Kerberos"
+ if (sasl === "EXTERNAL")
+ sasl = "x.509"
+ auth = QDRService.valFor(response.attributeNames, result, "user") + "(" +
+ QDRService.valFor(response.attributeNames, result, "sslCipher") + ")"
+ }
+ }
+
+ var sec = "no-security"
+ if (QDRService.valFor(response.attributeNames, result, "isEncrypted")) {
+ if (sasl === "GSSAPI")
+ sec = "Kerberos"
+ else
+ sec = QDRService.valFor(response.attributeNames, result, "sslProto") + "(" +
+ QDRService.valFor(response.attributeNames, result, "sslCipher") + ")"
+ }
+
+ var host = QDRService.valFor(response.attributeNames, result, "host")
+ var connField = {
+ host: host,
+ security: sec,
+ authentication: auth,
+ routerId: nodeName,
+ uid: host + QDRService.valFor(response.attributeNames, result, "identity")
+ }
+ response.attributeNames.forEach( function (attribute, i) {
+ connField[attribute] = result[i]
+ })
+ connectionFields.push(connField)
+ })
+ if (expected === ++received) {
+ connectionFields.sort ( function (a,b) { return a.host < b.host ? -1 : a.host > b.host ? 1 : 0})
+ callbacks.forEach( function (cb) {
+ cb(connectionFields)
+ })
+ }
+ }
+ nodeIds.forEach( function (nodeId) {
+ QDRService.getNodeInfo(nodeId, ".connection", [], gotConnectionInfo)
+ })
+ }
+
+ // get info for a single address
+ var addressInfo = function (address) {
+ if (!address)
+ return;
+ $scope.address = address
+ var currentEntity = getCurrentLinksEntity();
+ // we are viewing the addressLinks page
+ if (currentEntity === 'Address' && entityModes[currentEntity].currentModeId === 'links') {
+ updateModeLinks()
+ return;
+ }
+
+ $scope.addressFields = [];
+ var fields = Object.keys(address.fields)
+ fields.forEach( function (field) {
+ if (field != "title" && field != "uid")
+ $scope.addressFields.push({attribute: field, value: address.fields[field]})
+ })
+ loadColState($scope.addressGrid);
+ }
+
+ // display the grid detail info for a single link
+ var linkInfo = function (link) {
+ if (!link)
+ return;
+
+ $scope.link = link;
+ $scope.singleLinkFields = [];
+ var fields = Object.keys(link.fields)
+ var excludeFields = ["title", "uid", "uncounts", "rawDeliveryCount", "timestamp", "rawAddress"]
+ fields.forEach( function (field) {
+ if (excludeFields.indexOf(field) == -1)
+ $scope.singleLinkFields.push({attribute: field, value: link.fields[field]})
+ })
+ loadColState($scope.linkGrid);
+ }
+
+ // get info for a single connection
+ $scope.gridModes = [{
+ content: '<a><i class="icon-list"></i> Attriutes</a>',
+ id: 'attributes',
+ title: "View attributes"
+ },
+ {
+ content: '<a><i class="icon-link"></i> Links</a>',
+ id: 'links',
+ title: "Show links"
+ }
+ ];
+ var saveModeIds = function () {
+ var modeIds = {Address: entityModes.Address.currentModeId, Connection: entityModes.Connection.currentModeId}
+ localStorage[OVERVIEWMODEIDS] = JSON.stringify(modeIds)
+ }
+ var loadModeIds = function () {
+ return angular.fromJson(localStorage[OVERVIEWMODEIDS]) ||
+ {Address: 'attributes', Connection: 'attributes'}
+ }
+ var savedModeIds = loadModeIds()
+ var entityModes = {
+ Address: {
+ currentModeId: savedModeIds.Address,
+ filter: function (response, result) {
+ var owningAddr = QDRService.valFor(response.attributeNames, result, "owningAddr")
+ var id = $scope.address.data.fields.uid
+ return (owningAddr === $scope.address.data.fields.uid)
+ }
+ },
+ Connection: {
+ currentModeId: savedModeIds.Connection,
+ filter: function (response, result) {
+ var connectionId = QDRService.valFor(response.attributeNames, result, "connectionId")
+ return (connectionId === $scope.connection.data.fields.identity)
+ }
+ }
+ }
+ $scope.selectMode = function (mode, entity) {
+ if (!mode || !entity)
+ return;
+ entityModes[entity].currentModeId = mode.id;
+ saveModeIds();
+ if (mode.id === 'links') {
+ $scope.linkFields = [];
+ updateModeLinks();
+ }
+ }
+ $scope.isModeSelected = function (mode, entity) {
+ return mode.id === entityModes[entity].currentModeId
+ }
+ $scope.isModeVisible = function (entity, id) {
+ return entityModes[entity].currentModeId === id
+ }
+
+ var updateEntityLinkGrid = function (linkFields) {
+ $timeout(function () {$scope.linkFields = linkFields})
+ }
+ // based on which entity is selected, get and filter the links
+ var updateModeLinks = function () {
+ var currentEntity = getCurrentLinksEntity()
+ if (!currentEntity)
+ return;
+ var selectionCallback = entityModes[currentEntity].filter;
+ getAllLinkFields([updateEntityLinkGrid], selectionCallback)
+ }
+ var getCurrentLinksEntity = function () {
+ var currentEntity;
+ var active = $("#overtree").dynatree("getActiveNode");
+ if (active) {
+ currentEntity = active.data.type;
+ }
+ return currentEntity;
+ }
+
+ $scope.quiesceLinkClass = function (row) {
+ var stateClassMap = {
+ enabled: 'btn-primary',
+ disabled: 'btn-danger'
+ }
+ return stateClassMap[row.entity.adminStatus]
+ }
+
+ $scope.quiesceLink = function (row, $event) {
+ QDRService.quiesceLink(row.entity.nodeId, row.entity.name);
+ $event.stopPropagation()
+ }
+
+ $scope.quiesceLinkDisabled = function (row) {
+ return (row.entity.operStatus !== 'up' && row.entity.operStatus !== 'down')
+ }
+ $scope.quiesceLinkText = function (row) {
+ return row.entity.adminStatus === 'disabled' ? "Revive" : "Quiesce";
+ }
+
+ $scope.expandAll = function () {
+ $("#overtree").dynatree("getRoot").visit(function(node){
+ node.expand(true);
+ });
+ }
+ $scope.contractAll = function () {
+ $("#overtree").dynatree("getRoot").visit(function(node){
+ node.expand(false);
+ })
+ }
+
+ var connectionInfo = function (connection) {
+ if (!connection)
+ return;
+ $scope.connection = connection
+
+ var currentEntity = getCurrentLinksEntity();
+ // we are viewing the connectionLinks page
+ if (currentEntity === 'Connection' && entityModes[currentEntity].currentModeId === 'links') {
+ updateModeLinks()
+ return;
+ }
+
+ $scope.connectionFields = [];
+ var fields = Object.keys(connection.fields)
+ fields.forEach( function (field) {
+ if (field != "title" && field != "uid")
+ $scope.connectionFields.push({attribute: field, value: connection.fields[field]})
+ })
+ $scope.selectMode($scope.currentMode)
+ loadColState($scope.connectionGrid);
+ }
+
+ // get info for a all logs
+ var allLogEntries = []
+ var allLogInfo = function () {
+ var nodeIds = QDRService.nodeIdList()
+ var expected = nodeIds.length;
+ var received = 0;
+ var logResults = []
+ var gotLogInfo = function (nodeId, entity, response, context) {
+ var statusCode = context.message.application_properties.statusCode;
+ if (statusCode < 200 || statusCode >= 300) {
+ Core.notification('error', context.message.application_properties.statusDescription);
+ //QDR.log.debug(context.message.application_properties.statusDescription)
+ return;
+ }
+ var logFields = response.map( function (result) {
+ return {
+ nodeId: QDRService.nameFromId(nodeId),
+ name: result[0],
+ type: result[1],
+ message: result[2],
+ source: result[3],
+ line: result[4],
+ time: Date(result[5]).toString()
+ }
+ })
+ logResults.push.apply(logResults, logFields) // append new array to existing
+ if (expected == ++received) {
+ logResults.sort( function (a, b) {
+ return b.name - a.name
+ })
+
+ $scope.allLogFields = [];
+ var options = $scope.data.log.options;
+ options.forEach( function (option) {
+ if (option.id != 'all') {
+ $scope.allLogFields.push(
+ {module: option.id,
+ enable: option.fields.enable,
+ count: logResults.filter( function (entry) {
+ return entry.name === option.fields.module
+ }).length
+ })
+ }
+ })
+ allLogEntries = logResults
+ }
+ }
+ nodeIds.forEach( function (node) {
+ QDRService.sendMethod(node, undefined, {}, "GET-LOG", {}, gotLogInfo)
+ })
+
+ }
+
+ // get info for a single log
+ var logInfo = function (node) {
+ $scope.log = node
+ $scope.logFields = allLogEntries.filter( function (log) {
+ return node.id === log.name
+ })
+ $scope.$apply();
+ }
+
+ var updateExpanded = function () {
+ if (!$scope.selectedObject)
+ return;
+ // find the parent of the selectedObject and call it's info function
+ if ($scope.selectedObject.pinfo)
+ $scope.selectedObject.pinfo()
+ $scope.selectedObject.info($scope.selectedObject)
+ }
+
+ var sendChartRequest = function (svgCharts) {
+ var gotChartData = function (linkFields) {
+ var now = new Date();
+ svgCharts.forEach( function (svgChart) {
+ var cutOff = new Date(now.getTime() - svgChart.chart.duration() * 60 * 1000);
+ var name = svgChart.chart.name()
+ var attr = svgChart.chart.attr()
+ var data = svgChart.chart.data(name, attr) // get a reference to the data array
+ var val = svgChart.chart.getVal(linkFields)
+ data.push([now, val])
+ // expire the old data
+ while (data[0][0] < cutOff) {
+ data.shift();
+ }
+ })
+ }
+ getAllLinkFields([gotChartData])
+ }
+
+ // loads the tree node name that was last selected
+ var loadActivatedNode = function () {
+ return localStorage[OVERVIEWACTIVATEDKEY] || 'Routers'
+ }
+ // saved the tree node name that is currently selected
+ var saveActivated = function (key) {
+ localStorage[OVERVIEWACTIVATEDKEY] = key;
+ lastKey = key;
+ }
+ // loads list that was saved
+ var loadExpandedNodeList = function () {
+ return angular.fromJson(localStorage[OVERVIEWEXPANDEDKEY]) || [];
+ }
+ // called when a node is expanded
+ // here we save the expanded node so it can be restored when the page reloads
+ var saveExpanded = function () {
+ var list = getExpandedList();
+ localStorage[OVERVIEWEXPANDEDKEY] = JSON.stringify(list)
+ expandedNodeList = list
+ }
+
+ $scope.setActivated = function (dropdown, uid, suid) {
+ $("#sel" + dropdown).val(uid)
+
+ var dd = $scope.data[dropdown];
+ var newOption;
+ if (uid == 'all') {
+ newOption = dd.options[0];
+ } else {
+ dd.options.some( function (option) {
+ if (option.fields && option.fields[suid] === uid) {
+ newOption = option
+ return true;
+ } else
+ return false;
+ })
+ }
+ $scope.activated(newOption)
+ }
+
+ $scope.selectedObject = null;
+ $scope.templateUrl = null;
+ // activated is called each time a dropdown is changed
+ // based on which node is clicked, load the correct data grid template and start getting the data
+ $scope.activated = function (node) {
+ if (!node)
+ return;
+ $scope.selectedObject = node;
+ if (node.id !== "all") {
+ $scope.data[node.type].sel = node
+ }
+ //saveExpanded()
+ //saveActivated(node.data.key)
+
+ $scope.templateUrl = 'dispatch/' + node.type + ".html";
+ // the node's info function will fetch the grids data
+ if (node.info) {
+ $timeout(function () {node.info(node)})
+ }
+ }
+
+ /* --------------------------------------------------
+ *
+ * setup the dropdowns
+ *
+ * -------------------------------------------------
+ */
+ var initDropDown = function (dd, info, type) {
+ $scope.data[dd] = {}
+ $scope.data[dd].options = getAllOption(dd, info, type)
+ $scope.data[dd].sel = $scope.data[dd].options[0];
+ }
+ var getAllOption = function (dd, info, type) {
+ return [{id: 'all',
+ name: 'All ' + type,
+ info: info,
+ type: type}]
+ }
+ var updateDropdown = function (dropdown, allFields, idKey, nameKey, allInfo, allType, info) {
+ var currentId = $scope.data[dropdown].sel.id;
+ $scope.data[dropdown].options = getAllOption(dropdown, allInfo, allType)
+ allFields.forEach( function (fields) {
+ var option = {id: fields[idKey],
+ name: fields[nameKey],
+ info: info,
+ type: dropdown,
+ fields: fields,
+ pinfo: allInfo}
+ $scope.data[dropdown].options.push(option);
+
+ if (currentId === option.id) {
+ $scope.data[dropdown].sel = option
+ }
+ })
+ if ($scope.selectedObject && $scope.selectedObject.type === dropdown) {
+ $scope.selectedObject = $scope.data[dropdown].sel;
+//QDR.log.debug("updated " + dropdown + " to ")
+//console.dump($scope.selectedObject)
+ }
+ }
+
+ // get saved tree state
+ var lastKey = loadActivatedNode();
+ // called when the list of routers changes
+ var updateRouterTree = function (routerFields) {
+ updateDropdown('router', routerFields, 'nodeId', 'routerId', allRouterInfo, 'routers', routerInfo)
+ }
+ var updateAddressTree = function (addressFields) {
+ updateDropdown('address', addressFields, 'uid', 'title', allAddressInfo, 'addresss', addressInfo)
+ }
+ // called whenever a background update is done and an option in the link dropdown is selected
+ var updateLinkTree = function (linkFields) {
+ updateDropdown('link', linkFields, 'uid', 'title', $scope.allLinkInfo, 'links', linkInfo)
+ }
+ var updateConnectionTree = function (connectionFields) {
+ updateDropdown('connection', connectionFields, 'uid', 'host', allConnectionInfo, 'connections', connectionInfo)
+ }
+
+ $scope.data = {}
+ initDropDown('router', allRouterInfo, 'routers')
+ initDropDown('address', allAddressInfo, 'addresss')
+ initDropDown('link', $scope.allLinkInfo, 'links', true)
+ initDropDown('connection', allConnectionInfo, 'connections')
+ initDropDown('log', allLogInfo, 'logs')
+ // called after we are connected to initialize data
+ var initTreeState = function () {
+ allRouterInfo();
+ allAddressInfo();
+ $scope.allLinkInfo();
+ allConnectionInfo()
+
+ var nodeIds = QDRService.nodeIdList()
+ QDRService.getNodeInfo(nodeIds[0], "log", ["module", "enable"], function (nodeName, entity, response) {
+ var moduleIndex = response.attributeNames.indexOf('module')
+ response.results.sort( function (a,b) {return a[moduleIndex] < b[moduleIndex] ? -1 : a[moduleIndex] > b[moduleIndex] ? 1 : 0})
+ response.results.forEach( function (result) {
+ var entry = QDRService.flatten(response.attributeNames, result)
+ $scope.data.log.options.push({id: entry.module, name: entry.module, info: logInfo, type: 'log', fields: entry, pinfo: allLogInfo});
+ })
+ initTreeAndGrid();
+ })
+ }
+
+ $scope.svgCharts = [];
+ var updateTimer;
+ var initCharts = function () {
+ var charts = [];
+ charts.push(QDRChartService.createRequestAndChart(
+ {
+ attr: 'Outstanding deliveries',
+ nodeId: '',
+ name: 'for all endpoints',
+ entity: 'router.link',
+ visibleDuration: 1,
+ duration: 1,
+ }))
+ charts[charts.length-1].getVal = function (linkFields) {
+ var uncountTotal = 0;
+ linkFields.forEach( function (row) {
+ if (row.linkType == 'endpoint' && !QDRService.isConsoleLink(row))
+ uncountTotal += row.undeliveredCount + row.unsettledCount
+ })
+ return uncountTotal;
+ }
+
+ charts.push(QDRChartService.createRequestAndChart(
+ {
+ //type: "rate",
+ attr: 'Outgoing deliveries per second',
+ nodeId: '',
+ name: 'for all endpoints',
+ entity: 'router.link',
+ visibleDuration: 1,
+ duration: 1,
+ }))
+ charts[charts.length-1].getVal = function (linkFields) {
+ var countTotal = 0.0;
+ linkFields.forEach( function (row) {
+ if (row.linkType == 'endpoint' && !QDRService.isConsoleLink(row) && row.linkDir == "out") {
+ countTotal += parseFloat(row.rawRate + "")
+ }
+ })
+ return countTotal;
+ }
+
+ charts.push(QDRChartService.createRequestAndChart(
+ {
+ //type: "rate",
+ attr: 'Incoming deliveries per second',
+ nodeId: '',
+ name: 'for all endpoints',
+ entity: 'router.link',
+ visibleDuration: 1,
+ duration: 1,
+ }))
+ charts[charts.length-1].getVal = function (linkFields) {
+ var countTotal = 0.0;
+ linkFields.forEach( function (row) {
+ if (row.linkType == 'endpoint' && !QDRService.isConsoleLink(row) && row.linkDir == "in")
+ countTotal += parseFloat(row.rawRate + "")
+ })
+ return countTotal;
+ }
+ charts[charts.length-1].areaColor = "#fcd6d6"
+ charts[charts.length-1].lineColor = "#c70404"
+
+ charts.forEach( function (chart) {
+ $scope.svgCharts.push(new QDRChartService.AreaChart(chart));
+ })
+ }
+ initCharts();
+
+ var initTreeAndGrid = function () {
+
+ // show the All routers page
+ $scope.setActivated('link', 'all')
+
+ // populate the data for each expanded node
+ $timeout(updateExpanded);
+ QDRService.addUpdatedAction( "overview", function () {
+ $timeout(updateExpanded);
+ sendChartRequest($scope.svgCharts)
+ })
+ // update the node list
+ QDRService.startUpdating()
+
+ var showChart = function () {
+ // the chart divs are generated by angular and aren't available immediately
+ var div = angular.element("#" + $scope.svgCharts[0].chart.id());
+ if (!div.width()) {
+ setTimeout(showChart, 100);
+ return;
+ }
+ updateDialogChart();
+ }
+
+ var updateDialogChart = function () {
+ $scope.svgCharts.forEach( function ( svgChart) {
+ svgChart.tick(svgChart.chart.id())
+ })
+ if (updateTimer)
+ clearTimeout(updateTimer)
+ updateTimer = setTimeout(updateDialogChart, 1000);
+ }
+ showChart();
+
+ loadColState($scope.allRouters);
+ loadColState($scope.routerGrid);
+ loadColState($scope.addressesGrid);
+ loadColState($scope.addressGrid);
+ loadColState($scope.linksGrid);
+ loadColState($scope.linkGrid);
+ loadColState($scope.allConnectionGrid);
+ loadColState($scope.connectionGrid);
+ } // end of initTreeAndGrid
+
+ $scope.$on("$destroy", function( event ) {
+ QDRService.stopUpdating()
+ QDRService.delUpdatedAction("overview")
+ if (updateTimer)
+ clearTimeout(updateTimer)
+ });
+ initTreeState();
+ QDRService.addDisconnectAction( function () {
+ QDR.log.debug("disconnected from router. show a toast message");
+ if (updateTimer)
+ clearTimeout(updateTimer)
+ })
+ };
+
+ return QDR;
+
+}(QDR || {}));
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0c58c381/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/overv/overview.module.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/overv/overview.module.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/overv/overview.module.js
new file mode 100644
index 0000000..cdde521
--- /dev/null
+++ b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/overv/overview.module.js
@@ -0,0 +1,178 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+(function () {
+ 'use strict';
+
+ angular
+ .module('horizon.dashboard.dispatch.overv', [])
+ .config(config)
+ .run(addTemplates)
+
+ config.$inject = [
+ '$provide',
+ '$windowProvider'
+ ];
+
+ addTemplates.$inject = [
+ '$templateCache'
+ ]
+
+ /**
+ * @name config
+ * @param {Object} $provide
+ * @param {Object} $windowProvider
+ * @description Base path for the overview code
+ * @returns {undefined} No return value
+ */
+ function config($provide, $windowProvider) {
+ var path = $windowProvider.$get().STATIC_URL + 'dashboard/dispatch/overv/';
+ $provide.constant('horizon.dashboard.dispatch.overv.basePath', path);
+ }
+
+ function addTemplates($templateCache) {
+ $templateCache.put('dispatch/tplLinkRow.html',
+ "<div" +
+ " ng-repeat=\"(colRenderIndex, col) in colContainer.renderedColumns track by col.uid\"" +
+ " ui-grid-one-bind-id-grid=\"rowRenderIndex + '-' + col.uid + '-cell'\"" +
+ " class=\"ui-grid-cell\"" +
+ " ng-class=\"{ 'ui-grid-row-header-cell': col.isRowHeader, linkDirIn: row.entity.linkDir=='in', linkDirOut: row.entity.linkDir=='out' }\"" +
+ " role=\"{{col.isRowHeader ? 'rowheader' : 'gridcell'}}\"" +
+ " ui-grid-cell>" +
+ "</div>"
+ );
+ $templateCache.put('dispatch/links.html',
+ "<h3>Links</h3>" +
+ "<div class='grid' ui-grid='linksGrid' ui-grid-selection></div>"
+ );
+ $templateCache.put('dispatch/link.html',
+ "<h3>Link {$ link.name $}</h3>" +
+ "<div class='grid noHighlight' ui-grid='linkGrid' ui-grid-resize-columns></div>"
+ );
+ $templateCache.put('dispatch/overview.html',
+ "<div id=\"overview-controller\" ng-controller=\"horizon.dashboard.dispatch.overv.OverviewController as ctrl\">" +
+ " <div id=\"overview_charts\" class=\"clearfix\">" +
+ " <div ng-repeat=\"chart in svgCharts\" id=\"{$ chart.chart.id() $}\" class=\"d3Chart\"></div>" +
+ " </div>" +
+ " <hr/>" +
+ " <div id=\"overview_dropdowns\" class=\"clearfix\">" +
+ " <div class=\"overview-dropdown\"" +
+ " ng-class=\"{selected1: selectedObject.type == 'router', selected: selectedObject.type == 'routers'}\">" +
+ " <div class=\"dropdown-entity\">Routers</div>" +
+ " <select id=\"selrouter\" ng-options=\"option.name for option in data.router.options track by option.id\"" +
+ " ng-click=\"activated(data.router.sel)\" ng-model=\"data.router.sel\"></select>" +
+ " </div>" +
+ " <div class=\"overview-dropdown\"" +
+ " ng-class=\"{selected1: selectedObject.type == 'address', selected: selectedObject.type == 'addresses'}\">" +
+ " <div class=\"dropdown-entity\">Addresses</div>" +
+ " <select id=\"seladdress\" ng-options=\"option.name for option in data.address.options track by option.id\"" +
+ " ng-click=\"activated(data.address.sel)\" ng-model=\"data.address.sel\"></select>" +
+ " </div>" +
+ " <div class=\"overview-dropdown\"" +
+ " ng-class=\"{selected1: selectedObject.type == 'link', selected: selectedObject.type == 'links'}\">" +
+ " <div class=\"dropdown-entity\">Links</div>" +
+ " <select id=\"sellink\" ng-options=\"option.name for option in data.link.options track by option.id\"" +
+ " ng-click=\"activated(data.link.sel)\" ng-model=\"data.link.sel\"></select>" +
+ " </div>" +
+ " <div class=\"overview-dropdown\"" +
+ " ng-class=\"{selected1: selectedObject.type == 'connection', selected: selectedObject.type == 'connections'}\">" +
+ " <div class=\"dropdown-entity\">Connections</div>" +
+ " <select id=\"selconnection\" ng-options=\"option.name for option in data.connection.options track by option.id\"" +
+ " ng-click=\"activated(data.connection.sel)\" ng-model=\"data.connection.sel\"></select>" +
+ " </div>" +
+ " <div class=\"overview-dropdown\"" +
+ " ng-class=\"{selected1: selectedObject.type == 'log', selected: selectedObject.type == 'logs'}\">" +
+ " <div class=\"dropdown-entity\">Logs</div>" +
+ " <select id=\"sellog\" ng-options=\"option.name for option in data.log.options track by option.id\"" +
+ " ng-click=\"activated(data.log.sel)\" ng-model=\"data.log.sel\"></select>" +
+ " </div>" +
+ " </div>" +
+ " <div ng-include=\"templateUrl\"></div>" +
+ " <div ng-init=\"overviewLoaded()\"></div>" +
+ "</div>"
+ );
+ $templateCache.put('dispatch/addresss.html',
+ "<h3>Addresses</h3>" +
+ "<div class='grid' ui-grid='addressesGrid' ui-grid-selection></div>"
+ );
+ $templateCache.put('dispatch/address.html',
+ "<ul class=\"nav nav-tabs\">" +
+ " <li ng-repeat=\"mode in gridModes\" ng-click=\"selectMode(mode,'Address')\" ng-class=\"{active : isModeSelected(mode,'Address')}\" title=\"{$ mode.title $}\" ng-bind-html-unsafe=\"mode.content\"> </li>" +
+ "</ul>" +
+ "<div ng-if=\"isModeVisible('Address','attributes')\" class=\"selectedItems\">" +
+ " <h3>Address {$ address.name $}</h3>" +
+ " <div class=\"gridStyle noHighlight\" ui-grid=\"addressGrid\"></div>" +
+ "</div>" +
+ "<div ng-if=\"isModeVisible('Address','links')\" class=\"selectedItems\">" +
+ " <h3>Links for address {$ address.name $}</h3>" +
+ " <div class=\"gridStyle\" ui-grid=\"linksGrid\"></div>" +
+ "</div>"
+ );
+
+ $templateCache.put('dispatch/connection.html',
+ "<ul class=\"nav nav-tabs\">" +
+ " <li ng-repeat=\"mode in gridModes\" ng-click=\"selectMode(mode,'Connection')\" ng-class=\"{active : isModeSelected(mode,'Connection')}\" title=\"{$ mode.title $}\" ng-bind-html-unsafe=\"mode.content\"> </li>" +
+ "</ul>" +
+ "<div ng-if=\"isModeVisible('Connection','attributes')\" class=\"selectedItems\">" +
+ " <h3>Connection {$ connection.name $}</h3>" +
+ " <div class=\"gridStyle noHighlight\" ui-grid=\"connectionGrid\"></div>" +
+ "</div>" +
+ "<div ng-if=\"isModeVisible('Connection','links')\" class=\"selectedItems\">" +
+ " <h3>Links for connection {$ connection.name $}</h3>" +
+ " <div class=\"gridStyle\" ui-grid=\"linksGrid\"></div>" +
+ "</div>"
+ );
+ $templateCache.put('dispatch/connections.html',
+ "<h3>Connections</h3>" +
+ "<div class=\"overview\">" +
+ " <div class=\"grid\" ui-grid=\"allConnectionGrid\" ui-grid-selection></div>" +
+ "</div>"
+ );
+ $templateCache.put('dispatch/log.html',
+ "<h3>{$ log.name $}</h3>" +
+ "<div ng-if=\"logFields.length > 0\">" +
+ " <table class=\"log-entry\" ng-repeat=\"entry in logFields track by $index\">" +
+ " <tr>" +
+ " <td>Router</td><td>{$ entry.nodeId $}</td>" +
+ " </tr>" +
+ " <tr>" +
+ " <td align=\"left\" colspan=\"2\">{$ entry.time $}</td>" +
+ " </tr>" +
+ " <tr>" +
+ " <td>Source</td><td>{$ entry.source $}:{$ entry.line $}</td>" +
+ " </tr>" +
+ " <tr>" +
+ " <td valign=\"middle\">Message</td><td valign=\"middle\"><pre>{$ entry.message $}</pre></td>" +
+ " </tr>" +
+ " </table>" +
+ "</div>" +
+ "<div ng-if=\"logFields.length == 0\">No log entries for {$ log.name $}</div>"
+ );
+ $templateCache.put('dispatch/logs.html',
+ "<h3>Recent log entries</h3>" +
+ "<div class=\"overview\">" +
+ " <div class=\"grid\" ui-grid=\"allLogGrid\" ui-grid-selection></div>" +
+ "</div>"
+ );
+ $templateCache.put('dispatch/router.html',
+ "<h3>Router {$ router.name $}</h3>" +
+ "<div class=\"grid noHighlight\" ui-grid=\"routerGrid\"></div>"
+ );
+ $templateCache.put('dispatch/routers.html',
+ "<h3>Routers</h3>" +
+ "<div class=\"overview\">" +
+ " <div class=\"grid\" ui-grid=\"allRouters\" ui-grid-selection></div>" +
+ "</div>"
+ );
+ }
+})();
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org