2
0
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:
zet809 2017-04-13 13:43:38 +08:00 committed by GitHub
commit 7f9e0b5755
8 changed files with 123 additions and 22 deletions

View File

@ -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.

View File

@ -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";

View File

@ -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.

View File

@ -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;

View File

@ -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)

View File

@ -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;

View File

@ -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"

View File

@ -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;