From 2d909fef9d22ba26775189192ccd05ca401642b4 Mon Sep 17 00:00:00 2001 From: linggao Date: Fri, 19 Feb 2010 18:39:56 +0000 Subject: [PATCH] more support for statelite git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@5240 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server/lib/perl/xCAT/Postage.pm | 4 +- xCAT-server/lib/perl/xCAT/SvrUtils.pm | 12 ++++-- xCAT-server/lib/xcat/plugins/anaconda.pm | 10 ++--- xCAT-server/lib/xcat/plugins/destiny.pm | 6 +-- xCAT-server/lib/xcat/plugins/litetree.pm | 50 ++++++++++++++--------- xCAT-server/lib/xcat/plugins/sles.pm | 2 +- xCAT-server/lib/xcat/plugins/statelite.pm | 14 ++++++- 7 files changed, 61 insertions(+), 37 deletions(-) diff --git a/xCAT-server/lib/perl/xCAT/Postage.pm b/xCAT-server/lib/perl/xCAT/Postage.pm index 395d5f558..88bbc575a 100644 --- a/xCAT-server/lib/perl/xCAT/Postage.pm +++ b/xCAT-server/lib/perl/xCAT/Postage.pm @@ -266,7 +266,7 @@ sub makescript { #get packge names for extra rpms my $otherpkgdir; my $pkglist; - if (($^O =~ /^linux/i) && ($provmethod) && ( $provmethod ne "install") && ($provmethod ne "netboot")) { + if (($^O =~ /^linux/i) && ($provmethod) && ( $provmethod ne "install") && ($provmethod ne "netboot") && ($provmethod ne "statelite")) { #this is the case where image from the osimage table is used my $linuximagetab=xCAT::Table->new('linuximage', -create=>1); (my $ref1) = $linuximagetab->getAttribs({imagename => $provmethod}, 'otherpkglist', 'otherpkgdir'); @@ -331,7 +331,7 @@ sub makescript { # check if there are sync files to be handled my $syncfile; - if (($provmethod) && ( $provmethod ne "install") && ($provmethod ne "netboot")) { + if (($provmethod) && ($provmethod ne "install") && ($provmethod ne "netboot") && ($provmethod ne "statelite")) { my $osimagetab=xCAT::Table->new('osimage', -create=>1); if ($osimagetab) { (my $ref) = $osimagetab->getAttribs({imagename => $provmethod}, 'osvers', 'osarch', 'profile', 'provmethod', 'synclists'); diff --git a/xCAT-server/lib/perl/xCAT/SvrUtils.pm b/xCAT-server/lib/perl/xCAT/SvrUtils.pm index 351ca2b33..8ed72ad56 100644 --- a/xCAT-server/lib/perl/xCAT/SvrUtils.pm +++ b/xCAT-server/lib/perl/xCAT/SvrUtils.pm @@ -289,7 +289,7 @@ sub getsynclistfile() foreach my $node (@$nodes) { my $provmethod=$nodetype_v->{$node}->[0]->{'provmethod'}; - if (($provmethod) && ( $provmethod ne "install") && ($provmethod ne "netboot")) { + if (($provmethod) && ( $provmethod ne "install") && ($provmethod ne "netboot") && ($provmethod ne "statelite")) { # get the syncfiles base on the osimage my $osimage_t = xCAT::Table->new('osimage'); unless ($osimage_t) { @@ -644,6 +644,10 @@ sub update_tables_with_diskless_image } my $arch = shift; #like ppc64, x86, x86_64 my $profile = shift; + my $mode=shift; + + my $provm="netboot"; + if ($mode) { $provm = $mode; } my $osname=$osver;; #like sles, rh, centos, windows my $ostype="Linux"; #like Linux, Windows @@ -716,7 +720,7 @@ sub update_tables_with_diskless_image my $tmp1=$osimagetab->getAllEntries(); if (defined($tmp1) && (@$tmp1 > 0)) { foreach my $rowdata(@$tmp1) { - if (($osver eq $rowdata->{osvers}) && ($arch eq $rowdata->{osarch}) && ($rowdata->{provmethod} eq "netboot") && ($profile eq $rowdata->{profile})){ + if (($osver eq $rowdata->{osvers}) && ($arch eq $rowdata->{osarch}) && ($rowdata->{provmethod} eq $provm) && ($profile eq $rowdata->{profile})){ $found=1; last; } @@ -724,12 +728,12 @@ sub update_tables_with_diskless_image } if ($found) { print "The image is already in the db.\n"; return (0, ""); } - my $imagename=$osver . "-" . $arch . "-netboot-" . $profile; + my $imagename=$osver . "-" . $arch . "-$provm-" . $profile; #TODO: check if there happen to be a row that has the same imagename but with different contents #now we can wirte the info into db my %key_col = (imagename=>$imagename); my %tb_cols=(imagetype=>$imagetype, - provmethod=>"netboot", + provmethod=>$provm, profile=>$profile, osname=>$ostype, osvers=>$osver, diff --git a/xCAT-server/lib/xcat/plugins/anaconda.pm b/xCAT-server/lib/xcat/plugins/anaconda.pm index 8ffa86cb8..89e88667a 100644 --- a/xCAT-server/lib/xcat/plugins/anaconda.pm +++ b/xCAT-server/lib/xcat/plugins/anaconda.pm @@ -412,10 +412,10 @@ sub mknetboot $kcmdline = "NFSROOT=$nfssrv:$nfsdir STATEMNT="; - if($stateHash->{statemnt} ){ - $kcmdline .= $stateHash->{statemnt} . " "; - }else{ - $kcmdline .= " "; + if (exists($stateHash->{$node})) { + $kcmdline .= $stateHash->{$node}->[0]->{statemnt} . " "; + } else { + $kcmdline .= " "; } $kcmdline .= "XCAT=$imgsrv:$xcatdport "; @@ -528,7 +528,7 @@ sub mkinstall my $osinst; my $ent = $osents{$node}->[0]; #$ostab->getNodeAttribs($node, ['profile', 'os', 'arch']); - if ($ent and $ent->{provmethod} and ($ent->{provmethod} ne 'install') and ($ent->{provmethod} ne 'netboot')) { + if ($ent and $ent->{provmethod} and ($ent->{provmethod} ne 'install') and ($ent->{provmethod} ne 'netboot') and ($ent->{provmethod} ne 'statelite')) { $imagename=$ent->{provmethod}; #print "imagename=$imagename\n"; if (!exists($img_hash{$imagename})) { diff --git a/xCAT-server/lib/xcat/plugins/destiny.pm b/xCAT-server/lib/xcat/plugins/destiny.pm index 3d735a601..d3141ce88 100644 --- a/xCAT-server/lib/xcat/plugins/destiny.pm +++ b/xCAT-server/lib/xcat/plugins/destiny.pm @@ -98,9 +98,9 @@ sub setdestiny { $state = $stents{$_}->[0]->{currstate}; $state =~ s/ .*//; #get the osimagename if nodetype.provmethod has osimage specified - if (($sninit ==1) && (($state eq 'install') || ($state eq 'netboot'))) { + if (($sninit ==1) && (($state eq 'install') || ($state eq 'netboot') || ($state eq 'statelite'))) { my $osimage=$ntents{$_}->[0]->{provmethod}; - if (($osimage) && ($osimage ne 'install') && ($osimage ne 'netboot')) { + if (($osimage) && ($osimage ne 'install') && ($osimage ne 'netboot') && ($osimage ne 'statelite')) { $state="osimage=$osimage"; } } @@ -297,7 +297,7 @@ sub setdestiny { #if the previous nodeset staute is not install, then blank nodetype.provmethod if ($ntent and $ntent->{provmethod}){ my $provmethod=$ntent->{provmethod}; - if (($provmethod ne 'install') && ($provmethod ne 'netboot')) { + if (($provmethod ne 'install') && ($provmethod ne 'netboot') && ($provmethod ne 'statelite')) { if (exists($osimage_hash{$provmethod})) { $provmethod= $osimage_hash{$provmethod}; } else { diff --git a/xCAT-server/lib/xcat/plugins/litetree.pm b/xCAT-server/lib/xcat/plugins/litetree.pm index 15bfdf58e..994338fba 100644 --- a/xCAT-server/lib/xcat/plugins/litetree.pm +++ b/xCAT-server/lib/xcat/plugins/litetree.pm @@ -120,22 +120,31 @@ sub syncmount { my %osents; unless($syncType =~ /image/){ $ostab = xCAT::Table->new('nodetype'); - %osents = %{$ostab->getNodesAttribs(\@nodes,['profile','os','arch'])}; + %osents = %{$ostab->getNodesAttribs(\@nodes,['profile','os','arch','provmethod'])}; } foreach my $node (@nodes){ - # node may be an image... - my $ent; - if(! $syncType =~ /image/){ - $ent = $osents{$node}->[0]; - unless($ent->{os} && $ent->{arch} && $ent->{profile}){ - $callback->({error=>["$node does not have os, arch, or profile defined in nodetype table"],errorcode=>[1]}); - $request = {}; - return; - } + # node may be an image... + my $image; + my $ent; + if($syncType !~ /image/){ + $ent = $osents{$node}->[0]; + + unless($ent->{os} && $ent->{arch} && $ent->{profile}){ + $callback->({error=>["$node does not have os, arch, or profile defined in nodetype table"],errorcode=>[1]}); + $request = {}; + next; } - my $fData = getNodeData($syncType,$node,$ent,$tab,$callback); - # now we go through each directory and search for the file. - showSync($syncType,$callback, $node, $fData); + if ((!$ent->{provmethod}) || ($ent->{provmethod} eq 'statelite') || ($ent->{provmethod} eq 'netboot') || ($ent->{provmethod} eq 'install')) { + $image = $ent->{os} . "-" . $ent->{arch} . "-statelite-" . $ent->{profile}; + } elsif (($ent->{provmethod} ne 'netboot') && ($ent->{provmethod} ne 'install')) { + $image=$ent->{provmethod}; + } + } else { + $image=$node; + } + my $fData = getNodeData($syncType,$node,$image,$tab,$callback); + # now we go through each directory and search for the file. + showSync($syncType,$callback, $node, $fData); } } @@ -308,16 +317,17 @@ sub subVar { sub getNodeData { my $type = shift; my $node = shift; - my $ent = shift; + my $image = shift; my $tab = shift; my $cb = shift; # callback to print messages!! # the image name will be something like rhels5.4-x86_64-nfsroot - my $image; - unless($type =~ /image/){ - $image = $ent->{os} . "-" . $ent->{arch} . "-" . $ent->{profile}; - }else{ - $image = $node; - } + #my $image; + #unless($type =~ /image/){ + # $image = $ent->{os} . "-" . $ent->{arch} . "-statelite-" . $ent->{profile}; + #}else{ + # $image = $node; + #} + my @imageInfo; my @attrs; if($type eq "dir"){ diff --git a/xCAT-server/lib/xcat/plugins/sles.pm b/xCAT-server/lib/xcat/plugins/sles.pm index a49caff43..0875ff724 100644 --- a/xCAT-server/lib/xcat/plugins/sles.pm +++ b/xCAT-server/lib/xcat/plugins/sles.pm @@ -399,7 +399,7 @@ sub mkinstall my $osinst; my $ent = $ntents->{$node}->[0]; - if ($ent and $ent->{provmethod} and ($ent->{provmethod} ne 'install') and ($ent->{provmethod} ne 'netboot')) { + if ($ent and $ent->{provmethod} and ($ent->{provmethod} ne 'install') and ($ent->{provmethod} ne 'netboot') and ($ent->{provmethod} ne 'statelite')) { my $imagename=$ent->{provmethod}; #print "imagename=$imagename\n"; if (!exists($img_hash{$imagename})) { diff --git a/xCAT-server/lib/xcat/plugins/statelite.pm b/xCAT-server/lib/xcat/plugins/statelite.pm index 51a70be54..285fb2b6c 100644 --- a/xCAT-server/lib/xcat/plugins/statelite.pm +++ b/xCAT-server/lib/xcat/plugins/statelite.pm @@ -173,11 +173,19 @@ sub process_request { # } #} + #store the image in the DB + if (!$imagename) { + my @ret=xCAT::SvrUtils->update_tables_with_diskless_image($osver, $arch, $profile, 'statelite'); + if ($ret[0] != 0) { + $callback->({error=>["Error when updating the osimage tables: " . $ret[1]]}); + } + $imagename="$osver-$arch-statelite-$profile" + } # now get the files for the node - my @synclist = xCAT::Utils->runcmd("ilitefile $osver-$arch-$profile", 0, 1); + my @synclist = xCAT::Utils->runcmd("ilitefile $imagename", 0, 1); if(!@synclist){ - $callback->({error=>["There are no files to sync for $osver-$arch-$profile. You have to have some files read/write filled out in the synclist table."],errorcode=>[1]}); + $callback->({error=>["There are no files to sync for $imagename. You have to have some files read/write filled out in the synclist table."],errorcode=>[1]}); return; } @@ -197,6 +205,8 @@ sub process_request { } liteMe($rootimg_dir,\@files, $callback); + + }