diff --git a/xCAT-UI/js/monitor/gangliamon.js b/xCAT-UI/js/monitor/gangliamon.js index fd4b143a0..9dc39b7ed 100644 --- a/xCAT-UI/js/monitor/gangliamon.js +++ b/xCAT-UI/js/monitor/gangliamon.js @@ -1,16 +1,13 @@ -function loadGangliaMon(){ - var gangMonTab = $('#gangliamon'); - var gangMonStatus = createStatusBar('gangMonStatus'); - gangMonTab.append(gangMonStatus); - - gangMonTab.append("
"); - $('#gangMonConfig').hide(); - addCfgButton(); - - gangMonTab.append(""); - $('#gangLink').hide(); - addGangLink(); - +/** + * Load Ganglia monitoring tool + * + * @return Nothing + */ +function loadGangliaMon() { + // Get Ganglia tab + var gangliaTab = $('#gangliamon'); + + // Check whether Ganglia RPMs are installed on the xCAT MN $.ajax( { url : 'lib/systemcmd.php', dataType : 'json', @@ -18,84 +15,11 @@ function loadGangliaMon(){ cmd : 'rpm -q rrdtool ganglia-gmetad ganglia-gmond ganglia-web' }, - success : gangRpmCheck + success : checkGangliaRPMs }); -} - -function addCfgButton(){ - var startButton = createButton('Start'); - $('#gangMonConfig').append(startButton); - startButton.bind('click', function(){ - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'webrun', - tgt : '', - args : 'gangliaStart', - msg : '' - }, - - success : function(data){ - $('#rmcMonStatus').empty().append(data.rsp[0]); - $('#gangLink').show(); - } - }); - }); - $('#gangMonConfig').append(startButton); - var stopButton = createButton('Stop'); - $('#gangMonConfig').append(startButton); - stopButton.bind('click', function(){ - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'rmcstop', - tgt : '', - args : 'gangliamon,-r', - msg : '' - }, - - success : function(data){ - $('#rmcMonStatus').empty().append(data.rsp[0]); - $('#gangLink').hide(); - } - }); - }); - $('#gangMonConfig').append(stopButton); -} - -function addGangLink(){ - $('#gangLink').append('The Ganglia is running now.References: xCAT2-Monitoring.pdf.
"; - $('#gangMonStatus').empty().append(showString); - return; - } - - $('#gangMonConfig').show(); - - $.ajax({ + // Check if ganglia is running on the xCAT MN + $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { @@ -104,14 +28,579 @@ function gangRpmCheck(data){ args : 'gangliamon', msg : '' }, - - success : function(data){ - if (-1 != data.rsp[0].indexOf("not-monitored")){ - $('#gangMonStatus').empty().append("Please start the Ganglia Monitoring first."); - return; + + /** + * Append warning message + * + * @param data + * Data returned from HTTP request + * @return Nothing + */ + success : function(data) { + if (data.rsp[0].indexOf("not-monitored") > -1) { + // Create link to start Ganglia + var startLnk = $('Click here'); + startLnk.css( { + 'color' : 'blue', + 'text-decoration' : 'none' + }); + startLnk.click(function() { + // Turn on Ganglia for all nodes + monitorNode('', 'on'); + }); + + // Create warning bar + var warningBar = $(''); + var msg = $(''); + msg.append(''); + msg.append('Please start Ganglia Monitoring on xCAT. '); + msg.append(startLnk); + msg.append(' to start Ganglia Monitoring.'); + warningBar.append(msg); + warningBar.css('margin-bottom', '10px'); + + // If there are any warning messages, append this warning after it + var curWarnings = $('#gangliamon').find('.ui-state-error'); + var gangliaTab = $('#gangliamon'); + if (curWarnings.length) { + curWarnings.after(warningBar); + } else { + warningBar.prependTo(gangliaTab); + } } - - $('#gangLink').show(); } }); + + // Create groups and nodes DIV + var groups = $(''); + var nodes = $(''); + gangliaTab.append(groups); + gangliaTab.append(nodes); + + // Create info bar + var info = createInfoBar('Select a group to view its nodes'); + nodes.append(info); + + // Get groups + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'extnoderange', + tgt : '/.*', + args : 'subgroups', + msg : '' + }, + + success : loadGroups4Ganglia + }); + + return; +} + +/** + * Check whether Ganglia RPMs are installed + * + * @param data + * Data returned from HTTP request + * @return Nothing + */ +function checkGangliaRPMs(data) { + var gangliaTab = $('#gangliamon'); + + // Get the list of Ganglia RPMs installed + var status = data.rsp.split(/\n/); + var gangliaRPMs = [ "rrdtool", "ganglia-gmetad", "ganglia-gmond", "ganglia-web" ]; + var warningMsg = 'Before continuing, please install the following packages: '; + var missingRPMs = false; + for ( var i in status) { + if (status[i].indexOf("not installed") > -1) { + warningMsg += gangliaRPMs[i] + ' '; + missingRPMs = true; + } + } + + // Append Ganglia PDF + if (missingRPMs) { + warningMsg += ". Refer to xCAT2-Monitoring.pdf for more information."; + + var warningBar = createWarnBar(warningMsg); + warningBar.css('margin-bottom', '10px'); + warningBar.prependTo(gangliaTab); + } + return; +} + +/** + * Load groups + * + * @param data + * Data returned from HTTP request + * @return + */ +function loadGroups4Ganglia(data) { + // Remove loader + $('#groups').find('img').remove(); + + var groups = data.rsp; + setGroupsCookies(data); + + // Create a list of groups + var ul = $('
',
+ 'power
', 'ganglia
');
+
+ // Create a datatable
+ var dTable = new DataTable('nodesDataTable');
+ dTable.init(sorted);
+
+ // Go through each node
+ for ( var node in attrs) {
+ // Create a row
+ var row = new Array();
+ // Create a check box
+ var checkBx = '';
+ // Open node onclick
+ var nodeLink = $('' + node + '').bind('click', loadNode);
+ row.push(checkBx, nodeLink, '', '', '');
+
+ // Go through each header
+ for ( var i = 5; i < sorted.length; i++) {
+ // Add the node attributes to the row
+ var key = sorted[i];
+ var val = attrs[node][key];
+ if (val) {
+ row.push(val);
+ } else {
+ row.push('');
+ }
+ }
+
+ // Add the row to the table
+ dTable.add(row);
+ }
+
+ // Clear the tab before inserting the table
+ $('#nodesTab').children().remove();
+
+ // Create action bar
+ var actionBar = $('');
+
+ /**
+ * The following actions are available to perform against a given node:
+ * power and monitor
+ */
+
+ /*
+ * Power
+ */
+ var powerLnk = $('Power');
+
+ /*
+ * Power on
+ */
+ var powerOnLnk = $('Power on');
+ powerOnLnk.bind('click', function(event) {
+ var tgtNodes = getNodesChecked('nodesDataTable');
+ if (tgtNodes) {
+ powerNode(tgtNodes, 'on');
+ }
+ });
+
+ /*
+ * Power off
+ */
+ var powerOffLnk = $('Power off');
+ powerOffLnk.bind('click', function(event) {
+ var tgtNodes = getNodesChecked('nodesDataTable');
+ if (tgtNodes) {
+ powerNode(tgtNodes, 'off');
+ }
+ });
+
+ // Power actions
+ var powerActions = [ powerOnLnk, powerOffLnk ];
+ var powerActionMenu = createMenu(powerActions);
+
+ /*
+ * Monitor
+ */
+ var monitorLnk = $('Monitor');
+ monitorLnk.bind('click', function(event) {
+ var tgtNodes = getNodesChecked('nodesDataTable');
+ if (tgtNodes) {
+
+ }
+ });
+
+ /*
+ * Turn monitoring on
+ */
+ var monitorOnLnk = $('Monitor on');
+ monitorOnLnk.bind('click', function(event) {
+ var tgtNodes = getNodesChecked('nodesDataTable');
+ if (tgtNodes) {
+ monitorNode(tgtNodes, 'on');
+ }
+ });
+
+ /*
+ * Turn monitoring off
+ */
+ var monitorOffLnk = $('Monitor off');
+ monitorOffLnk.bind('click', function(event) {
+ var tgtNodes = getNodesChecked('nodesDataTable');
+ if (tgtNodes) {
+ monitorNode(tgtNodes, 'off');
+ }
+ });
+
+ // Power actions
+ var monitorActions = [ monitorOnLnk, monitorOffLnk ];
+ var monitorActionMenu = createMenu(monitorActions);
+
+ /**
+ * Create an action menu
+ */
+ var actionsDIV = $('');
+ var actions = [ [ powerLnk, powerActionMenu ], [ monitorLnk, monitorActionMenu ] ];
+ var actionMenu = createMenu(actions);
+ actionMenu.superfish();
+ actionsDIV.append(actionMenu);
+ actionBar.append(actionsDIV);
+ $('#nodesTab').append(actionBar);
+
+ // Insert table
+ $('#nodesTab').append(dTable.object());
+
+ // Turn table into a datatable
+ var myDataTable = $('#nodesDataTable').dataTable();
+ setNodesDataTable(myDataTable);
+
+ // Do not sort ping and power column
+ var pingCol = $('#nodesDataTable thead tr th').eq(2);
+ var powerCol = $('#nodesDataTable thead tr th').eq(3);
+ var gangliaCol = $('#nodesDataTable thead tr th').eq(4);
+ pingCol.unbind('click');
+ powerCol.unbind('click');
+ gangliaCol.unbind('click');
+
+ // Create enough space for loader to be displayed
+ $('#nodesDataTable tbody tr td:nth-child(3)').css('min-width', '60px');
+ $('#nodesDataTable tbody tr td:nth-child(4)').css('min-width', '60px');
+ $('#nodesDataTable tbody tr td:nth-child(5)').css('min-width', '80px');
+
+ // Instead refresh the ping status and power status
+ pingCol.bind('click', function(event) {
+ refreshPingStatus(group);
+ });
+
+ powerCol.bind('click', function(event) {
+ refreshPowerStatus(group);
+ });
+
+ gangliaCol.bind('click', function(event) {
+ refreshGangliaStatus(group);
+ });
+
+ /**
+ * Get power and ping status for each node
+ */
+
+ // Get the power status
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'rpower',
+ tgt : group,
+ args : 'stat',
+ msg : ''
+ },
+
+ success : loadPowerStatus
+ });
+
+ // Get the ping status
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'webrun',
+ tgt : '',
+ args : 'pping ' + group,
+ msg : ''
+ },
+
+ success : loadPingStatus
+ });
+
+ // Get the status of Ganglia
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'webrun',
+ tgt : '',
+ args : 'gangliastatus;' + group,
+ msg : ''
+ },
+
+ success : loadGangliaStatus
+ });
+}
+
+/**
+ * Load the status of Ganglia for a given group
+ *
+ * @param data
+ * Data returned from HTTP request
+ * @return Nothing
+ */
+function loadGangliaStatus(data) {
+ // Get datatable
+ var dTable = getNodesDataTable();
+ var ganglia = data.rsp;
+ var rowNum, node, status, args;
+
+ for ( var i in ganglia) {
+ // ganglia[0] = nodeName and ganglia[1] = state
+ node = jQuery.trim(ganglia[i][0]);
+ status = jQuery.trim(ganglia[i][1]);
+
+ // Get the row containing the node
+ rowNum = getRowNum(node);
+
+ // Update the power status column
+ dTable.fnUpdate(status, rowNum, 4);
+ }
+
+ // Hide Ganglia loader
+ var gangliaCol = $('#nodesDataTable thead tr th').eq(4);
+ gangliaCol.find('img').hide();
+}
+
+/**
+ * Refresh the status of Ganglia for each node
+ *
+ * @param group
+ * Group name
+ * @return Nothing
+ */
+function refreshGangliaStatus(group) {
+ // Show ganglia loader
+ var gangliaCol = $('#nodesDataTable thead tr th').eq(4);
+ gangliaCol.find('img').show();
+
+ // Get the status of Ganglia
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'webrun',
+ tgt : '',
+ args : 'gangliastatus;' + group,
+ msg : ''
+ },
+
+ success : loadGangliaStatus
+ });
+}
+
+/**
+ * Turn on monitoring for a given node
+ *
+ * @param node
+ * Node to monitor on or off
+ * @param monitor
+ * Monitor state, on or off
+ * @return Nothing
+ */
+function monitorNode(node, monitor) {
+ var args;
+
+ if (monitor == 'on') {
+ // Append loader to warning bar
+ var gangliaLoader = createLoader('');
+ var warningBar = $('#gangliamon').find('.ui-state-error p');
+ if (warningBar.length) {
+ warningBar.append(gangliaLoader);
+ }
+
+ if (node) {
+ args = 'gangliastart;' + node;
+ } else {
+ args = 'gangliastart';
+ }
+
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'webrun',
+ tgt : '',
+ args : args,
+ msg : ''
+ },
+
+ success : function(data) {
+ // Remove any warnings
+ $('#gangliamon').find('.ui-state-error').remove();
+ }
+ });
+ } else {
+ if (node) {
+ args = 'gangliastop;' + node;
+ } else {
+ args = 'gangliastop';
+ }
+
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'webrun',
+ tgt : '',
+ args : args,
+ msg : ''
+ },
+
+ success : function(data) {
+ // Do nothing
+ }
+ });
+ }
}
\ No newline at end of file
diff --git a/xCAT-UI/js/monitor/monitor.js b/xCAT-UI/js/monitor/monitor.js
index 91e92123c..72cd30799 100644
--- a/xCAT-UI/js/monitor/monitor.js
+++ b/xCAT-UI/js/monitor/monitor.js
@@ -57,26 +57,25 @@ function loadMonitorPage() {
var monitorInfoBar = createInfoBar('Select the Monitor Tool');
monitorForm.append(monitorInfoBar);
+ // Create a list of monitoring tools
var monitorList = $('