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. '); - $('#gangLink').append('please click here to open the Ganglia\'s main page'); - $('#gangLink a').click(function(){ - window.open('../ganglia/'); - }); -} - -function gangRpmCheck(data){ - var rpmStatus = data.rsp.split(/\n/); - var stopFlag = false; - var showString = ""; - var tempArray = ["rrdtool", "ganglia-gmetad", "ganglia-gmond", "ganglia-web"]; - - for (var temp in rpmStatus){ - if(-1 != rpmStatus[temp].indexOf("not")){ - stopFlag = true; - showString += "Please install " + tempArray[temp] + ".
"; - } - } - - if (stopFlag){ - showString += "

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 = $(''); + 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 = "
    1. 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.
    2. "; - - items += "
    3. 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.
    4. "; - items += "
    5. Ganglia Monitor : Ganglia is a scalable distributed " + - "monitoring system for high-performance computing systems such as clusters and Grids.
    6. "; + var items = "
    7. 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.
    8. "; + items += "
    9. 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.
    10. "; + items += "
    11. Ganglia Monitor : Ganglia is a scalable distributed " + + "monitoring system for high-performance computing systems such as clusters and Grids.
    12. "; items += "
    13. PCP Monitor :
    14. "; - 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 = $('
    15. ipmi
    16. '); var blade = $('
    17. blade
    18. '); var hmc = $('
    19. hmc
    20. '); @@ -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