From 183eef7202f7505e78a8abb9c4573e3f541a78ac Mon Sep 17 00:00:00 2001 From: linggao Date: Fri, 3 Oct 2008 17:46:31 +0000 Subject: [PATCH] handle no-op situation for node status update git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@2280 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server/lib/xcat/plugins/blade.pm | 71 +++++++++++++++++---------- xCAT-server/lib/xcat/plugins/ipmi.pm | 38 ++++++++++---- 2 files changed, 73 insertions(+), 36 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/blade.pm b/xCAT-server/lib/xcat/plugins/blade.pm index 9241aecd7..6a66862a9 100644 --- a/xCAT-server/lib/xcat/plugins/blade.pm +++ b/xCAT-server/lib/xcat/plugins/blade.pm @@ -196,6 +196,7 @@ my $mpa; my $allinchassis=0; my $curn; my @cfgtext; +my $status_noop="XXXno-opXXX"; sub fillresps { @@ -1482,26 +1483,34 @@ sub power { return (1,"$subcommand unsupported on the management module"); } } - if ($subcommand eq "stat" or $subcommand eq "boot") { - $validsub=1; - $data = $session->get([$powerstatoid.".".$slot]); - if ($data == 1) { - $stat = "on"; - } elsif ( $data == 0) { - $stat = "off"; - } else { - $stat= "error"; - } - } elsif ($subcommand eq "off") { + + #get stat first + $validsub=1; + $data = $session->get([$powerstatoid.".".$slot]); + if ($data == 1) { + $stat = "on"; + } elsif ( $data == 0) { + $stat = "off"; + } else { + $stat= "error"; + } + + my $old_stat=$stat; + if ($subcommand eq "off") { $validsub=1; $data = $session->set(new SNMP::Varbind([".".$powerchangeoid,$slot,0,'INTEGER'])); unless ($data) { return (1,$session->{ErrorStr}); } - $stat = "off"; + $stat = "off"; + if ($old_stat eq "off") { $stat .= " $status_noop"; } } if ($subcommand eq "on" or ($subcommand eq "boot" and $stat eq "off")) { $data = $session->set(new SNMP::Varbind([".".$powerchangeoid,$slot,1,'INTEGER'])); unless ($data) { return (1,$session->{ErrorStr}); } - $stat .= " " . ($data ? "on" : "off"); + if ($subcommand eq "boot") { $stat .= " " . ($data ? "on" : "off"); } + if ($subcommand eq "on") { + $stat = ($data ? "on" : "off"); + if ($old_stat eq "on") { $stat .= " $status_noop"; } + } } elsif ($subcommand eq "reset" or ($subcommand eq "boot" and $stat eq "on")) { $data = $session->set(new SNMP::Varbind([".".$powerresetoid,$slot ,1,'INTEGER'])); unless ($data) { return (1,$session->{ErrorStr}); } @@ -2676,19 +2685,27 @@ sub dompa { $curn = $node; my ($rc,@output) = bladecmd($mpa,$node,$mpahash->{$mpa}->{nodes}->{$node},$mpahash->{$mpa}->{username},$mpahash->{$mpa}->{password},$command,@$args); + #print "output=@output\n"; + my $no_op=0; + if ($rc) { $no_op=1; } + elsif (@output>0) { + if ($output[0] =~ /$status_noop/) { + $no_op=1; + $output[0] =~ s/ $status_noop//; #remove the simbols that meant for use by node statu + } + } + #print "output=@output\n"; + #update the node status - if ($check) { - if ($rc) { $nodestat{$node}="error"; } - else { - my $stattmp=$output[0]; - if ($stattmp) { - my @atmp=split(' ', $stattmp); - my $newstat=$atmp[$#atmp]; - if (($newstat eq "on") || ($newstat eq "reset")) { - my $currstate=$nsh->{$node}; - $nodestat{$node}=xCAT_monitoring::monitorctrl->getNodeStatusFromNodesetState($currstate, "rpower"); - } else { $nodestat{$node}=$::STATUS_POWERING_OFF;} - } + if (($check) && (!$no_op)) { + my $stattmp=$output[0]; + if ($stattmp) { + my @atmp=split(' ', $stattmp); + my $newstat=$atmp[$#atmp]; + if (($newstat eq "on") || ($newstat eq "reset")) { + my $currstate=$nsh->{$node}; + $nodestat{$node}=xCAT_monitoring::monitorctrl->getNodeStatusFromNodesetState($currstate, "rpower"); + } else { $nodestat{$node}=$::STATUS_POWERING_OFF;} } } @@ -2728,11 +2745,11 @@ sub dompa { if ($check) { my %node_status=(); - foreach (keys %nodestat) { print "node=$_,status=" . $nodestat{$_} ."\n"; } #Ling:remove + #foreach (keys %nodestat) { print "node=$_,status=" . $nodestat{$_} ."\n"; } #Ling:remove foreach my $node (keys %nodestat) { my $stat=$nodestat{$node}; - if ($stat eq "error") { next; } + if ($stat eq "no-op") { next; } if (exists($node_status{$stat})) { my $pa=$node_status{$stat}; push(@$pa, $node); diff --git a/xCAT-server/lib/xcat/plugins/ipmi.pm b/xCAT-server/lib/xcat/plugins/ipmi.pm index 6cf514843..7693dfa7d 100644 --- a/xCAT-server/lib/xcat/plugins/ipmi.pm +++ b/xCAT-server/lib/xcat/plugins/ipmi.pm @@ -90,6 +90,8 @@ use xCAT::data::ipmigenericevents; use xCAT::data::ipmisensorevents; my $cache_version = 2; +my $status_noop="XXXno-opXXX"; + my %idpxthermbytes = ( #Data to enact the profile quickly '0z' => [0x0A,0x37,0x41,0x3C,0x0a,0x0a,0x1e], '1a' => [0x0A,0x30,0x3C,0x3C,0x0a,0x0a,0x1e], @@ -524,7 +526,9 @@ sub ipmicmd { ($rc,$text) = power("stat"); } elsif($subcommand eq "on") { - ($rc,$text) = power("on"); + my ($oldrc,$oldtext) = power("stat"); + ($rc,$text) = power("on"); + if(($rc == 0) && ($text eq "on") && ($oldtext eq "on")) { $text .= " $status_noop"; } } elsif($subcommand eq "nmi") { ($rc,$text) = power("nmi"); @@ -547,15 +551,19 @@ sub ipmicmd { # # e325 hack end # + my ($oldrc,$oldtext) = power("stat"); ($rc,$text) = power("off"); -# + if(($rc == 0) && ($text eq "off") && ($oldtext eq "off")) { $text .= " $status_noop"; } + # if($text0 ne "") { # $text = $text0 . " " . $text; # } } elsif($subcommand eq "reset") { + my ($oldrc,$oldtext) = power("stat"); ($rc,$text) = power("reset"); $noclose = 0; + if(($rc == 0) && ($text eq "off") && ($oldtext eq "off")) { $text .= " $status_noop"; } } elsif($subcommand eq "cycle") { my $text2; @@ -5579,7 +5587,7 @@ sub process_request { } } } - foreach (keys %nodestat) { print "node=$_,status=" . $nodestat{$_} ."\n"; } #Ling:remove + #foreach (keys %nodestat) { print "node=$_,status=" . $nodestat{$_} ."\n"; } #Ling:remove my $children = 0; $SIG{CHLD} = sub {my $kpid; do { $kpid = waitpid(-1, WNOHANG); if ($kpid > 0) { delete $bmc_comm_pids{$kpid}; $children--; } } while $kpid > 0; }; @@ -5613,13 +5621,13 @@ sub process_request { #update the node status to the nodelist.status table if ($check) { my %node_status=(); - foreach (keys(%$errornodes)) { $nodestat{$_}="error"; } + foreach (keys(%$errornodes)) { $nodestat{$_}="no-op"; } - foreach (keys %nodestat) { print "node=$_,status=" . $nodestat{$_} ."\n"; } #Ling:remove + #foreach (keys %nodestat) { print "node=$_,status=" . $nodestat{$_} ."\n"; } #Ling:remove foreach my $node (keys %nodestat) { my $stat=$nodestat{$node}; - if ($stat eq "error") { next; } + if ($stat eq "no-op") { next; } if (exists($node_status{$stat})) { my $pa=$node_status{$stat}; push(@$pa, $node); @@ -5650,9 +5658,21 @@ sub forward_data { #unserialize data from pipe, chunk at a time, use magic to de print $rfh "ACK\n"; my $responses=thaw($data); foreach (@$responses) { - #save the nodes that has errors for node status monitoring - if (exists($_->{node}->[0]->{errorcode})) { - if ($errornodes) { $errornodes->{$_->{node}->[0]->{name}->[0]}=1; } + #save the nodes that has errors and the ones that has no-op for use by the node status monitoring + my $no_op=0; + if (exists($_->{node}->[0]->{errorcode})) { $no_op=1; } + else { + my $text=$_->{node}->[0]->{data}->[0]->{contents}->[0]; + #print "data:$text\n"; + if (($text) && ($text =~ /$status_noop/)) { + $no_op=1; + #remove the symbols that meant for use by node status + $_->{node}->[0]->{data}->[0]->{contents}->[0] =~ s/ $status_noop//; + } + } + #print "data:". $_->{node}->[0]->{data}->[0]->{contents}->[0] . "\n"; + if ($no_op) { + if ($errornodes) { $errornodes->{$_->{node}->[0]->{name}->[0]}=1; } } $callback->($_); }