";
- $('#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 = $('
');
+ var item = $('
Groups
');
+ ul.append(item);
+ var subUL = $('
');
+ item.append(subUL);
+
+ // Create a link for each group
+ for ( var i = groups.length; i--;) {
+ var subItem = $('');
+ var link = $('' + groups[i] + '');
+
+ // Open node table onclick
+ link
+ .bind('click', function(event) {
+ var thisGroup = $(this).attr('id');
+ if (thisGroup) {
+ // Clear nodes division
+ $('#nodes').children().remove();
+
+ // Create link to Ganglia
+ var gangliaLnk = $('click here');
+ gangliaLnk.css( {
+ 'color' : 'blue',
+ 'text-decoration' : 'none'
+ });
+ gangliaLnk.click(function() {
+ // Open a new window for Ganglia
+ window.open('../ganglia/');
+ });
+
+ // Create info bar
+ var info = $('');
+ var msg = $('');
+ msg.append('');
+ msg
+ .append('Review the nodes that are monitored. If a node is not monitored, select it and click on Monitor. Once you are satisfied with the nodes that you want to monitor, ');
+ msg.append(gangliaLnk);
+ msg.append(' to open Ganglia page');
+ info.append(msg);
+ info.css('margin-bottom', '10px');
+ $('#nodes').append(info);
+
+ // Create loader
+ var loader = $('
').append(createLoader());
+
+ // Create a tab for this group
+ var tab = new Tab();
+ setNodesTab(tab);
+ tab.init();
+ $('#nodes').append(tab.object());
+ tab.add('nodesTab', 'Nodes', loader, false);
+
+ // Get nodes within selected group
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'lsdef',
+ tgt : '',
+ args : thisGroup,
+ msg : thisGroup
+ },
+
+ success : loadNodes4Ganglia
+ });
+ } // End of if (thisGroup)
+ } );
+ subItem.append(link);
+ subUL.append(subItem);
+ }
+
+ // Turn groups list into a tree
+ $('#groups').append(ul);
+ $('#groups').jstree( {
+ core : {
+ "initially_open" : [ "root" ]
+ },
+ themes : {
+ "theme" : "default",
+ "dots" : false, // No dots
+ "icons" : false // No icons
+ }
+ });
+}
+
+/**
+ * Load nodes belonging to a given group
+ *
+ * @param data
+ * Data returned from HTTP request
+ * @return Nothing
+ */
+function loadNodes4Ganglia(data) {
+ // Data returned
+ var rsp = data.rsp;
+ // Group name
+ var group = data.msg;
+ // Node attributes hash
+ var attrs = new Object();
+ // Node attributes
+ var headers = new Object();
+
+ var node;
+ var args;
+ for ( var i in rsp) {
+ // Get the node
+ var pos = rsp[i].indexOf('Object name:');
+ if (pos > -1) {
+ var temp = rsp[i].split(': ');
+ node = jQuery.trim(temp[1]);
+
+ // Create a hash for the node attributes
+ attrs[node] = new Object();
+ i++;
+ }
+
+ // Get key and value
+ args = rsp[i].split('=');
+ var key = jQuery.trim(args[0]);
+ var val = jQuery.trim(args[1]);
+
+ // Create a hash table
+ attrs[node][key] = val;
+ headers[key] = 1;
+ }
+
+ // Sort headers
+ var sorted = new Array();
+ for ( var key in headers) {
+ sorted.push(key);
+ }
+ sorted.sort();
+
+ // Add column for check box, node, ping, and power
+ sorted.unshift('', 'node', 'ping',
+ '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 = $('');
- var items = "
xCAT Monitor : xcatmon provides node status " +
- "monitoring using fping on AIX and nmap on Linux. It also provides application " +
- "status monitoring. The status and the appstatus columns of the nodelist table " +
- "will be updated periodically with the latest status values for the nodes.
";
-
- items += "
RMC Monitor : IBM's Resource Monitoring and Control (RMC) " +
- "subsystem is our recommended software for monitoring xCAT clusters. It's is part " +
- "of the IBM's Reliable Scalable Cluster Technology (RSCT) that provides a comprehensive " +
- "clustering environment for AIX and LINUX.
";
- items += "
Ganglia Monitor : Ganglia is a scalable distributed " +
- "monitoring system for high-performance computing systems such as clusters and Grids.
";
+ var items = "
xCAT Monitor : xcatmon provides node status "
+ + "monitoring using fping on AIX and nmap on Linux. It also provides application "
+ + "status monitoring. The status and the appstatus columns of the nodelist table "
+ + "will be updated periodically with the latest status values for the nodes.
";
+ items += "
RMC Monitor : IBM's Resource Monitoring and Control (RMC) "
+ + "subsystem is our recommended software for monitoring xCAT clusters. It's is part "
+ + "of the IBM's Reliable Scalable Cluster Technology (RSCT) that provides a comprehensive " + "clustering environment for AIX and LINUX.
";
+ items += "
Ganglia Monitor : Ganglia is a scalable distributed "
+ + "monitoring system for high-performance computing systems such as clusters and Grids.
";
-
monitorList.append(items);
-
- $('a', monitorList).click(function(){
+
+ // Open new tab for monitor tool
+ $('a', monitorList).click(function() {
loadMonitorTab($(this).attr('name'));
});
-
+
monitorForm.append(monitorList);
tab.add('monitorTab', 'Monitor', monitorForm, false);
@@ -90,7 +89,7 @@ function loadMonitorPage() {
resrcForm.append(resrcInfoBar);
// Create radio buttons for platforms
- var hwList =$('Select a platform to view its current resources:');
+ var hwList = $('Select a platform to view its current resources:');
var ipmi = $('
ipmi
');
var blade = $('
blade
');
var hmc = $('
hmc
');
@@ -105,7 +104,7 @@ function loadMonitorPage() {
hwList.append(fsp);
hwList.append(zvm);
resrcForm.append(hwList);
-
+
/**
* Ok
*/
@@ -123,27 +122,27 @@ function loadMonitorPage() {
// Create an instance of the plugin
var plugin;
- switch(hw) {
- case "blade":
- plugin = new bladePlugin();
- break;
- case "fsp":
- plugin = new fspPlugin();
- break;
- case "hmc":
- plugin = new hmcPlugin();
- break;
- case "ipmi":
- plugin = new ipmiPlugin();
- break;
- case "ivm":
- plugin = new ivmPlugin();
- break;
- case "zvm":
- plugin = new zvmPlugin();
- break;
+ switch (hw) {
+ case "blade":
+ plugin = new bladePlugin();
+ break;
+ case "fsp":
+ plugin = new fspPlugin();
+ break;
+ case "hmc":
+ plugin = new hmcPlugin();
+ break;
+ case "ipmi":
+ plugin = new ipmiPlugin();
+ break;
+ case "ivm":
+ plugin = new ivmPlugin();
+ break;
+ case "zvm":
+ plugin = new zvmPlugin();
+ break;
}
-
+
plugin.loadResources();
}
@@ -155,38 +154,53 @@ function loadMonitorPage() {
tab.add('resourceTab', 'Resources', resrcForm, false);
}
-function loadMonitorTab(monitorName){
+/**
+ * Open a tab and load given monitoring tool
+ *
+ * @param monitorName
+ * Name of monitoring tool
+ * @return Nothing
+ */
+function loadMonitorTab(monitorName) {
// If the tab exist, then we only need to select it
var tab = getMonitorTab();
- if (0 != $("#" + monitorName).length){
+ if ($("#" + monitorName).length) {
tab.select(monitorName);
return;
}
-
- switch(monitorName){
- case 'xcatmon':
- tab.add(monitorName, 'xCAT Monitor', '', true);
- loadXcatMon();
- break;
- case 'rmcmon':
- tab.add(monitorName, 'RMC Monitor', '', true);
- loadRmcMon();
- break;
- case 'gangliamon':
- tab.add(monitorName, 'Ganglia Monitor', '', true);
- loadGangliaMon();
- break;
- case 'pcpmon':
- loadUnfinish(monitorName, tab);
- break;
+
+ switch (monitorName) {
+ case 'xcatmon':
+ tab.add(monitorName, 'xCAT', '', true);
+ loadXcatMon();
+ break;
+ case 'rmcmon':
+ tab.add(monitorName, 'RMC', '', true);
+ loadRmcMon();
+ break;
+ case 'gangliamon':
+ tab.add(monitorName, 'Ganglia', '', true);
+ loadGangliaMon();
+ break;
+ case 'pcpmon':
+ loadUnfinish(monitorName, tab);
+ break;
}
-
+
tab.select(monitorName);
}
-function loadUnfinish(monitorName, tab){
+/**
+ * Open a tab and show 'Under contruction'
+ *
+ * @param monitorName
+ * Name of monitoring tool
+ * @param tab
+ * Tab area
+ * @return Nothing
+ */
+function loadUnfinish(monitorName, tab) {
var unfinishPage = $('');
- unfinishPage.append(createInfoBar('under construction.'));
-
- tab.add(monitorName, 'unfinish', unfinishPage, true);
+ unfinishPage.append(createInfoBar('Under construction'));
+ tab.add(monitorName, 'Unfinish', unfinishPage, true);
}
\ No newline at end of file
diff --git a/xCAT-UI/js/monitor/rmcmon.js b/xCAT-UI/js/monitor/rmcmon.js
index 4c0bf05c7..d6e83237a 100644
--- a/xCAT-UI/js/monitor/rmcmon.js
+++ b/xCAT-UI/js/monitor/rmcmon.js
@@ -117,7 +117,7 @@ function rsctRpmCheck(data){
if (-1 != data.rsp.indexOf("not")){
$('#rmcMonStatus').empty().append(
'Please install the RSCT first. ' +
- 'You can find more support form xCAT2-Monitoring.pdf');
+ 'You can find more support from xCAT2-Monitoring.pdf');
}
else{
xcatrmcRpmCheck();
diff --git a/xCAT-UI/lib/cmd.php b/xCAT-UI/lib/cmd.php
index 6796c0126..78658348a 100644
--- a/xCAT-UI/lib/cmd.php
+++ b/xCAT-UI/lib/cmd.php
@@ -47,8 +47,8 @@ if (isset($_GET["cmd"])) {
$xml = docmd($cmd, $tgt, $arr);
$rsp = array();
- // webrun pping output needs special handling
- if(strncasecmp($cmd, "webrun", 6) == 0 && stristr($args, "pping")) {
+ // webrun pping and gangliastatus output needs special handling
+ if(strncasecmp($cmd, "webrun", 6) == 0 && (stristr($args, "pping") || stristr($args, "gangliastatus"))) {
$rsp = extractWebrun($xml);
}
// nodels output needs special handling
@@ -105,8 +105,9 @@ function extractWebrun($xml) {
foreach($nodes->children() as $node){
// Get the node name
$name = $node->name;
+
// Get the content
- $status = $node->data->contents;
+ $status = $node->data;
$status = str_replace(":|:", "\n", $status);
// Add to return array