mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-04 05:12:30 +00:00 
			
		
		
		
	add graphical layout code
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@8028 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		@@ -17,7 +17,6 @@
 | 
			
		||||
	background-color: #000;
 | 
			
		||||
	border: 1px solid #fff;
 | 
			
		||||
	padding: 10px 15px;
 | 
			
		||||
	width: 200px;
 | 
			
		||||
	display: none;
 | 
			
		||||
	color: #fff;
 | 
			
		||||
	text-align: left;
 | 
			
		||||
@@ -27,6 +26,9 @@
 | 
			
		||||
	-webkit-box-shadow: 0 0 10px #000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.tooltip h3 {
 | 
			
		||||
	margin : 0px;
 | 
			
		||||
}
 | 
			
		||||
/****************** Header ******************/
 | 
			
		||||
#header {
 | 
			
		||||
	height: 40px;
 | 
			
		||||
@@ -95,6 +97,14 @@
 | 
			
		||||
	color: #FF0000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#layoutselector{
 | 
			
		||||
	padding: 2px 10px 0px 2px; /* Top right left bottom*/
 | 
			
		||||
	text-align: right;
 | 
			
		||||
	color: #FFC125;
 | 
			
		||||
	text-decoration: none;
 | 
			
		||||
	display: block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************** Content section ******************/
 | 
			
		||||
body {
 | 
			
		||||
	background-color: #1C1C1C;
 | 
			
		||||
@@ -152,6 +162,82 @@ body {
 | 
			
		||||
	display: inline-table;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************** physical layout section ******************/
 | 
			
		||||
.physicaltree {
 | 
			
		||||
	width: 200px;
 | 
			
		||||
	vertical-align: top;
 | 
			
		||||
	float: left;
 | 
			
		||||
	position: relative;
 | 
			
		||||
	margin: 15px 0px 15px 15px;
 | 
			
		||||
	overflow: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.physicalview{
 | 
			
		||||
	width : 700px;
 | 
			
		||||
	display : inline-table;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.frameDiv{
 | 
			
		||||
	width : 179px;
 | 
			
		||||
	height : 500px;
 | 
			
		||||
	font-size: 10px;
 | 
			
		||||
	background :url(../images/bpa.jpg);
 | 
			
		||||
	border-width:2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.fspDiv2{
 | 
			
		||||
	margin: 0px 12px 2px 17px; 
 | 
			
		||||
	font-size: 12px; 
 | 
			
		||||
	height: 20px;
 | 
			
		||||
	line-height : 20px;
 | 
			
		||||
	width : 140px;
 | 
			
		||||
	text-align: center;
 | 
			
		||||
	background:url(../images/4ufsp.jpg);
 | 
			
		||||
	border-style:solid;
 | 
			
		||||
	border-width:1px;
 | 
			
		||||
	cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.fspDiv4{
 | 
			
		||||
	margin: 0px 12px 2px 17px; 
 | 
			
		||||
	font-size: 12px; 
 | 
			
		||||
	height: 44px;
 | 
			
		||||
	line-height : 44px;
 | 
			
		||||
	width : 140px;
 | 
			
		||||
	text-align: center;
 | 
			
		||||
	background:url(../images/4ufsp.jpg);
 | 
			
		||||
	border-style:solid;
 | 
			
		||||
	border-width:1px;
 | 
			
		||||
	cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.fspDiv42{
 | 
			
		||||
	width : 179px;
 | 
			
		||||
	height : 500px;
 | 
			
		||||
	font-size: 15px;
 | 
			
		||||
	background :url(../images/42ufsp.jpg);
 | 
			
		||||
	border-width:2px;
 | 
			
		||||
	cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.lparDiv{
 | 
			
		||||
	margin: 5px 0px 0px 9px;
 | 
			
		||||
	width : 80px;
 | 
			
		||||
	height : 10px;
 | 
			
		||||
	opacity: 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.lparStatus{
 | 
			
		||||
	width : 5px;
 | 
			
		||||
	height : 5px;
 | 
			
		||||
	padding: 0px;
 | 
			
		||||
	border-width: 1px;
 | 
			
		||||
	border-color: transparent;
 | 
			
		||||
	border-style: solid;
 | 
			
		||||
	font-size:1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************** Info/warning bar ******************/
 | 
			
		||||
span.ui-icon-info {
 | 
			
		||||
	float: left;
 | 
			
		||||
@@ -237,7 +323,7 @@ span.ui-icon-info {
 | 
			
		||||
	cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.tab fieldset {
 | 
			
		||||
fieldset {
 | 
			
		||||
	margin-bottom: 5px;
 | 
			
		||||
	border-width: 1px 0 0 0;
 | 
			
		||||
	border-style: solid none none none;
 | 
			
		||||
@@ -252,7 +338,7 @@ span.ui-icon-info {
 | 
			
		||||
	width: 140px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.tab legend {
 | 
			
		||||
legend {
 | 
			
		||||
	font: 12px verdana, arial, helvetica, sans-serif;
 | 
			
		||||
	color: #424242;
 | 
			
		||||
	font-weight: bold;
 | 
			
		||||
@@ -264,12 +350,6 @@ span.ui-icon-info {
 | 
			
		||||
	padding: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.tab li {
 | 
			
		||||
	list-style: none;
 | 
			
		||||
	padding: 5px;
 | 
			
		||||
	margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.tab textarea {
 | 
			
		||||
	font: 12px verdana, arial, helvetica, sans-serif;
 | 
			
		||||
	border: solid 0px #BDBDBD;
 | 
			
		||||
@@ -298,6 +378,11 @@ span.ui-icon-info {
 | 
			
		||||
	cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.actionBar li {
 | 
			
		||||
	list-style: none;
 | 
			
		||||
	padding: 5px;
 | 
			
		||||
	margin: 0;
 | 
			
		||||
}
 | 
			
		||||
/****************** Status bar ******************/
 | 
			
		||||
.statusBar {
 | 
			
		||||
	border: solid 1px #F5D0A9;
 | 
			
		||||
 
 | 
			
		||||
@@ -54,11 +54,36 @@ function setNodesDataTable(table) {
 | 
			
		||||
function loadNodesPage() {
 | 
			
		||||
	// If groups are not already loaded
 | 
			
		||||
	if (!$('#groups').length) {
 | 
			
		||||
		
 | 
			
		||||
		var layoutSelectorDiv = $('<div id="layoutselector"></div>');
 | 
			
		||||
		var logicalLayoutDiv = $('<div id="logicalLayout"></div>');
 | 
			
		||||
		var physicalLayoutDiv = $('<div id="physicalLayout"></div>');
 | 
			
		||||
		physicalLayoutDiv.hide();
 | 
			
		||||
		
 | 
			
		||||
		$('#content').append(layoutSelectorDiv);
 | 
			
		||||
		$('#content').append(logicalLayoutDiv);
 | 
			
		||||
		$('#content').append(physicalLayoutDiv);
 | 
			
		||||
		// Create layout selector
 | 
			
		||||
		var groupRadio = $('<input type="radio" name="layoutselector" checked="checked">Group</input>');
 | 
			
		||||
		groupRadio.bind('click',function(){
 | 
			
		||||
			$('#physicalLayout').hide();
 | 
			
		||||
			$('#logicalLayout').show();
 | 
			
		||||
		});
 | 
			
		||||
		
 | 
			
		||||
		var physicalRadio = $('<input type="radio" name="layoutselector">Graphical</input>');
 | 
			
		||||
		physicalRadio.bind('click', function(){
 | 
			
		||||
			$('#logicalLayout').hide();
 | 
			
		||||
			$('#physicalLayout').show();
 | 
			
		||||
		});
 | 
			
		||||
		layoutSelectorDiv.append('<label>Layout:</label>');
 | 
			
		||||
		layoutSelectorDiv.append(groupRadio);
 | 
			
		||||
		layoutSelectorDiv.append(physicalRadio);
 | 
			
		||||
		
 | 
			
		||||
		// Create a groups division
 | 
			
		||||
		groupDIV = $('<div id="groups"></div>');
 | 
			
		||||
		nodesDIV = $('<div id="nodes"></div>');
 | 
			
		||||
		$('#content').append(groupDIV);
 | 
			
		||||
		$('#content').append(nodesDIV);
 | 
			
		||||
		logicalLayoutDiv.append(groupDIV);
 | 
			
		||||
		logicalLayoutDiv.append(nodesDIV);
 | 
			
		||||
 | 
			
		||||
		// Create loader
 | 
			
		||||
		var loader = createLoader();
 | 
			
		||||
@@ -81,6 +106,21 @@ function loadNodesPage() {
 | 
			
		||||
 | 
			
		||||
			success : loadGroups
 | 
			
		||||
		});
 | 
			
		||||
		
 | 
			
		||||
		$.ajax( {
 | 
			
		||||
			url : 'lib/cmd.php',
 | 
			
		||||
			dataType : 'json',
 | 
			
		||||
			data : {
 | 
			
		||||
				cmd : 'nodels',
 | 
			
		||||
				tgt : 'all',
 | 
			
		||||
				args : 'nodetype.nodetype;ppc.parent;vpd.mtm;nodelist.status',
 | 
			
		||||
				msg : ''
 | 
			
		||||
			},
 | 
			
		||||
 | 
			
		||||
			success : function(data){
 | 
			
		||||
				createPhysicalLayout(data, $('#physicalLayout'));
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										711
									
								
								xCAT-UI/js/nodes/physical.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										711
									
								
								xCAT-UI/js/nodes/physical.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,711 @@
 | 
			
		||||
var hardwareInfo = {
 | 
			
		||||
		'7037-A50' : ['P5-185',  '5' ],
 | 
			
		||||
		'9115-505' : ['P5-505',  '1' ],
 | 
			
		||||
		'9110-510' : ['P5-510',  '2' ],
 | 
			
		||||
		'9110-51A' : ['P5-510',  '2' ],
 | 
			
		||||
		'9111-520' : ['P5-520',  '4' ],
 | 
			
		||||
		'913A-52A' : ['P5-52A',  '4' ],
 | 
			
		||||
		'9113-550' : ['P5-550',  '4' ],
 | 
			
		||||
		'9133-55A' : ['P5-55A',  '4' ],
 | 
			
		||||
		'9116-561' : ['P5-560Q', '4' ],
 | 
			
		||||
		'9117-570' : ['P5-570',  '4' ],
 | 
			
		||||
		'9118-575' : ['P5-575',  '42'],
 | 
			
		||||
		'9119-590' : ['P5-590',  '42'],
 | 
			
		||||
		'9119-595' : ['P5-595',  '42'],
 | 
			
		||||
 | 
			
		||||
		//P6
 | 
			
		||||
		'8203-E4A' : ['P6-520',  '4' ],
 | 
			
		||||
		'9407-M15' : ['P6-520',  '4' ],
 | 
			
		||||
		'9408-M25' : ['P6-520',  '4' ],
 | 
			
		||||
		'8204-E8A' : ['P6-550',  '4' ],
 | 
			
		||||
		'9409-M50' : ['P6-550',  '4' ],
 | 
			
		||||
		'8234-EMA' : ['P6-560',  '4' ],
 | 
			
		||||
		'9117-MMA' : ['P6-570',  '4' ],
 | 
			
		||||
		'9125-F2A' : ['P6-575',  '42'],
 | 
			
		||||
		'9119-FHA' : ['P6-595',  '42'],
 | 
			
		||||
 | 
			
		||||
		//P7
 | 
			
		||||
		'8202-E4B' : ['P7-720',  '4' ],
 | 
			
		||||
		'8205-E6B' : ['P7-740',  '4' ],
 | 
			
		||||
		'8231-E2B' : ['P7-710/730',  '2' ],
 | 
			
		||||
		'8233-E8B' : ['P7-750',  '4' ],
 | 
			
		||||
		'8236-E8C' : ['P7-755',  '4' ],
 | 
			
		||||
		'9117-MMB' : ['P7-770',  '4' ],
 | 
			
		||||
		'9119-FHB' : ['P7-795',  '42'],
 | 
			
		||||
		'9179-MHB' : ['P7-780',  '42']
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var bpaList;
 | 
			
		||||
var fspList;
 | 
			
		||||
var lparList;
 | 
			
		||||
var selectLpar = new Object();
 | 
			
		||||
/**
 | 
			
		||||
 * Get all nodes' nodetype and parent, and create the physical layout div
 | 
			
		||||
 * 
 | 
			
		||||
 * @param data: the response from xcat command "nodels all nodetype.nodetype ppc.parent ..." 
 | 
			
		||||
 *        area: the element to append tree and graphical layout
 | 
			
		||||
 * @return
 | 
			
		||||
 */
 | 
			
		||||
function createPhysicalLayout(data, area){
 | 
			
		||||
	var nodes = data.rsp;
 | 
			
		||||
	var tempList = new Object();
 | 
			
		||||
	bpaList = new Object();
 | 
			
		||||
	fspList = new Object();
 | 
			
		||||
	lparList = new Object();
 | 
			
		||||
	
 | 
			
		||||
	//extract useful info into tempList
 | 
			
		||||
	for (var i = 0; i < nodes.length; i++){
 | 
			
		||||
		var nodeName = nodes[i][0];
 | 
			
		||||
		if (undefined == tempList[nodeName]){
 | 
			
		||||
			tempList[nodeName] = new Object();
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		switch(nodes[i][2]){
 | 
			
		||||
			case 'nodetype.nodetype': {
 | 
			
		||||
				tempList[nodeName]['type'] = nodes[i][1];
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
			case 'ppc.parent' : {
 | 
			
		||||
				tempList[nodeName]['parent'] = nodes[i][1];
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
			case 'nodelist.status': {
 | 
			
		||||
				tempList[nodeName]['status'] = nodes[i][1];
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
			case 'vpd.mtm': {
 | 
			
		||||
				tempList[nodeName]['mtm'] = nodes[i][1];
 | 
			
		||||
			}
 | 
			
		||||
			default :
 | 
			
		||||
				break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	for (var nodeName in tempList){
 | 
			
		||||
		var parentName = tempList[nodeName]['parent'];
 | 
			
		||||
		var mtm = tempList[nodeName]['mtm'];
 | 
			
		||||
		var status = tempList[nodeName]['status'];
 | 
			
		||||
		switch(tempList[nodeName]['type']){
 | 
			
		||||
			case 'bpa': {
 | 
			
		||||
				if (undefined == bpaList[nodeName]){
 | 
			
		||||
					bpaList[nodeName] = new Array();
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
			case 'lpar,osi': {
 | 
			
		||||
				if ('' == parentName){
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				if (undefined == fspList[parentName]){
 | 
			
		||||
					fspList[parentName] = new Array();
 | 
			
		||||
					//default is 4 units. so i select a 4u mtm randomly
 | 
			
		||||
					fspList[parentName]['mtm'] = '8202-E4B';
 | 
			
		||||
					fspList[nodeName]['children'] = new Array();
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				fspList[parentName]['children'].push(nodeName);
 | 
			
		||||
				lparList[nodeName] = status;
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
			case 'fsp': {
 | 
			
		||||
				if (undefined == fspList[nodeName]){
 | 
			
		||||
					fspList[nodeName] = new Array();
 | 
			
		||||
					fspList[nodeName]['children'] = new Array();
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				fspList[nodeName]['mtm'] = mtm;
 | 
			
		||||
				
 | 
			
		||||
				if ('' == parentName){
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				if (undefined == bpaList[parentName]){
 | 
			
		||||
					bpaList[parentName] = new Array();
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				bpaList[parentName].push(nodeName);
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
			default:
 | 
			
		||||
				break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	createTree(bpaList, fspList, area);
 | 
			
		||||
	createGraphical(bpaList, fspList, area);
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * create the physical tree layout 
 | 
			
		||||
 * 
 | 
			
		||||
 * @param bpa : all bpa and there related  fsps
 | 
			
		||||
 *        fsp : all fsp and there related lpars
 | 
			
		||||
 *        area: the element to append tree layout
 | 
			
		||||
 * @return
 | 
			
		||||
 */
 | 
			
		||||
function createTree(bpa, fsp, area){
 | 
			
		||||
	//create tree and layout
 | 
			
		||||
	var usedFsp = new Object();
 | 
			
		||||
	var bpaList = '<ul>';
 | 
			
		||||
	for(var bpaName in bpa)
 | 
			
		||||
	{
 | 
			
		||||
		var fspList = '<ul>';
 | 
			
		||||
		for(var fspIndex in bpa[bpaName])
 | 
			
		||||
		{
 | 
			
		||||
			var fspName = bpa[bpaName][fspIndex];
 | 
			
		||||
			usedFsp[fspName] = 1;
 | 
			
		||||
			var lparList = '<ul>';
 | 
			
		||||
			for (var lparIndex in fsp[fspName]['children'])
 | 
			
		||||
			{
 | 
			
		||||
				lparList += '<li><ins> </ins>' + fsp[fspName]['children'][lparIndex] + '</li>';
 | 
			
		||||
			}
 | 
			
		||||
			lparList += '</ul>';
 | 
			
		||||
			fspList += '<li><a href="#">' + fspName + '(' + fsp[fspName]['children'].length + ' lpars)</a>' + lparList + '</li>';
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
		fspList += '</ul>';
 | 
			
		||||
		bpaList += '<li><a href="#">' + bpaName + '(' + bpa[bpaName].length + ' fsps)</a>' + fspList + '</li>';
 | 
			
		||||
	}
 | 
			
		||||
	bpaList += '</ul>';
 | 
			
		||||
	
 | 
			
		||||
	var cecList = '<ul>';
 | 
			
		||||
	for (var fspName in fsp)
 | 
			
		||||
	{
 | 
			
		||||
		if (usedFsp[fspName])
 | 
			
		||||
		{
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		var lparList = '<ul>';
 | 
			
		||||
		for (var lparIndex in fsp[fspName]['children'])
 | 
			
		||||
		{
 | 
			
		||||
			lparList += '<li><ins> </ins>' + fsp[fspName]['children'][lparIndex] + '</li>';
 | 
			
		||||
		}
 | 
			
		||||
		lparList += '</ul>';
 | 
			
		||||
		cecList += '<li><a href="#">' + fspName + '(' + fsp[fspName]['children'].length + ' lpars)</a>' + lparList + '</li>';
 | 
			
		||||
	}
 | 
			
		||||
	cecList += '</ul>';
 | 
			
		||||
	
 | 
			
		||||
	var tree_area = $('<div class="physicaltree"></div>');
 | 
			
		||||
	
 | 
			
		||||
	tree_area.append('<ul><li><a href="#">BPA</a>' + bpaList + '</li><li><a href="#">FSP</a>' + cecList + '</li></ul>');
 | 
			
		||||
	area.append(tree_area);
 | 
			
		||||
	tree_area.tree({});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * create the physical graphical layout 
 | 
			
		||||
 * 
 | 
			
		||||
 * @param bpa : all bpa and there related  fsps
 | 
			
		||||
 *        fsp : all fsp and there related lpars
 | 
			
		||||
 *        fspinfo : all fsps' hardwareinfo
 | 
			
		||||
 *        area: the element to append graphical layout
 | 
			
		||||
 * @return
 | 
			
		||||
 */
 | 
			
		||||
function createGraphical(bpa, fsp, area){
 | 
			
		||||
	var usedFsp = new Object();
 | 
			
		||||
	var graphField = $('<fieldset></fieldset>');
 | 
			
		||||
	graphField.append('<legend>Graphical Layout</legend>');
 | 
			
		||||
	var graphTable = $('<table id="graphTable"><tbody></tbody></table>');
 | 
			
		||||
	var elementNum = 0;
 | 
			
		||||
	var row;
 | 
			
		||||
	for (var bpaName in bpa){
 | 
			
		||||
		if (0 == elementNum % 3){
 | 
			
		||||
			row = $('<tr></tr>');
 | 
			
		||||
			graphTable.append(row);
 | 
			
		||||
		}
 | 
			
		||||
		elementNum ++;
 | 
			
		||||
		var td = $('<td></td>');
 | 
			
		||||
		var frameDiv = $('<div class="frameDiv"></div>');
 | 
			
		||||
		frameDiv.append('<div style="height:27px;">' + bpaName + '</div>');
 | 
			
		||||
		for (var fspIndex in bpa[bpaName]){
 | 
			
		||||
			var fspName = bpa[bpaName][fspIndex];
 | 
			
		||||
			usedFsp[fspName] = 1;
 | 
			
		||||
			
 | 
			
		||||
			frameDiv.append(createFspDiv(fspName, fsp[fspName]['mtm'], fsp));			
 | 
			
		||||
		}
 | 
			
		||||
		td.append(frameDiv);
 | 
			
		||||
		row.append(td);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//find the single fsp and sort descend by units 
 | 
			
		||||
	var singleFsp = new Array();
 | 
			
		||||
	for (var fspName in fsp){
 | 
			
		||||
		if (usedFsp[fspName])
 | 
			
		||||
		{
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		singleFsp.push([fspName, fsp[fspName]['mtm']]);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	singleFsp.sort(function(a, b){
 | 
			
		||||
		var unitNumA = 4;
 | 
			
		||||
		var unitNumB = 4;
 | 
			
		||||
		if (hardwareInfo[a[1]]){
 | 
			
		||||
			unitNumA = hardwareInfo[a[1]][1];
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if (hardwareInfo[b[1]]){
 | 
			
		||||
			unitNumB = hardwareInfo[b[1]][1];
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return (unitNumB - unitNumA);
 | 
			
		||||
	});
 | 
			
		||||
	
 | 
			
		||||
	elementNum = 0;
 | 
			
		||||
	for (var fspIndex in singleFsp){
 | 
			
		||||
		var fspName = singleFsp[fspIndex][0];
 | 
			
		||||
		if (0 == elementNum % 3){
 | 
			
		||||
			row = $('<tr></tr>');
 | 
			
		||||
			graphTable.append(row);
 | 
			
		||||
		}
 | 
			
		||||
		elementNum ++;
 | 
			
		||||
 | 
			
		||||
		var td = '<td style="vertical-align:top">' + createFspDiv(fspName, fsp[fspName]['mtm'], fsp) + '</td>';
 | 
			
		||||
		row.append(td);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	graphField.append(graphTable);
 | 
			
		||||
	
 | 
			
		||||
	var graphical_area = $('<div class="physicalview"></div>');
 | 
			
		||||
	var selectLparDiv = $('<div id="selectLparDiv" style="margin: 20px;"></div>');
 | 
			
		||||
	var temp = 0;
 | 
			
		||||
	for (var i in selectLpar){
 | 
			
		||||
		temp ++;
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//there is not selected lpars, show the info bar
 | 
			
		||||
	if (0 == temp){
 | 
			
		||||
		selectLparDiv.append(createInfoBar('Click CEC and select lpars to do operations.'));
 | 
			
		||||
	}
 | 
			
		||||
	//show selected lpars
 | 
			
		||||
	else{
 | 
			
		||||
		updateSelectLparDiv();
 | 
			
		||||
	}
 | 
			
		||||
	graphical_area.append(selectLparDiv);
 | 
			
		||||
	graphical_area.append(graphField);
 | 
			
		||||
	area.append(graphical_area);
 | 
			
		||||
	
 | 
			
		||||
	$('.fspDiv2, .fspDiv4, .fspDiv42').tooltip({
 | 
			
		||||
		showURL: false, 
 | 
			
		||||
		showBody: " - ", 
 | 
			
		||||
		fade: 250
 | 
			
		||||
	});
 | 
			
		||||
	
 | 
			
		||||
	$('.fspDiv2, .fspDiv4, .fspDiv42').bind('click', function(){
 | 
			
		||||
		var fspName = $(this).attr('value');
 | 
			
		||||
		showSelectDialog(fspList[fspName]['children']);
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * show the fsp's information in a dialog
 | 
			
		||||
 * 
 | 
			
		||||
 * @param fspName : fsp's name
 | 
			
		||||
 *        
 | 
			
		||||
 * @return
 | 
			
		||||
 */
 | 
			
		||||
function showSelectDialog(lpars){
 | 
			
		||||
	var diaDiv = $('<div class="tab" title=Select Lpars"></div>');
 | 
			
		||||
	
 | 
			
		||||
	if (0 == lpars.length){
 | 
			
		||||
		diaDiv.append(createInfoBar('There is not any lpars defined.'));
 | 
			
		||||
	}
 | 
			
		||||
	else{
 | 
			
		||||
		//add the dialog content
 | 
			
		||||
		var selectTable = $('<table id="selectLparTable"><tbody></tbody></table>');
 | 
			
		||||
		selectTable.append('<tr><th><input type="checkbox" onclick="selectAllLpars($(this))"></input></th><th>Name</th><th>Status</th></tr>');
 | 
			
		||||
		for (var lparIndex in lpars){
 | 
			
		||||
			var row = $('<tr></tr>');
 | 
			
		||||
			var lparName = lpars[lparIndex];
 | 
			
		||||
			var color = statusMap(lparList[lparName]);
 | 
			
		||||
			
 | 
			
		||||
			if (selectLpar[lparName]){
 | 
			
		||||
				row.append('<td><input type="checkbox" checked="checked" id="' + lparName + '"></input></td>');
 | 
			
		||||
			}
 | 
			
		||||
			else{
 | 
			
		||||
				row.append('<td><input type="checkbox" id="' + lparName + '"></input></td>');
 | 
			
		||||
			}
 | 
			
		||||
			row.append('<td>' + lparName + '</td>');
 | 
			
		||||
			row.append('<td style="background-color:' + color + ';">' + lparList[lparName] + '</td>');
 | 
			
		||||
			selectTable.append(row);
 | 
			
		||||
		}
 | 
			
		||||
		diaDiv.append(selectTable);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	diaDiv.dialog({
 | 
			
		||||
		modal: true,
 | 
			
		||||
		width: 400,
 | 
			
		||||
		close: function(event, ui){
 | 
			
		||||
				$(this).remove();
 | 
			
		||||
		},
 | 
			
		||||
		buttons: {
 | 
			
		||||
			cancel : function(){
 | 
			
		||||
			 			$(this).dialog('close');
 | 
			
		||||
		 			 },
 | 
			
		||||
			ok : function(){
 | 
			
		||||
	 				$('#selectLparTable input[type=checkbox]').each(function(){
 | 
			
		||||
	 					var lparName = $(this).attr('id');
 | 
			
		||||
	 					if ('' == lparName){
 | 
			
		||||
	 						//continue
 | 
			
		||||
	 						return true;
 | 
			
		||||
	 					}
 | 
			
		||||
	 					if (true == $(this).attr('checked')){
 | 
			
		||||
	 						selectLpar[lparName] = 1;
 | 
			
		||||
	 						$('#graphTable #' + lparName).css('border-color', 'aqua');
 | 
			
		||||
	 					}
 | 
			
		||||
	 					else{
 | 
			
		||||
	 						delete selectLpar[lparName];
 | 
			
		||||
	 						$('#graphTable #' + lparName).css('border-color', 'transparent');
 | 
			
		||||
	 					}
 | 
			
		||||
	 				});
 | 
			
		||||
	 				updateSelectLparDiv();
 | 
			
		||||
			     	$(this).dialog('close');
 | 
			
		||||
				 }
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * update the lpars' background in cec, lpars area and  selectLpar
 | 
			
		||||
 * 
 | 
			
		||||
 * @param 
 | 
			
		||||
 * @return
 | 
			
		||||
 *
 | 
			
		||||
 **/
 | 
			
		||||
function updateSelectLparDiv(){
 | 
			
		||||
	var temp = 0;
 | 
			
		||||
	$('#selectLparDiv').empty();
 | 
			
		||||
	
 | 
			
		||||
	for (var LparName in selectLpar){
 | 
			
		||||
		temp ++;
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	if (0 == temp){
 | 
			
		||||
		$('#selectLparDiv').append(createInfoBar('Click CEC and select lpars to do operations.'));
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	temp =0;
 | 
			
		||||
	//add buttons
 | 
			
		||||
	var tempDiv = $('<div class="actionBar"></div>');
 | 
			
		||||
	tempDiv.append(createActionMenu());
 | 
			
		||||
	$('#selectLparDiv').append(tempDiv);
 | 
			
		||||
	$('#selectLparDiv').append('<br/>Lpars: ');
 | 
			
		||||
	for(var lparName in selectLpar){
 | 
			
		||||
		$('#selectLparDiv').append(lparName + ' ');
 | 
			
		||||
		temp ++;
 | 
			
		||||
		if (6 < temp){
 | 
			
		||||
			$('#selectLparDiv').append('...');
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	var reselectButton = createButton('Reselect');
 | 
			
		||||
	$('#selectLparDiv').append(reselectButton);
 | 
			
		||||
	reselectButton.bind('click', function(){
 | 
			
		||||
		reselectLpars();
 | 
			
		||||
	});
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * create the action menu
 | 
			
		||||
 * 
 | 
			
		||||
 * @param getNodesFunction
 | 
			
		||||
 *            the function that can find selected nodes name
 | 
			
		||||
 * @return 
 | 
			
		||||
 *        action menu object
 | 
			
		||||
 */
 | 
			
		||||
function createActionMenu(){
 | 
			
		||||
	// Create action bar
 | 
			
		||||
	var actionBar = $('<div class="actionBar"></div>');
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * The following actions are available to perform against a given node:
 | 
			
		||||
	 * power, clone, delete, unlock, and advanced
 | 
			
		||||
	 */
 | 
			
		||||
	/*
 | 
			
		||||
	 * Power
 | 
			
		||||
	 */
 | 
			
		||||
	var powerLnk = $('<a>Power</a>');
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Power on
 | 
			
		||||
	 */
 | 
			
		||||
	var powerOnLnk = $('<a>Power on</a>');
 | 
			
		||||
	powerOnLnk.bind('click', function(event) {
 | 
			
		||||
		var tgtNodes = getSelectLpars();
 | 
			
		||||
		$.ajax( {
 | 
			
		||||
			url : 'lib/cmd.php',
 | 
			
		||||
			dataType : 'json',
 | 
			
		||||
			data : {
 | 
			
		||||
				cmd : 'rpower',
 | 
			
		||||
				tgt : tgtNodes,
 | 
			
		||||
				args : 'on',
 | 
			
		||||
				msg : ''
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Power off
 | 
			
		||||
	 */
 | 
			
		||||
	var powerOffLnk = $('<a>Power off</a>');
 | 
			
		||||
	powerOffLnk.bind('click', function(event) {
 | 
			
		||||
		var tgtNodes = getSelectLpars();
 | 
			
		||||
		$.ajax( {
 | 
			
		||||
			url : 'lib/cmd.php',
 | 
			
		||||
			dataType : 'json',
 | 
			
		||||
			data : {
 | 
			
		||||
				cmd : 'rpower',
 | 
			
		||||
				tgt : tgtNodes,
 | 
			
		||||
				args : 'off',
 | 
			
		||||
				msg : ''
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Clone
 | 
			
		||||
	 */
 | 
			
		||||
	var cloneLnk = $('<a>Clone</a>');
 | 
			
		||||
	cloneLnk.bind('click', function(event) {
 | 
			
		||||
		var tgtNodes = getSelectLpars('nodesDataTable').split(',');
 | 
			
		||||
		for ( var i = 0; i < tgtNodes.length; i++) {
 | 
			
		||||
			var mgt = getNodeAttr(tgtNodes[i], 'mgt');
 | 
			
		||||
			
 | 
			
		||||
			// Create an instance of the plugin
 | 
			
		||||
			var plugin;
 | 
			
		||||
			switch(mgt) {
 | 
			
		||||
				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.loadClonePage(tgtNodes[i]);
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Delete
 | 
			
		||||
	 */
 | 
			
		||||
	var deleteLnk = $('<a>Delete</a>');
 | 
			
		||||
	deleteLnk.bind('click', function(event) {
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Unlock
 | 
			
		||||
	 */
 | 
			
		||||
	var unlockLnk = $('<a>Unlock</a>');
 | 
			
		||||
	unlockLnk.bind('click', function(event) {
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Run script
 | 
			
		||||
	 */
 | 
			
		||||
	var scriptLnk = $('<a>Run script</a>');
 | 
			
		||||
	scriptLnk.bind('click', function(event) {
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Update node
 | 
			
		||||
	 */
 | 
			
		||||
	var updateLnk = $('<a>Update</a>');
 | 
			
		||||
	updateLnk.bind('click', function(event) {
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Set boot state
 | 
			
		||||
	 */
 | 
			
		||||
	var setBootStateLnk = $('<a>Set boot state</a>');
 | 
			
		||||
	setBootStateLnk.bind('click', function(event) {
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Boot to network
 | 
			
		||||
	 */
 | 
			
		||||
	var boot2NetworkLnk = $('<a>Boot to network</a>');
 | 
			
		||||
	boot2NetworkLnk.bind('click', function(event) {
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Open the Rcons page
 | 
			
		||||
	 */
 | 
			
		||||
	var rcons = $('<a>Open Rcons</a>');
 | 
			
		||||
	rcons.bind('click', function(event){
 | 
			
		||||
		var tgtNodes = getSelectLpars();
 | 
			
		||||
		if (tgtNodes) {
 | 
			
		||||
			loadRconsPage(tgtNodes);
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Advanced
 | 
			
		||||
	 */
 | 
			
		||||
	var advancedLnk = $('<a>Advanced</a>');
 | 
			
		||||
 | 
			
		||||
	// Power actions
 | 
			
		||||
	var powerActions = [ powerOnLnk, powerOffLnk ];
 | 
			
		||||
	var powerActionMenu = createMenu(powerActions);
 | 
			
		||||
 | 
			
		||||
	// Advanced actions
 | 
			
		||||
	var advancedActions;
 | 
			
		||||
	advancedActions = [ boot2NetworkLnk, scriptLnk, setBootStateLnk, updateLnk, rcons ];
 | 
			
		||||
	var advancedActionMenu = createMenu(advancedActions);
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Create an action menu
 | 
			
		||||
	 */
 | 
			
		||||
	var actionsDIV = $('<div></div>');
 | 
			
		||||
	var actions = [ [ powerLnk, powerActionMenu ], cloneLnk, deleteLnk, unlockLnk, [ advancedLnk, advancedActionMenu ] ];
 | 
			
		||||
	var actionMenu = createMenu(actions);
 | 
			
		||||
	actionMenu.superfish();
 | 
			
		||||
	actionsDIV.append(actionMenu);
 | 
			
		||||
	actionBar.append(actionsDIV);
 | 
			
		||||
	
 | 
			
		||||
	return actionBar;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * create the physical graphical layout 
 | 
			
		||||
 * 
 | 
			
		||||
 * @param bpaName : fsp's key
 | 
			
		||||
 *        fsp : all fsp and there related lpars
 | 
			
		||||
 *        fspinfo : all fsps' hardwareinfo
 | 
			
		||||
 * @return
 | 
			
		||||
 *        fspDiv's html
 | 
			
		||||
 */
 | 
			
		||||
function createFspDiv(fspName, mtm, fsp){
 | 
			
		||||
	//create fsp title
 | 
			
		||||
	var title = '<h3>' + fspName;
 | 
			
		||||
	var lparStatusRow = '';
 | 
			
		||||
	if (hardwareInfo[mtm]){
 | 
			
		||||
		title += '(' + hardwareInfo[mtm][0] + ')';
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	title += '</h3><br/>';
 | 
			
		||||
	
 | 
			
		||||
	for (var lparIndex in fsp[fspName]['children']){
 | 
			
		||||
		var lparName = fsp[fspName]['children'][lparIndex];
 | 
			
		||||
		var color = statusMap(lparList[lparName]);
 | 
			
		||||
		title += lparName + '<br/>';
 | 
			
		||||
		lparStatusRow += '<td class="lparStatus" style="background-color:' + color + ';color:' + color + ';" id="' + lparName + '">1</td>';
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//select the backgroud
 | 
			
		||||
	var divClass = '';
 | 
			
		||||
	if (hardwareInfo[mtm][1]){
 | 
			
		||||
		divClass += 'fspDiv' + hardwareInfo[mtm][1];
 | 
			
		||||
	}
 | 
			
		||||
	else{
 | 
			
		||||
		divClass += 'fspDiv4';
 | 
			
		||||
	}
 | 
			
		||||
		
 | 
			
		||||
	//create return value
 | 
			
		||||
	var retHtml = '<div value="' + fspName + '" class="' + divClass + '" title="' + title + '">';
 | 
			
		||||
	retHtml += '<div class="lparDiv"><table><tbody><tr>' + lparStatusRow + '</tr></tbody></table></div>';
 | 
			
		||||
	return retHtml;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * map the lpar's status into a color 
 | 
			
		||||
 * 
 | 
			
		||||
 * @param status : lpar's status in nodelist table
 | 
			
		||||
 | 
			
		||||
 * @return
 | 
			
		||||
 *        corresponding color name
 | 
			
		||||
 */
 | 
			
		||||
function statusMap(status){
 | 
			
		||||
	var color = 'gainsboro';
 | 
			
		||||
	
 | 
			
		||||
	switch(status){
 | 
			
		||||
		case 'alive':
 | 
			
		||||
		case 'ready':
 | 
			
		||||
		case 'pbs':
 | 
			
		||||
		case 'sshd':
 | 
			
		||||
		case 'booting':{
 | 
			
		||||
			color = 'green';
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
		case 'noping':
 | 
			
		||||
		case 'unreachable':{
 | 
			
		||||
			color = 'red';
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
		case 'ping':{
 | 
			
		||||
			color = 'yellow';
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
		default:
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	return color;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * select all lpars checkbox in the dialog 
 | 
			
		||||
 * 
 | 
			
		||||
 * @param 
 | 
			
		||||
 | 
			
		||||
 * @return
 | 
			
		||||
 *        
 | 
			
		||||
 */
 | 
			
		||||
function selectAllLpars(checkbox){
 | 
			
		||||
	var temp = checkbox.attr('checked');
 | 
			
		||||
	$('#selectLparTable input[type = checkbox]').attr('checked', temp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * export all lpars' name from selectLpar 
 | 
			
		||||
 * 
 | 
			
		||||
 * @param 
 | 
			
		||||
 | 
			
		||||
 * @return lpars' string
 | 
			
		||||
 *        
 | 
			
		||||
 */
 | 
			
		||||
function getSelectLpars(){
 | 
			
		||||
	var ret = '';
 | 
			
		||||
	for (var lparName in selectLpar){
 | 
			
		||||
		ret += lparName + ',';
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	return ret.substring(0, ret.length-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * show all lpars' for users to delete 
 | 
			
		||||
 * 
 | 
			
		||||
 * @param 
 | 
			
		||||
 | 
			
		||||
 * @return 
 | 
			
		||||
 */
 | 
			
		||||
function reselectLpars(){
 | 
			
		||||
	var temp = new Array();
 | 
			
		||||
	
 | 
			
		||||
	for (var lparName in selectLpar){
 | 
			
		||||
		temp.push(lparName);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	showSelectDialog(temp);
 | 
			
		||||
}
 | 
			
		||||
@@ -454,7 +454,7 @@ function initPage() {
 | 
			
		||||
		includeJs("js/nodes/nodeset.js");
 | 
			
		||||
		includeJs("js/nodes/rnetboot.js");
 | 
			
		||||
		includeJs("js/nodes/updatenode.js");
 | 
			
		||||
		
 | 
			
		||||
		includeJs("js/nodes/physical.js");
 | 
			
		||||
		headers.eq(0).css('background-color', '#A9D0F5');
 | 
			
		||||
		loadNodesPage();
 | 
			
		||||
	} else if (page == 'configure.php') {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user