mirror of
https://github.com/xcat2/xcat-core.git
synced 2025-05-31 01:56:39 +00:00
Merge pull request #2863 from zet809/2.13
Cherry-pick commits from master to 2.13 branch for 2.13.3 release(3)
This commit is contained in:
commit
7f9e0b5755
@ -50,7 +50,7 @@ OpenPOWER BMC specific:
|
||||
=======================
|
||||
|
||||
|
||||
\ **rflash**\ \ *noderange*\ \ *hpm_file_path*\ [\ **-c | -**\ **-check**\ ] [\ **-V**\ ]
|
||||
\ **rflash**\ \ *noderange*\ \ *hpm_file_path*\ [\ **-c | -**\ **-check**\ ] [\ **-**\ **-retry=**\ \ *count*\ ] [\ **-V**\ ]
|
||||
|
||||
|
||||
|
||||
@ -174,6 +174,12 @@ The command will update firmware for OpenPOWER BMC when given an OpenPOWER node
|
||||
|
||||
|
||||
|
||||
\ **-**\ **-retry=**\ \ *count*\
|
||||
|
||||
Specify number of times to retry the update if failure is detected. Default value is 2. Value of 0 can be used to indicate no retries.
|
||||
|
||||
|
||||
|
||||
\ **-v|-**\ **-version**\
|
||||
|
||||
Displays the command's version.
|
||||
|
@ -9,12 +9,16 @@ my $distname;
|
||||
my $arch;
|
||||
my $installpfx;
|
||||
|
||||
my $distrepopfx="/install/postscripts/repos";
|
||||
|
||||
sub localize_yumrepo {
|
||||
my $self = shift;
|
||||
my $pkgdir = shift;
|
||||
$distname=shift;
|
||||
$arch=shift;
|
||||
open($yumrepofile, ">", "$pkgdir/local-repository.tmpl");
|
||||
|
||||
mkpath("$distrepopfx/$pkgdir");
|
||||
open($yumrepofile, ">", "$distrepopfx/$pkgdir/local-repository.tmpl");
|
||||
my %options = (
|
||||
wanted => \&check_tofix,
|
||||
follow_fast => 1
|
||||
@ -27,7 +31,7 @@ sub localize_yumrepo {
|
||||
sub remove_yumrepo {
|
||||
my $self = shift;
|
||||
my $pkgdir = shift;
|
||||
rmtree("$pkgdir/local-repository.tmpl");
|
||||
rmtree("$distrepopfx/$pkgdir/local-repository.tmpl");
|
||||
}
|
||||
|
||||
sub check_tofix {
|
||||
@ -50,8 +54,9 @@ sub generate_repo
|
||||
my $dirlocation = shift;
|
||||
my @dircomps = File::Spec->splitdir($dirlocation);
|
||||
pop(@dircomps);
|
||||
my $reponame = join("-",@dircomps);
|
||||
my $yumurl = File::Spec->catdir(@dircomps);
|
||||
my $reponame = $dircomps[$#dircomps];
|
||||
|
||||
print $yumrepofile "[local-$distname-$arch-$reponame]\n";
|
||||
print $yumrepofile "name=xCAT configured yum repository for $yumurl\n";
|
||||
print $yumrepofile "baseurl=$yumurl\n";
|
||||
|
@ -24,7 +24,7 @@ B<rflash> I<noderange> I<http_directory>
|
||||
|
||||
=head2 OpenPOWER BMC specific:
|
||||
|
||||
B<rflash> I<noderange> I<hpm_file_path> [B<-c>|B<--check>] [B<-V>]
|
||||
B<rflash> I<noderange> I<hpm_file_path> [B<-c>|B<--check>] [B<--retry=>I<count>] [B<-V>]
|
||||
|
||||
=head1 B<Description>
|
||||
|
||||
@ -114,6 +114,10 @@ Used to commit the flash image in the temporary side of the chip to the permanen
|
||||
|
||||
Used to recover the flash image in the permanent side of the chip to the temporary side for both managed systems and power subsystems.
|
||||
|
||||
=item B<--retry=>I<count>
|
||||
|
||||
Specify number of times to retry the update if failure is detected. Default value is 2. Value of 0 can be used to indicate no retries.
|
||||
|
||||
=item B<-v|--version>
|
||||
|
||||
Displays the command's version.
|
||||
|
@ -303,11 +303,12 @@ sub subvars {
|
||||
$source_in_pre .= "\necho 'repo --name=pkg$c --baseurl=http://'\$nextserver'/$pkgdir' >> /tmp/repos";
|
||||
$source .= "repo --name=pkg$c --baseurl=http://#TABLE:noderes:\$NODE:nfsserver#/$pkgdir\n"; #for rhels5.9
|
||||
}
|
||||
if( -f "$pkgdir/local-repository.tmpl"){
|
||||
my $distrepofile="/install/postscripts/repos/$pkgdir/local-repository.tmpl";
|
||||
if( -f "$distrepofile"){
|
||||
my $repofd;
|
||||
my $repo_in_post;
|
||||
local $/=undef;
|
||||
open($repofd,"<","$pkgdir/local-repository.tmpl");
|
||||
open($repofd,"<","$distrepofile");
|
||||
$repo_in_post = <$repofd>;
|
||||
close($repofd);
|
||||
$repo_in_post =~ s#baseurl=#baseurl=http://$master/#g;
|
||||
|
@ -16,6 +16,7 @@ use xCAT::TableUtils;
|
||||
use xCAT::NetworkUtils;
|
||||
use xCAT::MsgUtils;
|
||||
use xCAT::SvrUtils;
|
||||
use xCAT::Yum;
|
||||
|
||||
#use Data::Dumper;
|
||||
use Getopt::Long;
|
||||
@ -1260,6 +1261,17 @@ sub mkinstall
|
||||
}
|
||||
}
|
||||
|
||||
my @pkgdirs=split(/,/,$pkgdir);
|
||||
foreach my $mypkgdir (@pkgdirs){
|
||||
unless(-f "/install/postscripts/repos/$mypkgdir/local-repository.tmpl"){
|
||||
#fix issue #2856@github
|
||||
#for the osimages created by <=xCAT 2.12.3
|
||||
#there is no local-repository.tmpl under pkgdir created on copycds
|
||||
#generate local-repository.tmpl here if it does not exist
|
||||
xCAT::Yum->localize_yumrepo($mypkgdir, $os, $arch);
|
||||
}
|
||||
}
|
||||
|
||||
my @missingparms;
|
||||
unless ($os) {
|
||||
if ($imagename) { push @missingparms, "osimage.osvers"; }
|
||||
@ -2462,8 +2474,6 @@ sub copycd
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
require xCAT::Yum;
|
||||
xCAT::Yum->localize_yumrepo($path, $distname, $arch);
|
||||
|
||||
if ($rc != 0)
|
||||
|
@ -1766,6 +1766,7 @@ sub do_firmware_update {
|
||||
my $ret;
|
||||
my $ipmitool_ver;
|
||||
my $verbose = 0;
|
||||
my $retry = 2;
|
||||
my $verbose_opt;
|
||||
$ret = get_ipmitool_version(\$ipmitool_ver);
|
||||
exit $ret if $ret < 0;
|
||||
@ -1834,8 +1835,6 @@ sub do_firmware_update {
|
||||
if ($bmc_password) {
|
||||
$pre_cmd = $pre_cmd . " -P $bmc_password";
|
||||
}
|
||||
xCAT::SvrUtils::sendmsg("rflash started, please wait.......",
|
||||
$callback, $sessdata->{node}, %allerrornodes);
|
||||
|
||||
# check for 8335-GTB Model Type to adjust buffer size
|
||||
my $buffer_size = "30000";
|
||||
@ -1849,7 +1848,7 @@ sub do_firmware_update {
|
||||
$buffer_size = "15000";
|
||||
}
|
||||
|
||||
# check verbose and buffersize options
|
||||
# check verbose, buffersize, and retry options
|
||||
for my $opt (@{$sessdata->{'extraargs'}}) {
|
||||
if ($opt =~ /-V{1,4}/) {
|
||||
$verbose_opt = lc($opt);
|
||||
@ -1862,8 +1861,18 @@ sub do_firmware_update {
|
||||
$buffer_size = $buffer_value;
|
||||
}
|
||||
}
|
||||
if ($opt =~ /retry=/) {
|
||||
my ($attribute, $retry_value) = split(/=/, $opt);
|
||||
if ($retry_value) {
|
||||
# retry option was passed in, reset the default
|
||||
$retry = $retry_value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
xCAT::SvrUtils::sendmsg("rflash started, upgrade failure will be retried up to $retry times. Please wait...",
|
||||
$callback, $sessdata->{node}, %allerrornodes);
|
||||
|
||||
# check for 8335-GTB Firmware above 1610A release. If below, exit
|
||||
if ($output =~ /8335-GTB/) {
|
||||
$cmd = $pre_cmd . " fru print 47";
|
||||
@ -1883,6 +1892,9 @@ sub do_firmware_update {
|
||||
}
|
||||
}
|
||||
|
||||
RETRY_UPGRADE:
|
||||
my $failed_upgrade = 0;
|
||||
|
||||
# step 1 power off
|
||||
$cmd = $pre_cmd . " chassis power off";
|
||||
xCAT::SvrUtils::sendmsg("Preparing to upgrade firmware, powering chassis off...", $callback, $sessdata->{node}, %allerrornodes);
|
||||
@ -1925,9 +1937,21 @@ sub do_firmware_update {
|
||||
$callback, $sessdata->{node});
|
||||
|
||||
$output = xCAT::Utils->runcmd($cmd, -1);
|
||||
# if upgrade command failed and we exausted number of retries
|
||||
# report an error, exit to the caller and leave node in powered off state
|
||||
# otherwise report an error, power on the node and try upgrade again
|
||||
if ($::RUNCMD_RC != 0) {
|
||||
$exit_with_error_func->($sessdata->{node}, $callback,
|
||||
"Running ipmitool command $cmd failed: $output");
|
||||
if ($retry == 0) {
|
||||
# No more retries left, report and error and exit
|
||||
$exit_with_error_func->($sessdata->{node}, $callback,
|
||||
"Running ipmitool command $cmd failed: $output");
|
||||
}
|
||||
else {
|
||||
# Error upgrading, set a flag to attempt a retry
|
||||
xCAT::SvrUtils::sendmsg("Running ipmitool command $cmd failed: $output", $callback, $sessdata->{node}, %allerrornodes);
|
||||
$failed_upgrade = 1;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
# step 5 power on
|
||||
@ -1937,15 +1961,65 @@ sub do_firmware_update {
|
||||
"Timeout to check the bmc status");
|
||||
}
|
||||
|
||||
xCAT::SvrUtils::sendmsg("Firmware updated, powering chassis on to populate FRU information...", $callback, $sessdata->{node}, %allerrornodes);
|
||||
if ($failed_upgrade) {
|
||||
xCAT::SvrUtils::sendmsg("Firmware update failed, powering chassis on for a retry. This can take several minutes. $retry retries left ...", $callback, $sessdata->{node}, %allerrornodes);
|
||||
}
|
||||
else {
|
||||
xCAT::SvrUtils::sendmsg("Firmware updated, powering chassis on to populate FRU information...", $callback, $sessdata->{node}, %allerrornodes);
|
||||
}
|
||||
|
||||
$cmd = $pre_cmd . " chassis power on";
|
||||
$output = xCAT::Utils->runcmd($cmd, -1);
|
||||
if ($::RUNCMD_RC != 0) {
|
||||
$exit_with_error_func->($sessdata->{node}, $callback,
|
||||
"Running ipmitool command $cmd failed: $output");
|
||||
}
|
||||
$exit_with_success_func->($sessdata->{node}, $callback,
|
||||
"Success updating firmware.");
|
||||
|
||||
my $node_ready_for_retry = 0;
|
||||
if ($failed_upgrade) {
|
||||
# Update has failed in step 4. Wait for node to reboot and try again
|
||||
if ($verbose) {
|
||||
xCAT::SvrUtils::sendmsg("Sleeping for a few min waiting for node to power on before attempting a retry", $callback, $sessdata->{node}, %allerrornodes);
|
||||
}
|
||||
sleep(300); # sleep for 5 min for node to reboot
|
||||
# Start testing every 10 sec for node to be booted. Give up after 5 min.
|
||||
foreach (1..30) {
|
||||
# Test node is booted in to OS
|
||||
$cmd = "nodestat $sessdata->{node} | grep sshd";
|
||||
$output = xCAT::Utils->runcmd($cmd, -1);
|
||||
if ($::RUNCMD_RC == 0) {
|
||||
# Node is ready to retry an upgrage
|
||||
if ($verbose) {
|
||||
xCAT::SvrUtils::sendmsg("Detected node booted. Will retry upgrade", $callback, $sessdata->{node}, %allerrornodes);
|
||||
}
|
||||
$node_ready_for_retry = 1;
|
||||
last;
|
||||
}
|
||||
else {
|
||||
# Still not booted, wait for 10 sec and try again
|
||||
if ($verbose) {
|
||||
xCAT::SvrUtils::sendmsg("Node still not ready, Test again in 10 sec.", $callback, $sessdata->{node}, %allerrornodes);
|
||||
}
|
||||
sleep(10);
|
||||
}
|
||||
}
|
||||
if ($node_ready_for_retry) {
|
||||
$retry--; # decrement number of retries left
|
||||
# Yes, it is a goto statement here. Ugly, but removes the need to restructure
|
||||
# the above block of code.
|
||||
goto RETRY_UPGRADE;
|
||||
}
|
||||
else {
|
||||
# After 10 min of waiting node has not rebooted. Give up retrying.
|
||||
$exit_with_error_func->($sessdata->{node}, $callback,
|
||||
"Giving up waiting for the node to reboot. No further retries will be attempted.");
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
$exit_with_success_func->($sessdata->{node}, $callback,
|
||||
"Success updating firmware.");
|
||||
}
|
||||
}
|
||||
|
||||
sub rflash {
|
||||
@ -1958,7 +2032,7 @@ sub rflash {
|
||||
if ($opt =~ /^(-c|--check)$/i) {
|
||||
$sessdata->{subcommand} = "check";
|
||||
# support verbose options for ipmitool command
|
||||
} elsif ($opt !~ /.*\.hpm$/i && $opt !~ /^-V{1,4}$/ && $opt !~ /^--buffersize=/) {
|
||||
} elsif ($opt !~ /.*\.hpm$/i && $opt !~ /^-V{1,4}$/ && $opt !~ /^--buffersize=/ && $opt !~ /^--retry=/) {
|
||||
$callback->({ error => "The option $opt is not supported",
|
||||
errorcode => 1 });
|
||||
return;
|
||||
|
@ -410,9 +410,9 @@ export ARCH=#TABLE:nodetype:THISNODE:arch#
|
||||
export CONSOLEPORT=#TABLEBLANKOKAY:nodehm:THISNODE:serialport#
|
||||
|
||||
#for redhat:
|
||||
##place-holder for the code to save the repo info on compute node,pointing to the "pkgdir" of the osimage
|
||||
##so that the provisioned node
|
||||
##WRITEREPO#
|
||||
#place-holder for the code to save the repo info on compute node,pointing to the "pkgdir" of the osimage
|
||||
#so that the provisioned node has the repo pointed to the distro path on MN
|
||||
#WRITEREPO#
|
||||
|
||||
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
||||
msgutil_r "$MASTER_IP" "info" "running mypostscript" "/var/log/xcat/xcat.log"
|
||||
|
@ -907,7 +907,8 @@ sub runcase
|
||||
|
||||
#by
|
||||
my $runstart = timelocal(localtime());
|
||||
log_this("\nRUN:$cmd");
|
||||
my $runstartstr = scalar(localtime());
|
||||
log_this("\nRUN:$cmd [$runstartstr]");
|
||||
push(@record, "\nRUN:$cmd");
|
||||
@output = &runcmd($cmd);
|
||||
$rc = $::RUNCMD_RC;
|
||||
|
Loading…
x
Reference in New Issue
Block a user