Implement a '-w' argument on rpower suspend to force blocking until system has gone into suspend
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@11699 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
parent
b1611e7311
commit
b144a32404
@ -360,7 +360,7 @@ sub subcmd {
|
||||
if ($self->{confalgo}) {
|
||||
$type = $type | 0b10000000; #add secrecy
|
||||
}
|
||||
$self->sendpayload(payload=>\@payload,type=>$type);
|
||||
$self->sendpayload(payload=>\@payload,type=>$type,delayxmit=>$args{delayxmit});
|
||||
}
|
||||
|
||||
sub waitforrsp {
|
||||
@ -739,10 +739,18 @@ sub sendpayload {
|
||||
my @msg = (0x6,0x0,0xff,0x07); #RMCP header is constant in IPMI
|
||||
my $type = $args{type} & 0b00111111;
|
||||
$sessions_waiting{$self}={};
|
||||
$sessions_waiting{$self}->{timeout}=time()+$self->{timeout};
|
||||
$sessions_waiting{$self}->{ipmisession}=$self;
|
||||
my @payload = @{$args{payload}};
|
||||
$self->{pendingargs} = \%args;
|
||||
if ($args{delayxmit}) {
|
||||
$sessions_waiting{$self}->{timeout}=time()+$args{delayxmit};
|
||||
$self->{timeout}=1; #since we are burning one of the retry attempts, start the backoff algorithm faster to make it come out even
|
||||
undef $args{delayxmit};
|
||||
return; #don't actually transmit packet, use retry timer to start us off
|
||||
} else {
|
||||
$sessions_waiting{$self}->{timeout}=time()+$self->{timeout};
|
||||
}
|
||||
|
||||
push @msg,$self->{'authtype'}; # add authtype byte (will support 0 only for session establishment, 2 for ipmi 1.5, 6 for ipmi2
|
||||
if ($self->{'ipmiversion'} eq '2.0') { #TODO: revisit this to see if assembly makes sense
|
||||
push @msg, $args{type};
|
||||
|
@ -1247,6 +1247,21 @@ sub power_with_context {
|
||||
return;
|
||||
}
|
||||
} elsif ($subcommand eq "suspend") {
|
||||
my $waitforsuspend;
|
||||
if (@{$sessdata->{extraargs}} > 1) {
|
||||
@ARGV=@{$sessdata->{extraargs}};
|
||||
use Getopt::Long;
|
||||
unless(GetOptions(
|
||||
'w:i' => \$waitforsuspend
|
||||
)) {
|
||||
xCAT::SvrUtils::sendmsg([1,"Error parsing arguments"],$callback,$sessdata->{node},%allerrornodes);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (defined $waitforsuspend) {
|
||||
if ($waitforsuspend == 0) { $waitforsuspend=30; }
|
||||
$sessdata->{waitforsuspend}=time()+$waitforsuspend;
|
||||
}
|
||||
$sessdata->{ipmisession}->subcmd(netfn=>0x3a,command=>0x1d,data=>[0,3],callback=>\&power_response,callback_args=>$sessdata);
|
||||
return;
|
||||
} elsif ($subcommand eq "wake") {
|
||||
@ -1271,9 +1286,34 @@ sub power_response {
|
||||
unless ($text) { $text = sprintf("Unknown response %02xh",$rsp->{code}); }
|
||||
xCAT::SvrUtils::sendmsg([1,$text],$callback,$sessdata->{node},%allerrornodes);
|
||||
}
|
||||
if ($sessdata->{waitforsuspend}) { #have to repeatedly power stat until happy or timeout exceeded
|
||||
$sessdata->{ipmisession}->subcmd(netfn=>0x3a,command=>0x1d,data=>[1],callback=>\&power_wait_for_suspend,callback_args=>$sessdata);
|
||||
return;
|
||||
}
|
||||
xCAT::SvrUtils::sendmsg($sessdata->{subcommand},$callback,$sessdata->{node},%allerrornodes);
|
||||
}
|
||||
|
||||
sub power_wait_for_suspend {
|
||||
my $rsp = shift;
|
||||
my $sessdata = shift;
|
||||
if ($rsp->{error}) {
|
||||
xCAT::SvrUtils::sendmsg([1,$rsp->{error}],$callback,$sessdata->{node},%allerrornodes);
|
||||
return;
|
||||
}
|
||||
if ($rsp->{code} == 0) {
|
||||
if ($rsp->{data}->[0] == 3) {
|
||||
$sessdata->{acpistate} = "suspend";
|
||||
}
|
||||
}
|
||||
if ($sessdata->{acpistate} eq "suspend") {
|
||||
xCAT::SvrUtils::sendmsg("suspend",$callback,$sessdata->{node},%allerrornodes);
|
||||
} elsif ($sessdata->{waitforsuspend} <= time()) {
|
||||
xCAT::SvrUtils::sendmsg([1,"Failed to enter suspend state"],$callback,$sessdata->{node},%allerrornodes);
|
||||
} else {
|
||||
$sessdata->{ipmisession}->subcmd(netfn=>0x3a,command=>0x1d,delayxmit=>5,data=>[1],callback=>\&power_wait_for_suspend,callback_args=>$sessdata);
|
||||
}
|
||||
}
|
||||
|
||||
sub generic {
|
||||
my $subcommand = shift;
|
||||
my $netfun;
|
||||
|
Loading…
Reference in New Issue
Block a user