mirror of
https://github.com/xcat2/xcat-core.git
synced 2025-06-12 00:00:12 +00:00
add support on the noderes.netboot checking of nodeset
This commit is contained in:
@ -4533,4 +4533,56 @@ sub splitkcmdline{
|
||||
|
||||
return \%cmdhash;
|
||||
}
|
||||
|
||||
|
||||
###################################################################################
|
||||
#subroutine lookupNetboot
|
||||
#Usage: determine the possible noderes.netboot values of the osimage
|
||||
# according to the "osvers" and "osarch" attributes.
|
||||
#Input Params:
|
||||
# $osvers: the osname of the osimage,i.e,rhels7.1,sles11.3,ubuntu14.04.1 ...
|
||||
# $osarch: the osarch of the osimage,i.e, x86_64,ppc64,ppc64le ...
|
||||
#Return value:
|
||||
# a string of the possible noderes.netboot values delimited with comma ","
|
||||
# i.e, "pxe,xnba", empty on fail.
|
||||
###################################################################################
|
||||
|
||||
sub lookupNetboot{
|
||||
my $osvers=shift;
|
||||
if ( $osvers =~ /xCAT::Utils/ ){
|
||||
$osvers=shift;
|
||||
}
|
||||
my $osarch=shift;
|
||||
|
||||
my $ret="";
|
||||
my $osv;
|
||||
my $osn;
|
||||
my $osm;
|
||||
if ($osvers =~ /(\D+)(\d+)\.(\d+)/) {
|
||||
$osv = $1;
|
||||
$osn = $2;
|
||||
$osm = $3;
|
||||
|
||||
} elsif ($osvers =~ /(\D+)(\d+)/){
|
||||
$osv = $1;
|
||||
$osn = $2;
|
||||
$osm = 0;
|
||||
}
|
||||
|
||||
|
||||
if ($osarch =~ /^x86_64$/i){
|
||||
$ret= "xnba,pxe";
|
||||
}elsif($osarch =~ /^ppc64$/i){
|
||||
if(($osv =~ /rh/i and $osn < 7) or ($osv =~ /sles/i and $osn < 12)){
|
||||
$ret="yaboot";
|
||||
}else{
|
||||
$ret="grub2,grub2-tftp,grub2-http";
|
||||
}
|
||||
}elsif($osarch =~ /^ppc64le$/i or $osarch =~ /^ppc64el$/i){
|
||||
$ret="petiboot,grub2,grub2-tftp,grub2-http";
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
1;
|
||||
|
@ -87,7 +87,6 @@ sub setdestiny {
|
||||
my $req=shift;
|
||||
my $flag=shift;
|
||||
my $noupdate=shift;
|
||||
|
||||
$chaintab = xCAT::Table->new('chain',-create=>1);
|
||||
my @nodes=@{$req->{node}};
|
||||
|
||||
@ -180,6 +179,9 @@ sub setdestiny {
|
||||
}
|
||||
|
||||
my $nodetypetable = xCAT::Table->new('nodetype', -create=>1);
|
||||
my $noderestable = xCAT::Table->new('noderes', -create=>1);
|
||||
my $nbents = $noderestable->getNodeAttribs($req->{node}->[0],["netboot"]);
|
||||
my $curnetboot=$nbents->{netboot};
|
||||
if ($state ne 'osimage') {
|
||||
my $updateattribs;
|
||||
if ($target) {
|
||||
@ -191,7 +193,7 @@ sub setdestiny {
|
||||
my $nodearch=$2;
|
||||
foreach (@{$req->{node}}) {
|
||||
if ($archentries->{$_}->[0]->{supportedarchs} and $archentries->{$_}->[0]->{supportedarchs} !~ /(^|,)$nodearch(\z|,)/) {
|
||||
$callback->({errorcode=>1,error=>"Requested architecture ".$nodearch." is not one of the architectures supported by $_ (per nodetype.supportedarchs, it supports ".$archentries->{$_}->[0]->{supportedarchs}.")"});
|
||||
$callback->({errorcode=>[1],error=>"Requested architecture ".$nodearch." is not one of the architectures supported by $_ (per nodetype.supportedarchs, it supports ".$archentries->{$_}->[0]->{supportedarchs}.")"});
|
||||
return;
|
||||
}
|
||||
} #end foreach
|
||||
@ -207,17 +209,30 @@ sub setdestiny {
|
||||
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."});
|
||||
$errored =1; $callback->({errorcode=>[1],error=>"osimage.provmethod for $target must be set."});
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
$errored =1; $callback->({error=>"Cannot find the OS image $target on the osimage table."});
|
||||
$errored =1; $callback->({errorcode=>[1],error=>"Cannot find the OS image $target on the osimage table."});
|
||||
return;
|
||||
}
|
||||
|
||||
#if the noderes.netboot is invalid for the specified osimage provision
|
||||
#report error and exit
|
||||
my $netbootval=xCAT::Utils->lookupNetboot($ref->{osvers},$ref->{osarch});
|
||||
unless($netbootval =~ /$curnetboot/i){
|
||||
$errored =1;
|
||||
$callback->({errorcode=>[1],error=> [join(",",@{$req->{node}}).":stop configuration because $curnetboot DOES NOT work for provision of $target, please choose the correct noderes.netboot value in the subset \"$netbootval\",see description of 'netboot' attributes in 'tabdump -d noderes' for details."]});
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
my $updateattribs;
|
||||
$updateattribs->{provmethod}=$target;
|
||||
$updateattribs->{profile}=$ref->{profile};
|
||||
@ -226,12 +241,15 @@ sub setdestiny {
|
||||
my @tmpnodelist = @{$req->{node}};
|
||||
$nodetypetable->setNodesAttribs(\@tmpnodelist,$updateattribs);
|
||||
|
||||
|
||||
foreach my $tmpnode (@{$req->{node}}) {
|
||||
$state_hash{$tmpnode}=$state;
|
||||
}
|
||||
|
||||
} else {
|
||||
my @errornodes=();
|
||||
my $invalidosimghash;
|
||||
my @validnodes;
|
||||
my $updatestuff;
|
||||
my $nodetypetable = xCAT::Table->new('nodetype', -create=>1);
|
||||
my %ntents = %{$nodetypetable->getNodesAttribs($req->{node},"provmethod")};
|
||||
@ -242,6 +260,17 @@ sub setdestiny {
|
||||
my $osimagetable=xCAT::Table->new('osimage');
|
||||
(my $ref) = $osimagetable->getAttribs({imagename => $osimage}, 'provmethod', 'osvers', 'profile', 'osarch');
|
||||
if ($ref) {
|
||||
#check whether the noderes.netboot is set appropriately
|
||||
#if not,push the nodes into $invalidosimghash->{$osimage}->{netboot}
|
||||
my $netbootval=xCAT::Utils->lookupNetboot($ref->{osvers},$ref->{osarch});
|
||||
if($netbootval =~ /$curnetboot/i){
|
||||
push(@validnodes,$tmpnode);
|
||||
}else{
|
||||
push(@{$invalidosimghash->{$osimage}->{nodes}},$tmpnode);
|
||||
$invalidosimghash->{$osimage}->{netboot}=$netbootval;
|
||||
next;
|
||||
}
|
||||
|
||||
if ($ref->{provmethod}) {
|
||||
$state=$ref->{provmethod};
|
||||
$state_hash{$tmpnode}=$state;
|
||||
@ -252,16 +281,17 @@ sub setdestiny {
|
||||
$updatestuff->{$osimage}->{os}=$ref->{osvers};
|
||||
$updatestuff->{$osimage}->{arch}=$ref->{osarch};
|
||||
} else {
|
||||
$errored =1; $callback->({error=>"osimage.provmethod for $osimage must be set."});
|
||||
$errored =1; $callback->({errorcode=>[1],error=>"osimage.provmethod for $osimage must be set."});
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
$errored =1; $callback->({error=>"Cannot find the OS image $osimage on the osimage table."});
|
||||
$errored =1; $callback->({errorcode=>[1],error=>"Cannot find the OS image $osimage on the osimage table."});
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
my $nodes= $updatestuff->{$osimage}->{nodes};
|
||||
push (@$nodes, $tmpnode);
|
||||
push(@validnodes,$tmpnode);
|
||||
$state_hash{$tmpnode}=$updatestuff->{$osimage}->{state};
|
||||
}
|
||||
|
||||
@ -271,16 +301,31 @@ sub setdestiny {
|
||||
}
|
||||
|
||||
if (@errornodes) {
|
||||
$errored =1; $callback->({error=>"OS image name must be specified in nodetype.provmethod for nodes: @errornodes."});
|
||||
$errored =1; $callback->({errorcode=>[1],error=>"OS image name must be specified in nodetype.provmethod for nodes: @errornodes."});
|
||||
return;
|
||||
} else {
|
||||
foreach my $tmpimage (keys %$updatestuff) {
|
||||
my $updateattribs=$updatestuff->{$tmpimage};
|
||||
my @tmpnodelist = @{$updateattribs->{nodes}};
|
||||
|
||||
delete $updateattribs->{nodes}; #not needed for nodetype table
|
||||
delete $updateattribs->{state}; #node needed for nodetype table
|
||||
$nodetypetable->setNodesAttribs(\@tmpnodelist,$updateattribs);
|
||||
}
|
||||
}
|
||||
|
||||
#if any node with inappropriate noderes.netboot,report the error and return
|
||||
foreach my $tmpimage(keys %$invalidosimghash){
|
||||
$errored =1;
|
||||
$callback->({errorcode=>[1],error=> [join(",",@{$invalidosimghash->{$tmpimage}->{nodes}}).": stop configuration because $curnetboot DOES NOT work for provision of $tmpimage, please choose the correct noderes.netboot value in the subset \"$invalidosimghash->{$tmpimage}->{netboot}\",see description of 'netboot' attributes in 'tabdump -d noderes' for details."]});
|
||||
}
|
||||
|
||||
if("$errored" ne "0"){
|
||||
return;
|
||||
}
|
||||
|
||||
#$req->{node}=();
|
||||
#push(@{$req->{node}},@validnodes);
|
||||
#print Dumper($req->{node});
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -325,7 +370,7 @@ sub setdestiny {
|
||||
if ($errored) {
|
||||
my @myself = xCAT::NetworkUtils->determinehostname();
|
||||
my $myname = $myself[(scalar @myself)-1];
|
||||
$callback->({error=>"Some nodes failed to set up $state resources on server $myname, aborting"});
|
||||
$callback->({errorcode=>[1],error=>"Some nodes failed to set up $state resources on server $myname, aborting"});
|
||||
return;
|
||||
}
|
||||
|
||||
@ -337,17 +382,17 @@ sub setdestiny {
|
||||
if ($tempstate ne "winshell") {
|
||||
if ($ntent and $ntent->{os}) {
|
||||
$nstates{$_} .= " ".$ntent->{os};
|
||||
} else { $errored =1; $callback->({error=>"nodetype.os not defined for $_"}); }
|
||||
} else { $errored =1; $callback->({errorcode=>[1],error=>"nodetype.os not defined for $_"}); }
|
||||
} else {
|
||||
$nstates{$_} .= " winpe";
|
||||
}
|
||||
if ($ntent and $ntent->{arch}) {
|
||||
$nstates{$_} .= "-".$ntent->{arch};
|
||||
} else { $errored =1; $callback->({error=>"nodetype.arch not defined for $_"}); }
|
||||
} else { $errored =1; $callback->({errorcode=>[1],error=>"nodetype.arch not defined for $_"}); }
|
||||
if (($tempstate ne "winshell") && ($tempstate ne "sysclone")) {
|
||||
if ($ntent and $ntent->{profile}) {
|
||||
$nstates{$_} .= "-".$ntent->{profile};
|
||||
} else { $errored =1; $callback->({error=>"nodetype.profile not defined for $_"}); }
|
||||
} else { $errored =1; $callback->({errorcode=>[1],error=>"nodetype.profile not defined for $_"}); }
|
||||
}
|
||||
if ($errored) {return;}
|
||||
#statelite
|
||||
@ -507,7 +552,7 @@ sub setdestiny {
|
||||
}
|
||||
}
|
||||
}
|
||||
#if ($provmethod ne 'install') {
|
||||
#if ($provmethod ne 'install')
|
||||
#fix bug: in sysclone, provmethod attribute gets cleared
|
||||
if ($provmethod ne 'install' && $provmethod ne 'sysclone') {
|
||||
push(@nodestoblank, $_);
|
||||
|
Reference in New Issue
Block a user