mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-31 03:12:30 +00:00 
			
		
		
		
	create image on web gui
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@9176 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		| @@ -135,6 +135,12 @@ function loadImages(data) { | ||||
| 		loadCopyCdPage(); | ||||
| 	}); | ||||
| 	 | ||||
| 	// Create new button | ||||
| 	var newBtn = createButton("Create Image"); | ||||
| 	newBtn.bind('click',function(event){ | ||||
| 		loadCreateImage(); | ||||
| 	}); | ||||
| 	 | ||||
| 	// Create edit button | ||||
| 	var editBtn = createButton('Edit'); | ||||
| 	editBtn.bind('click', function(event){ | ||||
| @@ -170,6 +176,7 @@ function loadImages(data) { | ||||
| 	 */ | ||||
| 	var actionsBar = $('<div></div>').css('margin', '10px 0px'); | ||||
| 	actionsBar.append(copyLinuxBtn); | ||||
| 	actionsBar.append(newBtn); | ||||
| 	actionsBar.append(editBtn); | ||||
| 	actionsBar.append(saveBtn); | ||||
| 	actionsBar.append(undoBtn); | ||||
| @@ -418,6 +425,195 @@ function setImageDefAttrs(data) { | ||||
| 	} // End of for | ||||
| } | ||||
|  | ||||
| /** | ||||
|  *Load create image page | ||||
|  * | ||||
|  *@param Nothing | ||||
|  *		Create a new image for provision | ||||
|  *@return Nothing | ||||
|  */ | ||||
| function loadCreateImage(){ | ||||
| 	// get nodes tab | ||||
| 	var tab=getProvisionTab(); | ||||
| 	var tabId = 'createImageTab'; | ||||
| 	//Generate new tab ID | ||||
| 	if($('#' + tabId).length){ | ||||
| 		tab.select(tabId); | ||||
| 		return ; | ||||
| 	} | ||||
| 	 | ||||
| 	// Open new tab | ||||
| 	// Create set properties form  | ||||
| 	var setPropsForm = $('<div class="form"></div>'); | ||||
|  | ||||
| 	var infoBar= createInfoBar('Input the image info ,you want to generate. When you finished, click generate.'); | ||||
| 	setPropsForm.append(infoBar); | ||||
| 	 | ||||
| 	// Create an input for each generate attribute | ||||
| 	var showStr = ''; | ||||
| 	//os version selector | ||||
| 	showStr += '<p><label>OS Version:</label><select id="osvers"><option value="rhsel6">rhlse6</option></select></p>'; | ||||
| 	//os arch selector | ||||
| 	showStr += '<p><label>OS Architecture:</label><select id="osarch"><option value="ppc64">ppc64</option></select></p>'; | ||||
| 	//net boot interface input | ||||
| 	showStr += '<p><label>Net Boot Interface:</label><input type="text" id="netbootif"></p>'; | ||||
| 	//profile selector | ||||
| 	showStr += '<p><label>Profile:</label><select id="profile"><option value="compute">compute</option>' +  | ||||
| 			   '<option value="service">service</option></select></p>'; | ||||
| 	//boot method selector | ||||
| 	showStr += '<p><label>Boot Method:</label><select id="bootmethod"><option value="stateless">stateless</option>' +  | ||||
| 	   		   '<option value="statelite">statelite</option></select></p>'; | ||||
|  | ||||
| 	// advanced software when select the compute profile | ||||
| 	showStr += '<fieldset id="hpcsoft"><legend>HPC Software Stack</legend><ul>' + | ||||
| 			   '<li id="gpfsli"><input type="checkbox" onclick="gpfsCheck(this)" name="gpfs">GPFS</li>' +  | ||||
| 			   '<li id="loadli"><input type="checkbox" name="loadll">LoadLeveler</li>' | ||||
| 			   + '</ul></fieldset>'; | ||||
| 	 | ||||
| 	setPropsForm.append(showStr); | ||||
| 	 | ||||
| 	var createImageBtn=createButton("CreateImage"); | ||||
| 	createImageBtn.bind('click',function(event){ | ||||
| 		createImage(); | ||||
| 	}); | ||||
| 	 | ||||
| 	setPropsForm.append(createImageBtn);	 | ||||
| 	tab.add(tabId, 'Create Image', setPropsForm, true); | ||||
| 	tab.select(tabId); | ||||
| 	 | ||||
| 	//for the profile select, if not compute could not select the software | ||||
| 	$('#createImageTab #profile').bind('change', function(){ | ||||
| 		if('compute' != $(this).attr('value')){ | ||||
| 			$('#createImageTab #hpcsoft').hide(); | ||||
| 		} | ||||
| 		else{ | ||||
| 			$('#createImageTab #hpcsoft').show(); | ||||
| 		} | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * use users' input or select to create image | ||||
|  *  | ||||
|  * @param  | ||||
|  *   | ||||
|  * @return Nothing | ||||
|  */ | ||||
| function createImage(){ | ||||
| 	var osvers = $("#createImageTab #osvers").val(); | ||||
| 	var osarch = $("#createImageTab #osarch").val(); | ||||
| 	var profile = $("#createImageTab #profile").val(); | ||||
| 	var bootInterface = $("#createImageTab #netbootif").val(); | ||||
| 	var bootMethod = $("#createImageTab #bootmethod").val(); | ||||
| 	 | ||||
| 	$('#createImageTab .ui-state-error').remove(); | ||||
| 	 | ||||
| 	if (!bootInterface){ | ||||
| 		$("#createImageTab").prepend('<div class="ui-state-error ui-corner-all">' +  | ||||
| 					                 '<p>Input the netboot interface please.</p></div>'); | ||||
| 		return; | ||||
| 	} | ||||
| 	 | ||||
| 	var createImageArgs = "createimage;" + osvers + ";" + osarch + ";" + profile + ";" + bootInterface + ";" + | ||||
| 						  bootMethod + ";"; | ||||
| 	 | ||||
| 	$("#createImageTab :checkbox:checked").each(function (){ | ||||
| 		createImageArgs+=$(this).attr("name")+","; | ||||
| 	}); | ||||
| 	 | ||||
| 	createImageArgs=createImageArgs.substring(0,(createImageArgs.length-1)); | ||||
| 	$.ajax({ | ||||
| 		 url : 'lib/cmd.php', | ||||
|          dataType : 'json', | ||||
|          data : { | ||||
|    		         cmd : 'webrun', | ||||
|                  tgt : '', | ||||
|                  args : createImageArgs, | ||||
|                  msg : '' | ||||
| 		}, | ||||
| 		success : function(data){ | ||||
|  | ||||
| 		} | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * when users want to install gpfs on compute node,  | ||||
|  * should check the rpms install and copy status first. | ||||
|  *  | ||||
|  * @param  | ||||
|  *   | ||||
|  * @return Nothing | ||||
|  */ | ||||
| function gpfsCheck(obj) { | ||||
| 	if(0 < $('#createImageTab #gpfsli .ui-icon-circle-check').size()){ | ||||
| 		return; | ||||
| 	} | ||||
| 	 | ||||
| 	$('#createImageTab #gpfsli .ui-state-error').remove(); | ||||
| 	$('#createImageTab #gpfsli').append(createLoader()); | ||||
| 	$.ajax({ | ||||
| 		url : 'lib/systemcmd.php', | ||||
| 		dataType : 'json', | ||||
| 		data:{ | ||||
| 			cmd : 'rpm -q gpfs.base gpfs.gpl gpfs.msg  xCAT-IBMhpc createrepo' | ||||
| 		}, | ||||
| 		success : function(data){ | ||||
| 			var checkResult=data.rsp.split("\n"); | ||||
| 			var errorStr = ''; | ||||
| 			 | ||||
| 			for (var i in checkResult){ | ||||
| 				if (-1 != checkResult[i].indexOf("not installed")){ | ||||
| 					errorStr += ' ' + checkResult[i] + ','; | ||||
| 				} | ||||
| 			} | ||||
| 			 | ||||
| 			if ('' != errorStr){ | ||||
| 				errorStr = errorStr.substr(0, errorStr.length - 1); | ||||
| 				$(":checkbox[name=gpfs]").attr("checked",false); | ||||
| 				//add the error | ||||
| 				var errorPart = '<div style="display:inline-block;margin:0px" class="ui-state-error">' + | ||||
| 								'<span class="ui-icon ui-icon-alert"></span>' + errorStr + '</div>'; | ||||
| 				$('#createImageTab #gpfsli').find('img').remove(); | ||||
| 				$('#createImageTab #gpfsli').append(errorPart); | ||||
| 				return; | ||||
| 			} | ||||
| 			 | ||||
| 			gpfsCopyCheck(); | ||||
| 		} | ||||
| 	});	 | ||||
| } | ||||
|  | ||||
| function gpfsCopyCheck(){ | ||||
| 	var osvers=$("#createImageTab #osvers").val(); | ||||
| 	var osarch=$("#createImageTab #osarch").val(); | ||||
| 	$.ajax({ | ||||
| 		url: 'lib/systemcmd.php', | ||||
| 		dataType : 'json', | ||||
| 		data : { | ||||
| 			cmd : 'ls /install/post/otherpkgs/' + osvers + '/' + osarch + '/gpfs/gpfs.gplbin*.rpm' | ||||
| 		}, | ||||
| 		success : function(data){ | ||||
| 			var installPath = '/install/post/otherpkgs/' + $("#createImageTab #osvers").val() + '/' +  | ||||
| 							  $("#createImageTab #osarch").val() + '/gpfs'; | ||||
| 			//remove the loading image. | ||||
| 			$('#createImageTab #gpfsli').find('img').remove(); | ||||
| 			 | ||||
| 			//check the return information | ||||
| 			if (null == data.rsp){ | ||||
| 				var errorPart = '<div style="display:inline-block;margin:0px" class="ui-state-error">' + | ||||
| 								'<span class="ui-icon ui-icon-alert"></span>Build the GPFS portability layer rpm, install it and copy it into ' + | ||||
| 								installPath + '.<br/>For information: <a href="http://sourceforge.net/apps/mediawiki/xcat/index.php?title=Setting_up_GPFS_in_a_Statelite_or_Stateless_Cluster#Install.2FBuild_GPFS" target="_blank">Install/Build GPFS</a></div>'; | ||||
| 				$('#createImageTab #gpfsli').append(errorPart); | ||||
| 				$(":checkbox[name=gpfs]").attr("checked",false); | ||||
| 			} | ||||
| 			else{ | ||||
| 				var infoPart = '<div style="display:inline-block;margin:0px"><span class="ui-icon ui-icon-circle-check"></span></div>'; | ||||
| 				$('#createImageTab #gpfsli').append(infoPart); | ||||
| 			} | ||||
| 		} | ||||
| 	}); | ||||
| } | ||||
| /** | ||||
|  * Load set image properties page | ||||
|  *  | ||||
|   | ||||
| @@ -57,6 +57,7 @@ sub process_request { | ||||
| 		'monls'         => \&web_monls, | ||||
| 		'discover'      => \&web_discover, | ||||
| 		'updatevpd'     => \&web_updatevpd, | ||||
| 		'createimage'   => \&web_createimage | ||||
| 		#'xdsh' => \&web_xdsh, | ||||
| 		#THIS list needs to be updated | ||||
| 	); | ||||
| @@ -1027,4 +1028,205 @@ sub web_updatevpd{ | ||||
|     $vpdtab->close(); | ||||
| } | ||||
|  | ||||
| sub web_createimage{ | ||||
|     my ( $request, $callback, $sub_req ) = @_; | ||||
|     my $ostype = $request->{arg}->[1]; | ||||
|     my $osarch = lc($request->{arg}->[2]); | ||||
|     my $profile = $request->{arg}->[3]; | ||||
|     my $bootif = $request->{arg}->[4]; | ||||
|     my $imagetype = lc($request->{arg}->[5]); | ||||
|     my @softArray; | ||||
|     my $netdriver = ''; | ||||
|     my $installdir = xCAT::Utils->getInstallDir(); | ||||
|     my $tempos = $ostype; | ||||
|     $tempos =~ s/[0-9]//; | ||||
|     my $CONFILE; | ||||
|     my $archFlag = 0; | ||||
|     my $ret = ''; | ||||
|     my $cmdPath = ''; | ||||
|  | ||||
|     if ($request->{arg}->[6]){ | ||||
|         @softArray = split(',' , $request->{arg}->[6]); | ||||
|  | ||||
|         #check the arch  | ||||
|         if('ppc64' ne $osarch){ | ||||
|             $callback->({data=>'Error: only support PPC64!'}); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         #check the osver | ||||
|         unless (-e "/opt/xcat/share/xcat/IBMhpc/IBMhpc.$ostype.ppc64.pkglist"){ | ||||
|             $callback->({data=>'Error: only support rhels6 and sles11!'}); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         #check the custom package, if the path is not exist, must create the dir first | ||||
|         if (-e "$installdir/custom/netboot/$ostype/"){ | ||||
|             #the path is exist, so archive all file under this path. | ||||
|             opendir(TEMPDIR, "$installdir/custom/netboot/$ostype/"); | ||||
|             my @fileArray = readdir(TEMPDIR); | ||||
|             closedir(TEMPDIR); | ||||
|             if (2 < scalar(@fileArray)){ | ||||
|                 $archFlag = 1; | ||||
|                 unless (-e "/tmp/webImageArch/"){ | ||||
|                     system("mkdir -p /tmp/webImageArch/"); | ||||
|                 } | ||||
|                 system("mv $installdir/custom/netboot/$ostype/*.* /tmp/webImageArch/"); | ||||
|             } | ||||
|             else{ | ||||
|                 $archFlag = 0; | ||||
|             } | ||||
|         } | ||||
|         else{ | ||||
|             #do not need to archive | ||||
|             $archFlag = 0; | ||||
|             system("mkdir -p $installdir/custom/netboot/$ostype/"); | ||||
|         } | ||||
|          | ||||
|         #write pkglist | ||||
|         open($CONFILE, ">$installdir/custom/netboot/$ostype/$profile.pkglist"); | ||||
|         print $CONFILE "#INCLUDE:/opt/xcat/share/xcat/IBMhpc/IBMhpc.$ostype.ppc64.pkglist# \n"; | ||||
|         close($CONFILE); | ||||
|  | ||||
|         #write otherpkglist | ||||
|         open($CONFILE, ">$installdir/custom/netboot/$ostype/$profile.otherpkgs.pkglist"); | ||||
|         print $CONFILE "\n"; | ||||
|         close($CONFILE); | ||||
|  | ||||
|         #write exlist for stateless | ||||
|         open($CONFILE, ">/install/custom/netboot/$ostype/$profile.exlist"); | ||||
|         print $CONFILE "#INCLUDE:/opt/xcat/share/xcat/IBMhpc/IBMhpc.$ostype.$osarch.exlist#\n"; | ||||
|         close($CONFILE); | ||||
|  | ||||
|         #write postinstall | ||||
|         open($CONFILE, ">$installdir/custom/netboot/$ostype/$profile.postinstall"); | ||||
|         print $CONFILE "/opt/xcat/share/xcat/IBMhpc/IBMhpc.$tempos.postinstall \$1 \$2 \$3 \$4 \$5 \n"; | ||||
|         close($CONFILE); | ||||
|  | ||||
|         for my $soft (@softArray){ | ||||
|             $soft = lc($soft); | ||||
|             if ('gpfs' eq $soft){ | ||||
|                 web_gpfsConfigure($ostype, $profile, $installdir); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         #chmod  | ||||
|         system("chmod 755 $installdir/custom/netboot/$ostype/*.*"); | ||||
|     } | ||||
|  | ||||
|     if ($bootif =~ /hf/i){ | ||||
|         $netdriver = 'hf_if'; | ||||
|     } | ||||
|     else{ | ||||
|         $netdriver = 'ibmveth'; | ||||
|     } | ||||
|  | ||||
|     if ($tempos =~ /rh/i){ | ||||
|         $cmdPath = "/opt/xcat/share/xcat/netboot/rh"; | ||||
|     } | ||||
|     else{ | ||||
|         $cmdPath = "/opt/xcat/share/xcat/netboot/sles"; | ||||
|     } | ||||
|     #for stateless only run packimage is ok | ||||
|     if ('stateless' eq $imagetype){ | ||||
|         my $retInfo = xCAT::Utils->runcmd( "${cmdPath}/genimage -i $bootif -n $netdriver -o $ostype -p $profile", -1, 1 ); | ||||
|         $ret = join ("\n", @$retInfo); | ||||
|         if ($::RUNCMD_RC){ | ||||
|             $callback->({data=>$ret}); | ||||
|             return; | ||||
|         } | ||||
|         $ret .= "\n"; | ||||
|         my $retInfo = xCAT::Utils->runcmd( "packimage -o $ostype -p $profile -a $osarch", -1, 1 ); | ||||
|         $ret .= join ("\n", @$retInfo); | ||||
|     } | ||||
|     else{ | ||||
|         #for statelist we should check the litefile table | ||||
|         #step1 save the old litefile table content into litefilearchive.csv | ||||
|         system('tabdump litefile > /tmp/litefilearchive.csv'); | ||||
|  | ||||
|         #step2 write the new litefile.csv for this lite image | ||||
|         open ($CONFILE, ">/tmp/litefile.csv"); | ||||
|         print $CONFILE "#image,file,options,comments,disable\n"; | ||||
|         print $CONFILE '"ALL","/etc/lvm/","tmpfs",,' . "\n"; | ||||
|         print $CONFILE '"ALL","/etc/ntp.conf","tmpfs",,' . "\n"; | ||||
|         print $CONFILE '"ALL","/etc/resolv.conf","tmpfs",,' . "\n"; | ||||
|         print $CONFILE '"ALL","/etc/sysconfig/","tmpfs",,' . "\n"; | ||||
|         print $CONFILE '"ALL","/etc/yp.conf","tmpfs",,' . "\n"; | ||||
|         print $CONFILE '"ALL","/etc/ssh/","tmpfs",,' . "\n"; | ||||
|         print $CONFILE '"ALL","/var/","tmpfs",,' . "\n"; | ||||
|         print $CONFILE '"ALL","/tmp/","tmpfs",,' . "\n"; | ||||
|         print $CONFILE '"ALL","/root/.ssh/","tmpfs",,' . "\n"; | ||||
|         print $CONFILE '"ALL","/opt/xcat/","tmpfs",,' . "\n"; | ||||
|         print $CONFILE '"ALL","/xcatpost/","tmpfs",,' . "\n"; | ||||
|  | ||||
|         if ('rhels' eq $tempos){ | ||||
|             print $CONFILE '"ALL","/etc/adjtime","tmpfs",,' . "\n"; | ||||
|             print $CONFILE '"ALL","/etc/securetty","tmpfs",,' . "\n"; | ||||
|             print $CONFILE '"ALL","/etc/rsyslog.conf","tmpfs",,' . "\n"; | ||||
|             print $CONFILE '"ALL","/etc/rsyslog.conf.XCATORIG","tmpfs",,' . "\n"; | ||||
|             print $CONFILE '"ALL","/etc/udev/","tmpfs",,' . "\n"; | ||||
|             print $CONFILE '"ALL","/etc/ntp.conf.predhclient","tmpfs",,' . "\n"; | ||||
|             print $CONFILE '"ALL","/etc/resolv.conf.predhclient","tmpfs",,' . "\n"; | ||||
|         } | ||||
|         else{ | ||||
|             print $CONFILE '"ALL","/etc/ntp.conf.org","tmpfs",,' . "\n"; | ||||
|             print $CONFILE '"ALL","/etc/syslog-ng/","tmpfs",,' . "\n"; | ||||
|             print $CONFILE '"ALL","/etc/fstab","tmpfs",,' . "\n"; | ||||
|         } | ||||
|         close($CONFILE); | ||||
|          | ||||
|         for my $soft (@softArray){ | ||||
|             $soft = lc($soft); | ||||
|             system ("grep '^[^#]' /opt/xcat/share/xcat/IBMhpc/$soft/litefile.csv >> /tmp/litefile.csv"); | ||||
|         } | ||||
|          | ||||
|         system("tabrestore /tmp/litefile.csv"); | ||||
|  | ||||
|         #create the image | ||||
|         my $retInfo = xCAT::Utils->runcmd( "${cmdPath}/genimage -i $bootif -n $netdriver -o $ostype -p $profile", -1, 1 ); | ||||
|         $ret = join ("\n", @$retInfo); | ||||
|         if ($::RUNCMD_RC){ | ||||
|             $callback->({data=>$ret}); | ||||
|             return; | ||||
|         } | ||||
|         $ret .= "\n"; | ||||
|         my $retInfo = xCAT::Utils->runcmd( "liteimg -o $ostype -p $profile -a $osarch", -1, 1 ); | ||||
|         $ret .= join ("\n", @$retInfo); | ||||
|  | ||||
|         #restore the litefile table | ||||
|         system("rm -r /tmp/litefile.csv ; mv /tmp/litefilearchive.csv /tmp/litefile.csv ; tabrestore /tmp/litefile.csv"); | ||||
|     } | ||||
|  | ||||
|     #recover all file in the $installdir/custom/netboot/$ostype/ | ||||
|     if ($request->{arg}->[6]){ | ||||
|         system("rm -f $installdir/custom/netboot/$ostype/*.*"); | ||||
|     } | ||||
|      | ||||
|     if ($archFlag){ | ||||
|         system("mv /tmp/webImageArch/*.* $installdir/custom/netboot/$ostype/"); | ||||
|     } | ||||
|     $callback->({data=>$ret}); | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub web_gpfsConfigure{ | ||||
|     my ($ostype, $profile, $installdir) = @_; | ||||
|     my $CONFILE; | ||||
|     #other pakgs | ||||
|     open($CONFILE, ">>$installdir/custom/netboot/$ostype/$profile.otherpkgs.pkglist"); | ||||
|     print $CONFILE "#INCLUDE:/opt/xcat/share/xcat/IBMhpc/gpfs/gpfs.otherpkgs.pkglist#\n"; | ||||
|     close($CONFILE); | ||||
|  | ||||
|     #exlist | ||||
|     open ($CONFILE, ">>/install/custom/netboot/$ostype/$profile.exlist"); | ||||
|     print $CONFILE "#INCLUDE:/opt/xcat/share/xcat/IBMhpc/gpfs/gpfs.exlist#\n"; | ||||
|     close ($CONFILE); | ||||
|  | ||||
|     #postinstall | ||||
|     system ('cp /opt/xcat/share/xcat/IBMhpc/gpfs/gpfs_mmsdrfs /install/postscripts/gpfs_mmsdrfs'); | ||||
|     open($CONFILE, ">>$installdir/custom/netboot/$ostype/$profile.postinstall"); | ||||
|     print $CONFILE "NODESETSTATE=genimage installroot=\$1 /opt/xcat/share/xcat/IBMhpc/gpfs/gpfs_updates \n"; | ||||
|     print $CONFILE "installroot=$1 /install/postscripts/gpfs_mmsdrfs\n"; | ||||
|     close($CONFILE); | ||||
| } | ||||
| 1; | ||||
		Reference in New Issue
	
	Block a user