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:
parent
dd26e8d03f
commit
2a81262d9d
@ -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;
|
Loading…
Reference in New Issue
Block a user