From 81306eb16836d0c7a535f3ae14e20184a8471e0e Mon Sep 17 00:00:00 2001 From: linggao Date: Tue, 22 Sep 2009 15:37:40 +0000 Subject: [PATCH] osimage support for nodeset command, phase 1 git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@4198 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server/lib/xcat/plugins/destiny.pm | 83 +++++++++++++++++++------ xCAT-server/lib/xcat/plugins/pxe.pm | 15 ++--- xCAT-server/lib/xcat/plugins/yaboot.pm | 13 ++-- 3 files changed, 79 insertions(+), 32 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/destiny.pm b/xCAT-server/lib/xcat/plugins/destiny.pm index fce71e6b8..5ffaacf6d 100644 --- a/xCAT-server/lib/xcat/plugins/destiny.pm +++ b/xCAT-server/lib/xcat/plugins/destiny.pm @@ -83,13 +83,27 @@ sub setdestiny { my $state = $req->{arg}->[0]; my %nstates; if ($state eq "enact") { + my $nodetypetab = xCAT::Table->new('nodetype',-create=>1); my %nodestates; my %stents = %{$chaintab->getNodesAttribs($req->{node},"currstate")}; + my %ntents = %{$nodetypetab->getNodesAttribs($req->{node},"provmethod")}; my $state; + my $sninit=0; + if (exists($req->{inittime})) { # this is called in AAsn.pm + $sninit=$req->{inittime}->[0]; + } + foreach (@{$req->{node}}) { #First, build a hash of all of the states to attempt to keep things as aggregated as possible if ($stents{$_}->[0]->{currstate}) { $state = $stents{$_}->[0]->{currstate}; $state =~ s/ .*//; + #get the osimagename if nodetype.provmethod has osimage specified + if (($sninit ==1) && (($state eq 'install') || ($state eq 'netboot'))) { + my $osimage=$ntents{$_}->[0]->{provmethod}; + if (($osimage) && ($osimage ne 'install') && ($osimage ne 'netboot')) { + $state="osimage=$osimage"; + } + } push @{$nodestates{$state}},$_; } } @@ -123,39 +137,70 @@ sub setdestiny { if ($ient->{kcmdline}) { $hash->{kcmdline} = $ient->{kcmdline} } $bptab->setNodeAttribs($_,$hash); } - } elsif ($state =~ /^install[=\$]/ or $state eq 'install' or $state =~ /^netboot[=\$]/ or $state eq 'netboot' or $state eq "image" or $state eq "winshell") { + } elsif ($state =~ /^install[=\$]/ or $state eq 'install' or $state =~ /^netboot[=\$]/ or $state eq 'netboot' or $state eq "image" or $state eq "winshell" or $state =~ /^osimage/) { chomp($state); my $target; if ($state =~ /=/) { ($state,$target) = split /=/,$state,2; } - if ($target) { + my $nodetypetable = xCAT::Table->new('nodetype', -create=>1); + if ($state eq 'install' or $state eq 'netboot') { my $updateattribs; - my $nodetypetable = xCAT::Table->new('nodetype',-create=>1); - my $archentries = $nodetypetable->getNodesAttribs($req->{node},['supportedarchs']); - if ($target =~ /(.*)-(.*)-(.*)/) { - $updateattribs->{os}=$1; - $updateattribs->{arch}=$2; - $updateattribs->{profile}=$3; - foreach (@{$req->{node}}) { - if ($archentries->{$_}->[0]->{supportedarchs} and $archentries->{$_}->[0]->{supportedarchs} !~ /(^|,)$2(\z|,)/) { - $callback->({errorcode=>1,error=>"Requested architecture ".$updateattribs->{arch}." is not one of the architectures supported by $_ (per nodetype.supportedarchs, it supports ".$archentries->{$_}->[0]->{supportedarchs}.")"}); - return; - } + if ($target) { + my $archentries = $nodetypetable->getNodesAttribs($req->{node},['supportedarchs']); + if ($target =~ /(.*)-(.*)-(.*)/) { + $updateattribs->{os}=$1; + $updateattribs->{arch}=$2; + $updateattribs->{profile}=$3; + foreach (@{$req->{node}}) { + if ($archentries->{$_}->[0]->{supportedarchs} and $archentries->{$_}->[0]->{supportedarchs} !~ /(^|,)$2(\z|,)/) { + $callback->({errorcode=>1,error=>"Requested architecture ".$updateattribs->{arch}." is not one of the architectures supported by $_ (per nodetype.supportedarchs, it supports ".$archentries->{$_}->[0]->{supportedarchs}.")"}); + return; + } + } #end foreach + } else { + $updateattribs->{profile}=$target; } - } else { - $updateattribs->{profile}=$target; - } + } #end if($target) + $updateattribs->{provmethod}=$state; $nodetypetable->setNodesAttribs($req->{node},$updateattribs); } - + if ($state eq 'osimage') { + if (@{$req->{node}} == 0) { return;} + if ($target) { + my $osimagetable=xCAT::Table->new('osimage'); + (my $ref) = $osimagetable->getAttribs({imagename => $target}, 'provmethod', 'osvers', 'profile', 'osarch'); + if ($ref) { + if ($ref->{provmethod}) { + $state=$ref->{provmethod}; + } else { + $errored =1; $callback->({error=>"osimage.provmethod for $target must be set."}); + return; + } + } else { + $errored =1; $callback->({error=>"Cannot find the OS image $target on the osimage table."}); + return; + } + my $updateattribs; + $updateattribs->{provmethod}=$target; + $updateattribs->{profile}=$ref->{profile}; + $updateattribs->{os}=$ref->{osvers}; + $updateattribs->{arch}=$ref->{osarch}; + $nodetypetable->setNodesAttribs($req->{node},$updateattribs); + } else { + $errored =1; $callback->({error=>"OS image name must be specified."}); + return; + } + } + +#print Dumper($req); $errored=0; $subreq->({command=>["mk$state"], node=>$req->{node}}, \&relay_response); if ($errored) { return; } - my $nodetype = xCAT::Table->new('nodetype'); - my $ntents = $nodetype->getNodesAttribs($req->{node},[qw(os arch profile)]); + + my $ntents = $nodetypetable->getNodesAttribs($req->{node},[qw(os arch profile)]); foreach (@{$req->{node}}) { $nstates{$_} = $state; #local copy of state variable for mod my $ntent = $ntents->{$_}->[0]; #$nodetype->getNodeAttribs($_,[qw(os arch profile)]); diff --git a/xCAT-server/lib/xcat/plugins/pxe.pm b/xCAT-server/lib/xcat/plugins/pxe.pm index 67dfe45da..ee70b6b19 100644 --- a/xCAT-server/lib/xcat/plugins/pxe.pm +++ b/xCAT-server/lib/xcat/plugins/pxe.pm @@ -14,7 +14,7 @@ my $tftpdir = "/tftpboot"; #my $dhcpver = 3; my %usage = ( - "nodeset" => "Usage: nodeset [install|shell|boot|runcmd=bmcsetup|netboot|iscsiboot]", + "nodeset" => "Usage: nodeset [install|shell|boot|runcmd=bmcsetup|netboot|iscsiboot|osimage=]", ); sub handled_commands { return { @@ -418,11 +418,15 @@ sub process_request { + my $inittime=0; + if (exists($request->{inittime})) { $inittime= $request->{inittime}->[0];} + if (!$inittime) { $inittime=0;} $errored=0; unless ($args[0] eq 'stat') { # or $args[0] eq 'enact') { - $sub_req->({command=>['setdestiny'], - node=>\@nodes, - arg=>[$args[0]]},\&pass_along); + $sub_req->({command=>['setdestiny'], + node=>\@nodes, + inittime=>[$inittime], + arg=>[$args[0]]},\&pass_along); } if ($errored) { return; } #Time to actually configure the nodes, first extract database data with the scalable calls @@ -449,9 +453,6 @@ sub process_request { } } - my $inittime=0; - if (exists($request->{inittime})) { $inittime= $request->{inittime}->[0];} - if (!$inittime) { $inittime=0;} #dhcp stuff -- inittime is set when xcatd on sn is started unless (($args[0] eq 'stat') || ($inittime)) { diff --git a/xCAT-server/lib/xcat/plugins/yaboot.pm b/xCAT-server/lib/xcat/plugins/yaboot.pm index 09f51e38b..31cd9ce36 100644 --- a/xCAT-server/lib/xcat/plugins/yaboot.pm +++ b/xCAT-server/lib/xcat/plugins/yaboot.pm @@ -17,7 +17,7 @@ my $tftpdir = "/tftpboot"; #my $dhcpver = 3; my %usage = ( - "nodeset" => "Usage: nodeset [install|shell|boot|runcmd=bmcsetup|netboot|iscsiboot]", + "nodeset" => "Usage: nodeset [install|shell|boot|runcmd=bmcsetup|netboot|iscsiboot|osimage=]", ); sub handled_commands { return { @@ -367,11 +367,15 @@ sub process_request { } #back to normal business + my $inittime=0; + if (exists($request->{inittime})) { $inittime= $request->{inittime}->[0];} + if (!$inittime) { $inittime=0;} $errored=0; unless ($args[0] eq 'stat') { # or $args[0] eq 'enact') { $sub_req->({command=>['setdestiny'], - node=>\@nodes, - arg=>[$args[0]]},\&pass_along); + node=>\@nodes, + inittime=>[$inittime], + arg=>[$args[0]]},\&pass_along); } if ($errored) { return; } @@ -400,9 +404,6 @@ sub process_request { } } - my $inittime=0; - if (exists($request->{inittime})) { $inittime= $request->{inittime}->[0];} - if (!$inittime) { $inittime=0;} my @normalnodeset = keys %normalnodes; my @breaknetboot=keys %breaknetbootnodes; #print "yaboot:inittime=$inittime; normalnodeset=@normalnodeset; breaknetboot=@breaknetboot\n";