git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@9468 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			410 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			410 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * Global variables
 | 
						|
 */
 | 
						|
var gangliaTableId = 'nodesDatatable';
 | 
						|
var gangliaData;
 | 
						|
 | 
						|
/**
 | 
						|
 * 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',
 | 
						|
		data : {
 | 
						|
			cmd : 'rpm -q rrdtool ganglia-gmetad ganglia-gmond ganglia-web'
 | 
						|
		},
 | 
						|
 | 
						|
		success : checkGangliaRPMs
 | 
						|
	});
 | 
						|
 | 
						|
	// Create groups and nodes DIV
 | 
						|
	var groups = $('<div id="groups"></div>');
 | 
						|
	var nodes = $('<div id="nodes"></div>');
 | 
						|
	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 <a href='http://xcat.svn.sourceforge.net/viewvc/xcat/xcat-core/trunk/xCAT-client/share/doc/xCAT2-Monitoring.pdf'>xCAT2-Monitoring.pdf</a> for more information.";
 | 
						|
 | 
						|
		var warningBar = createWarnBar(warningMsg);
 | 
						|
		warningBar.css('margin-bottom', '10px');
 | 
						|
		warningBar.prependTo(gangliaTab);
 | 
						|
	} else {
 | 
						|
		// Check if ganglia is running on the xCAT MN
 | 
						|
		$.ajax( {
 | 
						|
			url : 'lib/cmd.php',
 | 
						|
			dataType : 'json',
 | 
						|
			data : {
 | 
						|
				cmd : 'monls',
 | 
						|
				tgt : '',
 | 
						|
				args : 'gangliamon',
 | 
						|
				msg : ''
 | 
						|
			},
 | 
						|
 | 
						|
			/**
 | 
						|
			 * 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 = $('<a href="#">Click here</a>');
 | 
						|
					startLnk.css( {
 | 
						|
						'color' : 'blue',
 | 
						|
						'text-decoration' : 'none'
 | 
						|
					});
 | 
						|
					startLnk.click(function() {
 | 
						|
						// Turn on Ganglia for all nodes
 | 
						|
						monitorNode('', 'on');
 | 
						|
					});
 | 
						|
		
 | 
						|
					// Create warning bar
 | 
						|
					var warningBar = $('<div class="ui-state-error ui-corner-all"></div>');
 | 
						|
					var msg = $('<p></p>');
 | 
						|
					msg.append('<span class="ui-icon ui-icon-alert"></span>');
 | 
						|
					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);
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		});
 | 
						|
	}
 | 
						|
	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 = $('<ul></ul>');
 | 
						|
	var item = $('<li id="root"><h3>Groups</h3></li>');
 | 
						|
	ul.append(item);
 | 
						|
	var subUL = $('<ul></ul>');
 | 
						|
	item.append(subUL);
 | 
						|
 | 
						|
	// Create a link for each group
 | 
						|
	for ( var i = groups.length; i--;) {
 | 
						|
		var subItem = $('<li id="' + groups[i] + '"></li>');
 | 
						|
		var link = $('<a>' + groups[i] + '</a>');
 | 
						|
		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 onclick
 | 
						|
	$('#groups').bind('select_node.jstree', function(event, data) {
 | 
						|
			// If there are subgroups, remove them
 | 
						|
			data.rslt.obj.children('ul').remove();
 | 
						|
			var thisGroup = jQuery.trim(data.rslt.obj.text());
 | 
						|
			if (thisGroup) {
 | 
						|
				// Clear nodes division
 | 
						|
			$('#nodes').children().remove();
 | 
						|
 | 
						|
			// Create link to Ganglia
 | 
						|
			var gangliaLnk = $('<a href="#">Click here</a>');
 | 
						|
			gangliaLnk.css( {
 | 
						|
				'color' : 'blue',
 | 
						|
				'text-decoration' : 'none'
 | 
						|
			});
 | 
						|
			gangliaLnk.click(function() {
 | 
						|
				// Open a new window for Ganglia
 | 
						|
				window.open('../ganglia/');
 | 
						|
			});
 | 
						|
 | 
						|
			// Create info bar
 | 
						|
			var info = $('<div class="ui-state-highlight ui-corner-all"></div>');
 | 
						|
			info.append('<span class="ui-icon ui-icon-info" style="display: inline-block; margin: 10px 5px;"></span>');
 | 
						|
			var msg = $('<p style="display: inline-block; width: 95%;"></p>');
 | 
						|
			msg.append('Below is a summary of nodes within the selected group. ');
 | 
						|
			msg.append(gangliaLnk);
 | 
						|
			msg.append(' to open the Ganglia page.');
 | 
						|
			info.append(msg);
 | 
						|
			info.css('margin-bottom', '10px');
 | 
						|
			$('#nodes').append(info);
 | 
						|
 | 
						|
			// Create loader
 | 
						|
			var loader = $('<center></center>').append(createLoader());
 | 
						|
			$('#nodes').append(loader);
 | 
						|
 | 
						|
			// To improve performance, get all nodes within selected group
 | 
						|
			// Get node definitions only for first 50 nodes
 | 
						|
			$.ajax( {
 | 
						|
				url : 'lib/cmd.php',
 | 
						|
				dataType : 'json',
 | 
						|
				data : {
 | 
						|
					cmd : 'nodels',
 | 
						|
					tgt : thisGroup,
 | 
						|
					args : '',
 | 
						|
					msg : thisGroup
 | 
						|
				},
 | 
						|
 | 
						|
				/**
 | 
						|
				 * Get node definitions
 | 
						|
				 * 
 | 
						|
				 * @param data
 | 
						|
				 *            Data returned from HTTP request
 | 
						|
				 * @return Nothing
 | 
						|
				 */
 | 
						|
				success : function(data) {
 | 
						|
					var group = data.msg;
 | 
						|
										
 | 
						|
					// Get nodes definitions
 | 
						|
					$.ajax( {
 | 
						|
						url : 'lib/cmd.php',
 | 
						|
						dataType : 'json',
 | 
						|
						data : {
 | 
						|
							cmd : 'nodestat',
 | 
						|
							tgt : group,
 | 
						|
							args : '',
 | 
						|
							msg : group
 | 
						|
						},
 | 
						|
 | 
						|
						success : loadGangliaSummary
 | 
						|
					});
 | 
						|
				}
 | 
						|
			});
 | 
						|
						
 | 
						|
			// Get subgroups within selected group
 | 
						|
			// only when this is the parent group and not a subgroup
 | 
						|
			if (data.rslt.obj.attr('id').indexOf('Subgroup') < 0) {
 | 
						|
    			$.ajax( {
 | 
						|
    				url : 'lib/cmd.php',
 | 
						|
    				dataType : 'json',
 | 
						|
    				data : {
 | 
						|
    					cmd : 'extnoderange',
 | 
						|
    					tgt : thisGroup,
 | 
						|
    					args : 'subgroups',
 | 
						|
    					msg : thisGroup
 | 
						|
    				},
 | 
						|
    
 | 
						|
    				success : loadSubgroups
 | 
						|
    			});
 | 
						|
			}
 | 
						|
		} // End of if (thisGroup)
 | 
						|
	});
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Load Ganglia summary page
 | 
						|
 * 
 | 
						|
 * @param data
 | 
						|
 *            Data returned from HTTP request
 | 
						|
 * @return Nothing
 | 
						|
 */
 | 
						|
function loadGangliaSummary(data) {	
 | 
						|
	// Data returned
 | 
						|
	var rsp = data.rsp;
 | 
						|
	// Group name
 | 
						|
	var group = data.msg;
 | 
						|
	// Node attributes hash
 | 
						|
	var attrs = new Object();
 | 
						|
	
 | 
						|
	var node, status, args;
 | 
						|
	for ( var i in rsp) {
 | 
						|
		// Get key and value
 | 
						|
		args = rsp[i].split(':', 2);
 | 
						|
		node = jQuery.trim(args[0]);
 | 
						|
		status = jQuery.trim(args[1]);
 | 
						|
		
 | 
						|
		// Create a hash table
 | 
						|
		attrs[node] = new Object();
 | 
						|
		attrs[node]['status'] = status;		
 | 
						|
	}
 | 
						|
	
 | 
						|
	// Save node attributes hash
 | 
						|
	gangliaData = attrs;
 | 
						|
	
 | 
						|
	// Get the status of Ganglia
 | 
						|
	// Then create pie chart for node and Ganglia status
 | 
						|
	$.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) {
 | 
						|
	// Remove loader
 | 
						|
	$('#nodes').find('img').remove();
 | 
						|
	
 | 
						|
	// Get datatable
 | 
						|
	var ganglia = data.rsp;
 | 
						|
	var node, ping, monitored;
 | 
						|
 | 
						|
	// Count nodes that are pingable and not pingable
 | 
						|
	// and nodes that are pingable and monitored by Ganglia
 | 
						|
	var pingWGanglia = 0;
 | 
						|
	var pingWOGanglia = 0;
 | 
						|
	var noping = 0;
 | 
						|
	for ( var i in ganglia) {
 | 
						|
		// ganglia[0] = nodeName and ganglia[1] = state
 | 
						|
		node = jQuery.trim(ganglia[i][0]);
 | 
						|
		monitored = jQuery.trim(ganglia[i][1]);
 | 
						|
		ping = gangliaData[node]['status'];
 | 
						|
		
 | 
						|
		// If the node is monitored, increment count
 | 
						|
		if (ping == 'sshd' && monitored == 'on') {
 | 
						|
			pingWGanglia++;
 | 
						|
		} else if (ping == 'sshd' && monitored == 'off') {
 | 
						|
			pingWOGanglia++;
 | 
						|
		} else {
 | 
						|
			noping++;
 | 
						|
		}
 | 
						|
	}
 | 
						|
		
 | 
						|
	// Create pie chart
 | 
						|
	var summary = $('<div id="ganglia_sum"></div>');
 | 
						|
	$('#nodes').append(summary);
 | 
						|
	
 | 
						|
	// Create pie details
 | 
						|
	var details = $('<div id="ganglia_details"></div>');
 | 
						|
	$('#nodes').append(details);
 | 
						|
		
 | 
						|
	var pie = [['Ping & monitored', pingWGanglia], ['Ping & not monitored', pingWOGanglia], ['Noping', noping]];
 | 
						|
	var chart = $.jqplot('ganglia_sum', [ pie ], {
 | 
						|
		seriesDefaults : {
 | 
						|
			renderer : $.jqplot.PieRenderer
 | 
						|
		},
 | 
						|
		seriesColors : [
 | 
						|
			'#3CB548', '#FE9A2E', '#848484' // Green, orange, grey
 | 
						|
		],
 | 
						|
		legend : {
 | 
						|
			show : true
 | 
						|
		},
 | 
						|
		grid : {
 | 
						|
			background : 'transparent',
 | 
						|
			borderColor : 'white',
 | 
						|
			borderWidth : '0px',
 | 
						|
			shadow : false
 | 
						|
		},
 | 
						|
		show : true
 | 
						|
	});
 | 
						|
	
 | 
						|
	// Change CSS styling for legend
 | 
						|
	summary.find('table').css({
 | 
						|
		'border-style': 'none'
 | 
						|
	}).find('td').css({
 | 
						|
		'border-style': 'none'
 | 
						|
	});
 | 
						|
	
 | 
						|
	// Show details on mouse-over
 | 
						|
	$('#ganglia_sum').bind('jqplotDataMouseOver', function(env, srIndex, ptIndex, data) {
 | 
						|
		// Show for 8 seconds before sliding up
 | 
						|
		$('#ganglia_details').children().remove();
 | 
						|
		$('#ganglia_details').show();
 | 
						|
		$('#ganglia_details').append($('<p>' + data[1] + ' node(s) ' + data[0] + '</p>'));
 | 
						|
		$('#ganglia_details').delay(8000).slideUp();
 | 
						|
	});
 | 
						|
	
 | 
						|
	// Open nodes page on-click
 | 
						|
	$('#ganglia_sum').bind('jqplotDataClick', function(env, srIndex, ptIndex, data) {
 | 
						|
		window.open('../xcat/index.php');
 | 
						|
	});
 | 
						|
	
 | 
						|
	// Special note
 | 
						|
	// To redraw pie chart: 
 | 
						|
	//     - Use chart.series[0].data[i] to reference existing data
 | 
						|
	//     - Use chart.redraw() to redraw chart
 | 
						|
} |