mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-30 19:02:27 +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