From 7e52eff67860de3cbd34f13408ac7c070b839975 Mon Sep 17 00:00:00 2001 From: linggao Date: Fri, 26 Sep 2008 23:07:45 +0000 Subject: [PATCH] more on node status. supports aix git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@2239 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- perl-xCAT/xCAT/GlobalDef.pm | 2 +- perl-xCAT/xCAT/PPC.pm | 28 ++-- perl-xCAT/xCAT/Postage.pm | 40 +---- perl-xCAT/xCAT/Schema.pm | 2 +- perl-xCAT/xCAT/Utils.pm | 152 +++++++++++++++++- .../lib/xcat/monitoring/monitorctrl.pm | 25 ++- xCAT-server/lib/xcat/plugins/aixinstall.pm | 89 +++++++++- xCAT-server/lib/xcat/plugins/blade.pm | 14 +- xCAT-server/lib/xcat/plugins/destiny.pm | 11 +- xCAT-server/lib/xcat/plugins/ipmi.pm | 14 +- xCAT-server/lib/xcat/plugins/pxe.pm | 31 ++++ xCAT-server/lib/xcat/plugins/updatenode.pm | 5 +- xCAT-server/lib/xcat/plugins/xen.pm | 14 +- xCAT-server/lib/xcat/plugins/yaboot.pm | 30 ++++ xCAT/postscripts/otherpkgs | 57 +++---- xCAT/postscripts/xcataixpost | 42 ++++- xCAT/postscripts/xcatdsklspost | 11 +- 17 files changed, 447 insertions(+), 120 deletions(-) diff --git a/perl-xCAT/xCAT/GlobalDef.pm b/perl-xCAT/xCAT/GlobalDef.pm index b642ddce4..ab29ed600 100644 --- a/perl-xCAT/xCAT/GlobalDef.pm +++ b/perl-xCAT/xCAT/GlobalDef.pm @@ -37,7 +37,7 @@ $::STATUS_DISCOVERING="discovering"; $::STATUS_DEFINED="defined"; $::STATUS_UNKNOWN="unknown"; -#defined->[discovering]->installing->booting->->alive, defined->netbooting->booted->alive, alive/unreachable->booting->->alive, powering-off->unreachable, alive->unreachable +#defined->[discovering]->installing->booting->booted->alive, defined->netbooting->booted->alive, alive/unreachable->booting->booted->alive, powering-off->unreachable, alive->unreachable %::NEXT_NODESTAT_VAL=( $::STATUS_DEFINED=>{$::STATUS_DISCOVERING=>1, $::STATUS_INSTALLING=>1, $::STATUS_NETBOOTING=>1, $::STATUS_POWERING_OFF=>1, $::STATUS_BOOTING=>1}, $::STATUS_DISCOVERING=>{$::STATUS_INSTALLING=>1}, diff --git a/perl-xCAT/xCAT/PPC.pm b/perl-xCAT/xCAT/PPC.pm index 24535a95c..3d877261f 100644 --- a/perl-xCAT/xCAT/PPC.pm +++ b/perl-xCAT/xCAT/PPC.pm @@ -147,14 +147,13 @@ sub process_command { if ($subcommand ne 'off') { #get the current nodeset stat if (@allnodes>0) { - my $chaintab = xCAT::Table->new('chain'); - my $tabdata=$chaintab->getNodesAttribs(\@allnodes,['node', 'currstate']); - foreach my $node (@allnodes) { - my $tmp1=$tabdata->{$node}->[0]; - if ($tmp1) { - my $currstate=$tmp1->{currstate}; - if ($currstate =~ /^install/) { $nodestat{$node}=$::STATUS_INSTALLING;} - elsif ($currstate =~ /^netboot/) { $nodestat{$node}=$::STATUS_NETBOOTING;} + my $nsh={}; + my ($ret, $msg)=xCAT::Utils->getNodesetStates(\@allnodes, $nsh); + if ($ret) { trace( $request, $msg );} + else { + foreach (keys %$nsh) { + my $currstate=$nsh->{$_}; + $nodestat{$_}=xCAT_monitoring::monitorctrl->getNodeStatusFromNodesetState($currstate, "rpower"); } } } @@ -164,7 +163,18 @@ sub process_command { $check=1; my $noderange = $request->{node}; my @allnodes=@$noderange; - foreach (@allnodes) { $nodestat{$_}=$::STATUS_NETBOOTING;} + #get the current nodeset stat + if (@allnodes>0) { + my $nsh={}; + my ($ret, $msg)=xCAT::Utils->getNodesetStates(\@allnodes, $nsh); + if ($ret) { trace( $request, $msg );} + else { + foreach (keys %$nsh) { + my $currstate=$nsh->{$_}; + $nodestat{$_}=xCAT_monitoring::monitorctrl->getNodeStatusFromNodesetState($currstate, "netboot"); + } + } + } } foreach (keys %nodestat) { print "node=$_,status=" . $nodestat{$_} ."\n"; } #Ling:remove diff --git a/perl-xCAT/xCAT/Postage.pm b/perl-xCAT/xCAT/Postage.pm index 470c13ba1..3597360e6 100644 --- a/perl-xCAT/xCAT/Postage.pm +++ b/perl-xCAT/xCAT/Postage.pm @@ -3,6 +3,7 @@ package xCAT::Postage; use xCAT::Table; use xCAT::MsgUtils; use xCAT::NodeRange; +use xCAT::Utils; use Data::Dumper; use strict; BEGIN @@ -286,44 +287,7 @@ sub makescript { #----------------------------------------------------------------------------- sub getnodesetstate { my $node=shift; - my $state="undefined"; - - #get boot type (pxe or yaboot) for the node - my $noderestab=xCAT::Table->new('noderes',-create=>0); - my $ent=$noderestab->getNodeAttribs($node,[qw(netboot)]); - if ($ent->{netboot}) { - my $boottype=$ent->{netboot}; - - #get nodeset state from corresponding files - my $bootfilename; - if ($boottype eq "pxe") { $bootfilename="/tftpboot/pxelinux.cfg/$node";} - elsif ($boottype eq "yaboot") { $bootfilename="/tftpboot/etc/$node";} - else { $bootfilename="/tftpboot/pxelinux.cfg/$node"; } - - if (-r $bootfilename) { - my $fhand; - open ($fhand, $bootfilename); - my $headline = <$fhand>; - close $fhand; - $headline =~ s/^#//; - chomp($headline); - my @a=split(' ', $headline); - $state = $a[0]; - } else { - xCAT::MsgUtils->message('S', "getpostscripts: file $bootfilename cannot be accessed."); - } - } else { - xCAT::MsgUtils->message('S', "getpostscripts: noderes.netboot for node $node not defined."); - } - - #get the nodeset state from the chain table as a backup. - if ($state eq "undefined") { - my $chaintab = xCAT::Table->new('chain'); - my $stref = $chaintab->getNodeAttribs($node,['currstate']); - if ($stref and $stref->{currstate}) { $state=$stref->{currstate}; } - } - - return $state; + return xCAT::Utils->get_nodeset_state($node); } sub get_otherpkg_file_name { diff --git a/perl-xCAT/xCAT/Schema.pm b/perl-xCAT/xCAT/Schema.pm index 25330cdb4..8f2afd55e 100644 --- a/perl-xCAT/xCAT/Schema.pm +++ b/perl-xCAT/xCAT/Schema.pm @@ -263,7 +263,7 @@ nodelist => { descriptions => { node => 'The hostname of a node in the cluster.', groups => "A comma-delimited list of groups this node is a member of. Group names are arbitrary, except all nodes should be part of the 'all' group.", - status => 'The current status of this node. This attribute will be set by xCAT software. Valid values: defined, booting, netbooting, booted, discovering, installing, alive, powering-off, unreachable. The default value is defined. The possible status change sequenses are: defined->[discovering]->installing->booting->alive, defined->netbooting->booted->alive, alive/unreachable->booting->alive, alive->powering-off->unreachable, alive->unreachable', + status => 'The current status of this node. This attribute will be set by xCAT software. Valid values: defined, booting, netbooting, booted, discovering, installing, alive, powering-off, unreachable. The default value is defined. The possible status change sequenses are: defined->[discovering]->installing->booting->booted->alive, defined->netbooting->booted->alive, alive/unreachable->booting->booted->alive, alive->powering-off->unreachable, alive->unreachable', comments => 'Any user-written notes.', disable => "Set to 'yes' or '1' to comment out this row.", }, diff --git a/perl-xCAT/xCAT/Utils.pm b/perl-xCAT/xCAT/Utils.pm index 05d155977..b93cff5a2 100644 --- a/perl-xCAT/xCAT/Utils.pm +++ b/perl-xCAT/xCAT/Utils.pm @@ -1,6 +1,11 @@ #!/usr/bin/env perl # IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html package xCAT::Utils; +BEGIN +{ + $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; +} +use lib "$::XCATROOT/lib/perl"; require xCAT::Table; use POSIX qw(ceil); use Socket; @@ -10,6 +15,7 @@ require Data::Dumper; require xCAT::NodeRange; require DBI; + our @ISA = qw(Exporter); our @EXPORT_OK = qw(genpassword); @@ -590,7 +596,7 @@ sub add_cron_job #add new entries to the cron tab push(@newtabs, $newentry); my $tabname = ""; - if (xCAT::Utils::isLinux) { $tabname = "-"; } + if (xCAT::Utils->isLinux()) { $tabname = "-"; } open(CRONTAB, "|/usr/bin/crontab $tabname") or return (1, "cannot open crontab."); foreach (@newtabs) { print CRONTAB $_ . "\n"; } @@ -649,7 +655,7 @@ sub remove_cron_job #refresh the cron my $tabname = ""; - if (xCAT::Utils::isLinux) { $tabname = "-"; } + if (xCAT::Utils->isLinux()) { $tabname = "-"; } open(CRONTAB, "|/usr/bin/crontab $tabname") or return (1, "cannot open crontab."); foreach (@newtabs) { print CRONTAB $_ . "\n"; } @@ -2462,4 +2468,146 @@ sub runxcatd } return 0; } + +#------------------------------------------------------------------------------- + +=head3 getNodesetStates + get current nodeset stat for the given nodes + Arguments: + nodes -- a pointer to an array of nodes + hashref -- A pointer to a hash that contains the nodeset status. + Returns: + (ret code, error message) + +=cut + +#------------------------------------------------------------------------------- +sub getNodesetStates{ + my $noderef=shift; + if ($noderef =~ /xCAT::Utils/) { + $noderef=shift; + } + my @nodes=@$noderef; + my $hashref=shift; + + if (@nodes>0) { + my $tab = xCAT::Table->new('noderes'); + if (! $tab) { return (1, "Unable to open noderes table.");} + + #initialize all nodes + foreach (@nodes) { $hashref->{$_}="undefined";} + + my @aixnodes=(); + my @pxenodes=(); + my @yabootnodes=(); + my $tabdata=$tab->getNodesAttribs(\@nodes,['node', 'netboot']); + foreach my $node (@nodes) { + my $nb="aixinstall"; + my $tmp1=$tabdata->{$node}->[0]; + if (($tmp1) && ($tmp1->{netboot})) { $nb=$tmp1->{netboot};} + if ($nb eq "yaboot") { + push(@yabootnodes,$node); + } elsif ($nb eq "pxe") { + push(@pxenodes,$node); + } elsif ($nb eq "aixinstall") { + push(@aixnodes,$node); + } + } + + my @retarray; + my $retcode=0; + my $errormsg; + # print "ya=@yabootnodes, pxe=@pxenodes, aix=@aixnodes\n"; + if (@yabootnodes > 0) { + use xCAT_plugin::yaboot; + @retarray=xCAT_plugin::yaboot::getNodesetStates(\@yabootnodes, $hashref); + if ($retarray[0]) { + $retcode=$retarray[0]; + $errormsg .= $retarray[1]; + xCAT::MsgUtils->message('E',$retarray[1]);} + } + if (@pxenodes > 0) { + use xCAT_plugin::pxe; + @retarray=xCAT_plugin::pxe::getNodesetStates(\@pxenodes, $hashref); + if ($retarray[0]) { + $retcode=$retarray[0]; + $errormsg .= $retarray[1]; + xCAT::MsgUtils->message('E',$retarray[1]); + } + } + if (@aixnodes > 0) { + use xCAT_plugin::aixinstall; + @retarray=xCAT_plugin::aixinstall::getNodesetStates(\@aixnodes, $hashref); + if ($retarray[0]) { + $retcode=$retarray[0]; + $errormsg .= $retarray[1]; + xCAT::MsgUtils->message('E',$retarray[1]); + } + } + } + return (0, ""); +} + + +#------------------------------------------------------------------------------- + +=head3 get_nodeset_state + get current nodeset stat for the given node. + Arguments: + nodes -- node name. + Returns: + nodesetstate + +=cut + +#------------------------------------------------------------------------------- +sub get_nodeset_state { + my $node=shift; + if ($node =~ /xCAT::Utils/) { + $node=shift; + } + + my $state="undefined"; + + #get boot type (pxe, yaboot or aixinstall) for the node + my $noderestab=xCAT::Table->new('noderes',-create=>0); + my $ent=$noderestab->getNodeAttribs($node,[qw(netboot)]); + if ($ent && $ent->{netboot}) { + my $boottype=$ent->{netboot}; + #get nodeset state from corresponding files + if ($boottype eq "pxe") { + use xCAT_plugin::pxe; + my $tmp=xCAT_plugin::pxe::getstate($node); + my @a=split(' ', $tmp); + $state = $a[0]; + + } + elsif ($boottype eq "yaboot") { + use xCAT_plugin::yaboot; + my $tmp=xCAT_plugin::yaboot::getstate($node); + my @a=split(' ', $tmp); + $state = $a[0]; + } + elsif ($boottype eq "aixinstall") { + use xCAT_plugin::aixinstall; + $state=xCAT_plugin::aixinstall::getNodesetState($node); + } + } + else { #default to AIX because AIX does not set noderes.netboot value + use xCAT_plugin::aixinstall; + $state=xCAT_plugin::aixinstall::getNodesetState($node); + } + + #get the nodeset state from the chain table as a backup. + if ($state eq "undefined") { + my $chaintab = xCAT::Table->new('chain'); + my $stref = $chaintab->getNodeAttribs($node,['currstate']); + if ($stref and $stref->{currstate}) { $state=$stref->{currstate}; } + } + + return $state; +} + + + 1; diff --git a/xCAT-server/lib/xcat/monitoring/monitorctrl.pm b/xCAT-server/lib/xcat/monitoring/monitorctrl.pm index cfd8ea724..61570ac5f 100644 --- a/xCAT-server/lib/xcat/monitoring/monitorctrl.pm +++ b/xCAT-server/lib/xcat/monitoring/monitorctrl.pm @@ -528,7 +528,30 @@ sub processMonitoringTableChanges { - +#-------------------------------------------------------------------------------- +=head3 getNodeStatusFromNodesetState + This routine returns the node status string for the given nodeset string +=cut +#-------------------------------------------------------------------------------- +sub getNodeStatusFromNodesetState { + my $nodeset=shift; + if ($nodeset =~ /xCAT_monitoring::monitorctrl/) { + $nodeset=shift; + } + my $action=shift; + + my $status=$::STATUS_BOOTING; + if ($nodeset =~ /^install/) { $status=$::STATUS_INSTALLING; } #linux + elsif ($nodeset =~ /^netboot/) { $status=$::STATUS_NETBOOTING;} #linux + elsif ($nodeset =~ /^boot/) { $status=$::STATUS_BOOTING;} #linux + elsif ($nodeset =~ /^discover/) { $status=$::STATUS_DISCOVERING;} #linux + elsif (($nodeset =~ /^diskless/) || ($nodeset =~ /^dataless/)) { $status=$::STATUS_NETBOOTING;} #aix + elsif ($nodeset =~ /^standalone/) { #aix + if ($action eq "rnetboot") { $status=$::STATUS_INSTALLING; } + else { $status=$::STATUS_BOOTING; } + } + return $status; +} #-------------------------------------------------------------------------------- =head3 setNodeStatusAttributes diff --git a/xCAT-server/lib/xcat/plugins/aixinstall.pm b/xCAT-server/lib/xcat/plugins/aixinstall.pm index c19eed227..2a15a526a 100644 --- a/xCAT-server/lib/xcat/plugins/aixinstall.pm +++ b/xCAT-server/lib/xcat/plugins/aixinstall.pm @@ -9,7 +9,11 @@ ##################################################### package xCAT_plugin::aixinstall; - +BEGIN +{ + $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; +} +use lib "$::XCATROOT/lib/perl"; use Sys::Hostname; use File::Basename; use xCAT::NodeRange; @@ -4780,13 +4784,13 @@ sub nimnodeset_usage =head3 is_me - returns 1 if the hostname is the node I'm running on + returns 1 if the hostname is the node I am running on Arguments: none Returns: - 1 - this is the node I'm running on - 0 - this is not the node I'm running on + 1 - this is the node I am running on + 0 - this is not the node I am running on Globals: none Error: @@ -4820,4 +4824,81 @@ sub is_me } } +#---------------------------------------------------------------------------- +=head3 getNodesetStates + returns the nodeset state for the given nodes. The possible nodeset + states are: diskless, dataless, standalone and undefined. + Arguments: + nodes --- a pointer to an array of nodes + states -- a pointer to a hash table. This hash will be filled by this + function node and key and the nodeset stat as the value. + Returns: + (return code, error message) +=cut +#----------------------------------------------------------------------------- +sub getNodesetStates { + my $noderef=shift; + if ($noderef =~ /xCAT_plugin::aixinstall/) { + $noderef=shift; + } + my @nodes=@$noderef; + my $hashref=shift; + + if (@nodes>0) { + my $nttab = xCAT::Table->new('nodetype'); + my $nimtab = xCAT::Table->new('nimimage'); + if (! $nttab) { return (1, "Unable to open nodetype table.");} + if (! $nimtab) { return (1, "Unable to open nimimage table.");} + + my %nimimage=(); + my $nttabdata=$nttab->getNodesAttribs(\@nodes,['node', 'profile']); + foreach my $node (@nodes) { + my $tmp1=$nttabdata->{$node}->[0]; + if ($tmp1) { + my $profile=$tmp1->{profile}; + if ( ! exists($nimimage{$profile})) { + (my $tmp)=$nimtab->getAttribs({'imagename'=>$profile},'nimtype'); + if (defined($tmp)) { $nimimage{$profile} = $tmp->{nimtype}; } + else { $nimimage{$profile}="undefined";} + } + $hashref->{$node}=$nimimage{$profile}; + } else {$hashref->{$node}="undefined";} + } + $nttab->close(); + $nimtab->close(); + } + return (0, ""); +} + +#------------------------------------------------------------------------------- + +=head3 getNodesetState + get current nodeset stat for the given node. + Arguments: + nodes -- node name. + Returns: + nodesetstate + +=cut + +#------------------------------------------------------------------------------- +sub getNodesetState { + my $node = shift; + my $state="undefined"; + my $nttab = xCAT::Table->new('nodetype'); + my $nimtab = xCAT::Table->new('nimimage'); + if ($nttab && $nimtab) { + my $tmp1 = $nttab->getNodeAttribs($node,['profile']); + if ($tmp1 && $tmp1->{profile}) { + my $profile=$tmp1->{profile}; + my $tmp2=$nimtab->getAttribs({'imagename'=>$profile},'nimtype'); + if (defined($tmp2)) { $state = $tmp2->{nimtype}; } + } + $nttab->close(); + $nimtab->close(); + } + + return $state; +} + 1; diff --git a/xCAT-server/lib/xcat/plugins/blade.pm b/xCAT-server/lib/xcat/plugins/blade.pm index cb9ef3ad4..ade74eda0 100644 --- a/xCAT-server/lib/xcat/plugins/blade.pm +++ b/xCAT-server/lib/xcat/plugins/blade.pm @@ -2669,14 +2669,12 @@ sub dompa { if ($args->[0] ne 'off') { #get the current nodeset stat if (@allnodes>0) { - my $chaintab = xCAT::Table->new('chain'); - my $tabdata=$chaintab->getNodesAttribs(\@allnodes,['node', 'currstate']); - foreach my $node (@allnodes) { - my $tmp1=$tabdata->{$node}->[0]; - if ($tmp1) { - my $currstate=$tmp1->{currstate}; - if ($currstate =~ /^install/) { $nodestat{$node}=$::STATUS_INSTALLING;} - elsif ($currstate =~ /^netboot/) { $nodestat{$node}=$::STATUS_NETBOOTING;} + my $nsh={}; + my ($ret, $msg)=xCAT::Utils->getNodesetStates(\@allnodes, $nsh); + if (!$ret) { + foreach (keys %$nsh) { + my $currstate=$nsh->{$_}; + $nodestat{$_}=xCAT_monitoring::monitorctrl->getNodeStatusFromNodesetState($currstate, "rpower"); } } } diff --git a/xCAT-server/lib/xcat/plugins/destiny.pm b/xCAT-server/lib/xcat/plugins/destiny.pm index 7a66f5e5a..0f7c3ed38 100644 --- a/xCAT-server/lib/xcat/plugins/destiny.pm +++ b/xCAT-server/lib/xcat/plugins/destiny.pm @@ -231,8 +231,11 @@ sub nextdestiny { $chaintab->setNodeAttribs($node,$ref); #$ref is in a state to commit back to db #collect node status for certain states - if ($ref->{currstate} =~ /^boot/) { - my $stat="booting"; + my $stat; + if ($ref->{currstate} =~ /^boot/) { $stat=$::STATUS_BOOTING; } + elsif ($ref->{currstate} =~ /^discover/) { $stat=$::STATUS_DISCOVERING; } + + if ($stat) { if (exists($node_status{$stat})) { my $pa=$node_status{$stat}; push(@$pa, $node); @@ -249,7 +252,9 @@ sub nextdestiny { } #setup the nodelist.status - xCAT_monitoring::monitorctrl::setNodeStatusAttributes(\%node_status, 1); + if (keys(%node_status) > 0) { + xCAT_monitoring::monitorctrl::setNodeStatusAttributes(\%node_status, 1); + } if ($callnodeset) { $subreq->({command=>['nodeset'], diff --git a/xCAT-server/lib/xcat/plugins/ipmi.pm b/xCAT-server/lib/xcat/plugins/ipmi.pm index b790fa76d..6cf514843 100644 --- a/xCAT-server/lib/xcat/plugins/ipmi.pm +++ b/xCAT-server/lib/xcat/plugins/ipmi.pm @@ -5567,14 +5567,12 @@ sub process_request { if ($extrargs->[0] ne 'off') { #get the current nodeset stat if (@allnodes>0) { - my $chaintab = xCAT::Table->new('chain'); - my $tabdata=$chaintab->getNodesAttribs(\@allnodes,['node', 'currstate']); - foreach my $node (@allnodes) { - my $tmp1=$tabdata->{$node}->[0]; - if ($tmp1) { - my $currstate=$tmp1->{currstate}; - if ($currstate =~ /^install/) { $nodestat{$node}=$::STATUS_INSTALLING;} - elsif ($currstate =~ /^netboot/) { $nodestat{$node}=$::STATUS_NETBOOTING;} + my $nsh={}; + my ($ret, $msg)=xCAT::Utils->getNodesetStates(\@allnodes, $nsh); + if (!$ret) { + foreach (keys %$nsh) { + my $currstate=$nsh->{$_}; + $nodestat{$_}=xCAT_monitoring::monitorctrl->getNodeStatusFromNodesetState($currstate, "rpower"); } } } diff --git a/xCAT-server/lib/xcat/plugins/pxe.pm b/xCAT-server/lib/xcat/plugins/pxe.pm index 5c684821c..ab0028f76 100644 --- a/xCAT-server/lib/xcat/plugins/pxe.pm +++ b/xCAT-server/lib/xcat/plugins/pxe.pm @@ -303,4 +303,35 @@ sub process_request { } +#---------------------------------------------------------------------------- +=head3 getNodesetStates + returns the nodeset state for the given nodes. The possible nodeset + states are: netboot, install, boot and discover. + Arguments: + nodes --- a pointer to an array of nodes + states -- a pointer to a hash table. This hash will be filled by this + function node and key and the nodeset stat as the value. + Returns: + (return code, error message) +=cut +#----------------------------------------------------------------------------- +sub getNodesetStates { + my $noderef=shift; + if ($noderef =~ /xCAT_plugin::pxe/) { + $noderef=shift; + } + my @nodes=@$noderef; + my $hashref=shift; + + if (@nodes>0) { + foreach my $node (@nodes) { + my $tmp=getstate($node); + my @a=split(' ', $tmp); + $stat = $a[0]; + $hashref->{$node}=$stat; + } + } + return (0, ""); +} + 1; diff --git a/xCAT-server/lib/xcat/plugins/updatenode.pm b/xCAT-server/lib/xcat/plugins/updatenode.pm index 2968d1bba..058c07857 100644 --- a/xCAT-server/lib/xcat/plugins/updatenode.pm +++ b/xCAT-server/lib/xcat/plugins/updatenode.pm @@ -233,7 +233,7 @@ sub updatenode { my $localhostname=hostname(); my $nodestring=join(',', @$nodes); - print "postscripts=$postscripts, nodestring=$nodestring\n"; + #print "postscripts=$postscripts, nodestring=$nodestring\n"; if ($nodestring) { my $output; @@ -241,8 +241,7 @@ sub updatenode { $output=`XCATBYPASS=Y $::XCATROOT/bin/xdsh $nodestring -e /install/postscripts/xcatdsklspost 1 $postscripts 2>&1`; } else { - $output="This function is not supported on AIX."; - #$output=`XCATBYPASS=Y $::XCATROOT/bin/xdsh $nodestring -e /install/postscripts/xcataixpost 1 $postscripts 2>&1`; + $output=`XCATBYPASS=Y $::XCATROOT/bin/xdsh $nodestring -e /install/postscripts/xcataixpost 1 $postscripts 2>&1`; } my $rsp={}; $rsp->{data}->[0]= "$output\n"; diff --git a/xCAT-server/lib/xcat/plugins/xen.pm b/xCAT-server/lib/xcat/plugins/xen.pm index 5c2a85c8b..5bd806022 100644 --- a/xCAT-server/lib/xcat/plugins/xen.pm +++ b/xCAT-server/lib/xcat/plugins/xen.pm @@ -553,14 +553,12 @@ sub process_request { if ($subcommand ne 'off') { #get the current nodeset stat if (@allnodes>0) { - my $chaintab = xCAT::Table->new('chain'); - my $tabdata=$chaintab->getNodesAttribs(\@allnodes,['node', 'currstate']); - foreach my $node (@allnodes) { - my $tmp1=$tabdata->{$node}->[0]; - if ($tmp1) { - my $currstate=$tmp1->{currstate}; - if ($currstate =~ /^install/) { $nodestat{$node}=$::STATUS_INSTALLING;} - elsif ($currstate =~ /^netboot/) { $nodestat{$node}=$::STATUS_NETBOOTING;} + my $nsh={}; + my ($ret, $msg)=xCAT::Utils->getNodesetStates(\@allnodes, $nsh); + if (!$ret) { + foreach (keys %$nsh) { + my $currstate=$nsh->{$_}; + $nodestat{$_}=xCAT_monitoring::monitorctrl->getNodeStatusFromNodesetState($currstate, "rpower"); } } } diff --git a/xCAT-server/lib/xcat/plugins/yaboot.pm b/xCAT-server/lib/xcat/plugins/yaboot.pm index 65a74deff..ebc3c725c 100644 --- a/xCAT-server/lib/xcat/plugins/yaboot.pm +++ b/xCAT-server/lib/xcat/plugins/yaboot.pm @@ -289,5 +289,35 @@ sub process_request { } +#---------------------------------------------------------------------------- +=head3 getNodesetStates + returns the nodeset state for the given nodes. The possible nodeset + states are: netboot, install, boot and discover. + Arguments: + nodes --- a pointer to an array of nodes + states -- a pointer to a hash table. This hash will be filled by this + function node and key and the nodeset stat as the value. + Returns: + (return code, error message) +=cut +#----------------------------------------------------------------------------- +sub getNodesetStates { + my $noderef=shift; + if ($noderef =~ /xCAT_plugin::yaboot/) { + $noderef=shift; + } + my @nodes=@$noderef; + my $hashref=shift; + + if (@nodes>0) { + foreach my $node (@nodes) { + my $tmp=getstate($node); + my @a=split(' ', $tmp); + $stat = $a[0]; + $hashref->{$node}=$stat; + } + } + return (0, ""); +} 1; diff --git a/xCAT/postscripts/otherpkgs b/xCAT/postscripts/otherpkgs index bd8b44737..6cb819a26 100755 --- a/xCAT/postscripts/otherpkgs +++ b/xCAT/postscripts/otherpkgs @@ -121,38 +121,41 @@ if [[ $OSTYPE = linux* ]]; then fi exit 0 else #AIX - mkdir -p /xcatpost/post/otherpkgs/$OSVER/$ARCH - rm -f -R /xcatpost/post/otherpkgs/$OSVER/$ARCH/* + #mkdir -p /xcatpost/post/otherpkgs/$OSVER/$ARCH + #rm -f -R /xcatpost/post/otherpkgs/$OSVER/$ARCH/* # get the name of my service node/NIM master from the /etc/niminfo file - if [ -f "/etc/niminfo" ]; then - servnode=`grep NIM_MASTER_HOSTNAME /etc/niminfo|tr "=" " "|awk {'print $3'}` - echo "servnode=$servnode" - else - echo "Could not find /etc/niminfo file" - logger "otherpkgs: Could not find /etc/niminfo file" - exit 1 - fi + #if [ -f "/etc/niminfo" ]; then + # servnode=`grep NIM_MASTER_HOSTNAME /etc/niminfo|tr "=" " "|awk {'print $3'}` + # echo "servnode=$servnode" + #else + # echo "Could not find /etc/niminfo file" + # logger "otherpkgs: Could not find /etc/niminfo file" + # exit 1 + #fi - for x in `echo "$OTHERPKGS" | tr "," "\n"` - do - result=`rcp -r $servnode:/install/post/otherpkgs/$OSVER/$ARCH/$x* /xcatpost/post/otherpkgs/$OSVER/$ARCH/.` - if [ $? -ne 0 ]; then - echo "$result" - logger "otherpkgs: $result" - fi - done + #for x in `echo "$OTHERPKGS" | tr "," "\n"` + #do + # result=`rcp -r $servnode:/install/post/otherpkgs/$OSVER/$ARCH/$x* /xcatpost/post/otherpkgs/$OSVER/$ARCH/.` + # if [ $? -ne 0 ]; then + # echo "$result" + # logger "otherpkgs: $result" + # fi + #done #on AIX use geninstall - PKGS=`echo "$OTHERPKGS" | tr "," " "` - cd /xcatpost/post/otherpkgs/$OSVER/$ARCH - result=`geninstall -I aX -Y -d /xcatpost/post/otherpkgs/$OSVER/$ARCH $PKGS 2>&1` - rc=$? - if [ $rc -ne 0 ]; then - echo "$result" - logger "otherpkgs: $result" - fi - exit $rc + #PKGS=`echo "$OTHERPKGS" | tr "," " "` + #cd /xcatpost/post/otherpkgs/$OSVER/$ARCH + #result=`geninstall -I aX -Y -d /xcatpost/post/otherpkgs/$OSVER/$ARCH $PKGS 2>&1` + #rc=$? + #if [ $rc -ne 0 ]; then + # echo "$result" + # logger "otherpkgs: $result" + #fi + #exit $rc + + echo "Please use nimnodecust command to add additional packages to AIX nodes." + logger "xCAT otherpkgs: Please use nimnodecust command to add addition packages to AIX nodes." fi exit 0 diff --git a/xCAT/postscripts/xcataixpost b/xCAT/postscripts/xcataixpost index 94a8dbc3c..f879d0c56 100644 --- a/xCAT/postscripts/xcataixpost +++ b/xCAT/postscripts/xcataixpost @@ -87,7 +87,7 @@ if (&runcmd($chcmd) != 0) { if (-f $scriptname) { if (@ARGV>0) { - my $scripts=$ARGV[0]; + my $scripts=$ARGV[1]; my $POSTS=join('\n', split(',', $scripts)); #print "scripts=$scripts\n"; #remove all the postscripts @@ -111,6 +111,16 @@ if (-f $scriptname) exit 1; } +if (@ARGV<1) { + if (&updateflag != 0) { + print "$::sdate xcataixpost: Failed to update the xCAT server.\n"; + print $::LOG_FILE "$::sdate xcataixpost: Failed to update the xCAT server..\n"; + close($::LOG_FILE); + exit 1; + } +} + + close($::LOG_FILE); exit 0; @@ -156,6 +166,36 @@ sub getmypost { return 0; } +############################################################ +# +# updateflag +# Tells xCAT on the server that the post scripts is done. +# +############################################################ +sub updateflag { + print "updateflag servicenode=$servnode\n"; + my $port = "3002"; + my $remote = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $servnode, PeerPort => $port, ); + unless ($remote) { + print "$::sdate xcataixpost: Cannot connect to host \'$servnode\'\n"; + print $::LOG_FILE "$::sdate xcataixpost: Cannot connect to host \'$servnode\'\n"; + return 1; + } + $remote->autoflush(1); + + my $line; + while (defined ($line = <$remote>)) { + chomp $line; + if ($line eq "ready") { + print $remote "netbooted\n"; + } elsif ($line eq "done") { + last; + } + } + close $remote; + return 0; +} + ##################################################### # # run the command diff --git a/xCAT/postscripts/xcatdsklspost b/xCAT/postscripts/xcatdsklspost index 3c73586cc..7c6b93d42 100755 --- a/xCAT/postscripts/xcatdsklspost +++ b/xCAT/postscripts/xcatdsklspost @@ -5,7 +5,6 @@ # Generic xCAT post script for diskless nodes # ##################################################### - if [ ! `uname` == Linux ]; then MYDIR=`dirname $0` exec $MYDIR/xcatdsklspost.aix @@ -83,17 +82,17 @@ fi #MYCONT=`cat /tmp/mypostscript` #echo "$MYCONT" +if [ $# -eq 0 ]; then + #notify the server that we are done with netbooting + echo "updateflag.awk \$MASTER 3002 netbooted" >> /tmp/mypostscript +fi + chmod +x /tmp/mypostscript if [ -x /tmp/mypostscript ];then /tmp/mypostscript fi rm -f /tmp/mypostscript -#notify the server that we are done with netbooting -if [ $# -eq 0 ]; then - updateflag.awk $MASTER 3002 netbooted -fi - killall stunnel rm -rf /etc/stunnel