diff --git a/xCAT-server/lib/xcat/plugins/blade.pm b/xCAT-server/lib/xcat/plugins/blade.pm index 2e5783a8f..830e6b966 100644 --- a/xCAT-server/lib/xcat/plugins/blade.pm +++ b/xCAT-server/lib/xcat/plugins/blade.pm @@ -204,13 +204,14 @@ my %bootnumbers = ( 'usb' => 11 ); -my @rscan_attribs = qw(nodetype name id mtm serial mpa parent groups mgt cons hwtype); +my @rscan_attribs = qw(nodetype name id mtm serial mpa hcp groups mgt cons hwtype); my @rscan_header = ( ["type", "%-8s" ], ["name", "" ], ["id", "%-8s" ], ["type-model", "%-12s" ], ["serial-number", "%-15s" ], + ["mpa", "%-10s" ], ["address", "%s\n" ]); my $session; @@ -240,8 +241,9 @@ sub fillresps { #xcat into having an odd mapping $mac = uc($mac); #Make sure it is uppercase, the MM people seem to change their mind on this.. if ($mac =~ /........-....-....-....-............/) { #a uuid - $uuidmap{$mac} = $node; + $uuidmap{$mac} = $node; } elsif ($mac =~ /->/) { #The new and 'improved' syntax for pBlades + $mac =~ /(\w+):(\w+):(\w+):(\w+):(\w+):(\w+)\s*->\s*(\w+):(\w+):(\w+):(\w+):(\w+):(\w+)/; my $fmac=hex($3.$4.$5.$6); my $lmac=hex($9.$10.$11.$12); @@ -1318,7 +1320,7 @@ sub rscan { if ($session->{ErrorStr}) { return(1,$session->{ErrorStr}); } - push @values,join(",",$mmtypestr,$mmname,0,"$mmtype$mmmodel",$mmserial,$mpa); + push @values,join(",",$mmtypestr,$mmname,0,"$mmtype$mmmodel",$mmserial,$mpa,$mpa); my $max = length($mmname); foreach (1..14) { @@ -1348,23 +1350,18 @@ sub rscan { } my $isppcblade; my $fspname; - #generate the fsp entry base on the rscan result from the telnet command line + + # The %telnetrscan has the entires for the fsp. For NGP ppc blade, set the ip of fsp. if (defined($telnetrscan{$_}{'0'}) && $telnetrscan{$_}{'0'}{'type'} eq "fsp") { - $fspname .= $name."-fsp0"; - push @values, join( ",","fsp",$fspname,$_,"$type$model",$serial,$telnetrscan{$_}{'0'}{'ip'}); - $isppcblade = 1; - } - if (defined($telnetrscan{$_}{'1'}) && $telnetrscan{$_}{'1'}{'type'} eq "fsp") { - $fspname = $name."-fsp1"; - push @values, join( ",","fsp",$fspname,$_,"$type$model",$serial,$telnetrscan{$_}{'1'}{'ip'}); - $isppcblade = 1; - } - if ($isppcblade) { # give the NGP ppc blade an internal specific name to identify - push @values, join( ",","ppcblade",$name,$_,"$type$model",$serial,"",$fspname); + push @values, join( ",","ppcblade",$name,$_,"$type$model",$serial,$mpa,$telnetrscan{$_}{'0'}{'ip'}); + } elsif (defined($telnetrscan{$_}{'1'}) && $telnetrscan{$_}{'1'}{'type'} eq "fsp") { + # give the NGP ppc blade an internal specific name to identify + push @values, join( ",","ppcblade",$name,$_,"$type$model",$serial,$mpa,$telnetrscan{$_}{'1'}{'ip'}); } else { - push @values, join( ",","blade",$name,$_,"$type$model",$serial,""); + push @values, join( ",","blade",$name,$_,"$type$model",$serial,$mpa,""); } + my $length = (length($name) > length($fspname)) ? length($name) : length($fspname); $max = ($length > $max) ? $length : $max; } @@ -1414,7 +1411,7 @@ sub rscan { my $id = $data[2]; my $mtm= $data[3]; my $serial = $data[4]; - my $fspname = $data[6]; + my $fspip = $data[6]; # ignore the blade server which status is 'Comm Error' if ($name =~ /Comm Error/) { @@ -1422,7 +1419,7 @@ sub rscan { } if (exists($opt{u})) { - ## TRACE_LINE print "Rscan: orig_name [$name], orig_fsp [$fspname]\n"; + ## TRACE_LINE print "Rscan: orig_name [$name]\n"; # search the existed node for updating # for the cmm, using the type-serial number to match @@ -1449,24 +1446,8 @@ sub rscan { } } } - if ($type eq "fsp" || $type eq "ppcblade") { - # for the fsp, using the ppc.parent and ppc.id to match - # also get the fsp of the blade - my @ppclist = $db{'ppc'}->getAllNodeAttribs(['node','parent','id']); - foreach (@ppclist) { - if ($_->{'parent'} eq $mpa && $_->{'id'} eq $id) { - if ($type eq "fsp") { - push @msg4update, sprintf("%-7s$format Matched To =>$format", $type, '['.$name.']', '['.$_->{'node'}.']'); - $name = $_->{'node'}; - $matched = 1; - } else { - $fspname = $_->{'node'}; - } - last; - } - } - } - ## TRACE_LINE print "Rscan: matched_name[$name], mateched_fsp [$fspname]\n"; + + ## TRACE_LINE print "Rscan: matched_name[$name]\n"; if (!$matched) { my $displaytype = ($type eq "ppcblade") ? "blade" : $type; push @msg4update, sprintf("%-7s$format NOT Matched. MM [%s]: Slot ID [%s]", $displaytype, '['.$name.']',$mpa, $id); @@ -1477,44 +1458,34 @@ sub rscan { # Update the ppc table for the fsp and ppcblade my ($k1,$u1); $k1->{node} = $name; - if ($type eq "fsp") { - $u1->{hcp} = $name; - $u1->{nodetype} = "fsp"; - $u1->{id} = $id; - $u1->{parent} = $mpa; - $db{ppc}->setAttribs($k1,$u1); - $db{ppc}{commit} = 1; - } elsif ($type eq "ppcblade") { - $u1->{hcp} = $fspname; - $u1->{nodetype} = "lpar"; + if ($type eq "ppcblade") { + #$u1->{hcp} = $fspip; + $u1->{nodetype} = "blade"; $u1->{id} = "1"; - $u1->{parent} = $fspname; + $u1->{parent} = $mpa; $db{ppc}->setAttribs($k1,$u1); $db{ppc}{commit} = 1; } # Update the entry in mp table for ppcblade and general blade - if ($type ne "fsp") { - my ($k11,$u11); - $k11->{node} = $name; - $u11->{mpa} = $mpa; - $u11->{id} = $id; - if ($type eq "ppcblade") { - $u11->{nodetype} = "blade"; - } else { - $u11->{nodetype} = $type; - } - $db{mp}->setAttribs($k11,$u11); - $db{mp}{commit} = 1; + my ($k11,$u11); + $k11->{node} = $name; + $u11->{mpa} = $mpa; + $u11->{id} = $id; + if ($type eq "ppcblade") { + $u11->{nodetype} = "blade"; + } else { + $u11->{nodetype} = $type; } + $db{mp}->setAttribs($k11,$u11); + $db{mp}{commit} = 1; + my ($k2,$u2); $k2->{node} = $name; - if ($type eq "ppcblade" || $type eq "fsp") { + if ($type eq "ppcblade") { $u2->{mgt} = "fsp"; - if ($type eq "ppcblade"){ - $u2->{cons} = "fsp"; - } + $u2->{cons} = "fsp"; } else { $u2->{mgt} = "blade"; if($type eq "blade"){ @@ -1526,9 +1497,7 @@ sub rscan { my ($k3,$u3); $k3->{node} = $name; - if ($type eq "fsp") { - $u3->{groups} = "fsp,all"; - } elsif ($type eq "ppcblade") { + if ($type eq "ppcblade") { $u3->{groups} = "blade,all"; } else { $u3->{groups} = $type.",all"; @@ -1538,9 +1507,11 @@ sub rscan { my ($k4, $u4); $k4->{node} = $name; - if ($type eq "ppcblade" || $type eq "fsp"){ - $u4->{nodetype} = "ppc"; - } elsif ($type eq "mm" || $type eq "cmm" || $type eq "blade") { + if ($type eq "ppcblade"){ + $u4->{nodetype} = "ppc,osi"; + } elsif ($type eq "blade") { + $u4->{nodetype} = "mp,osi"; + } elsif ($type eq "mm" || $type eq "cmm") { $u4->{nodetype} = "mp"; } $db{nodetype}->setAttribs($k4,$u4); @@ -1594,15 +1565,17 @@ sub rscan_xml { if ( /^name$/ ) { next; } elsif ( /^nodetype$/ ) { - if ($origtype eq "fsp" || $origtype eq "ppcblade") { - $d = "ppc"; + if ($origtype eq "ppcblade") { + $d = "ppc,osi"; + } elsif ($origtype eq "blade") { + $d = "mp,osi"; } else { $d = "mp"; } } elsif ( /^groups$/ ) { $d = "$type,all"; } elsif ( /^mgt$/ ) { - if ($origtype eq "fsp" || $origtype eq "ppcblade") { + if ($origtype eq "ppcblade") { $d = "fsp"; } else { $d = "blade"; @@ -1616,16 +1589,10 @@ sub rscan_xml { $ignore = 1; } } elsif ( /^mpa$/ ) { - if($type ne "fsp"){ $d = $mpa; - } else { - $ignore = 1; - } } elsif ( /^hwtype$/ ) { - if ($origtype eq "fsp") { - $d = "fsp"; - } elsif ($origtype eq "ppcblade") { - $d = "lpar"; + if ($origtype eq "ppcblade") { + $d = "blade"; } else { $d = $type; } @@ -1635,12 +1602,9 @@ sub rscan_xml { $href->{Node}->{slotid} = $d; $d = "1"; } - } elsif (/^parent$/) { - if ($origtype eq "fsp") { - $d = $mpa; - $href->{Node}->{hcp} = $data[1]; - } elsif ($origtype eq "ppcblade") { - $href->{Node}->{hcp} = $d; + } elsif (/^hcp/) { + if ($origtype eq "ppcblade") { + $href->{Node}->{parent} = $mpa; } else { $ignore = 1; } @@ -1648,8 +1612,6 @@ sub rscan_xml { if (!$ignore) { $href->{Node}->{$_} = $d; - } elsif (/^mpa$/ && $type eq "fsp") { - $href->{Node}->{ip} = $d; } } @@ -1685,15 +1647,17 @@ sub rscan_stanza { if ( /^name$/ ) { next; } elsif ( /^nodetype$/ ) { - if ($origtype eq "fsp" || $origtype eq "ppcblade") { - $d = "ppc"; + if ($origtype eq "ppcblade") { + $d = "ppc,osi"; + } elsif ($origtype eq "blade") { + $d = "mp,osi"; } else { $d = "mp"; } } elsif ( /^groups$/ ) { $d = "$type,all"; } elsif ( /^mgt$/ ) { - if ($origtype eq "fsp" || $origtype eq "ppcblade") { + if ($origtype eq "ppcblade") { $d = "fsp"; } else { $d = "blade"; @@ -1707,16 +1671,10 @@ sub rscan_stanza { $ignore = 1; } } elsif ( /^mpa$/ ) { - if($type ne "fsp"){ $d = $mpa; - } else { - $ignore = 1; - } } elsif ( /^hwtype$/ ) { - if ($origtype eq "fsp") { - $d = "fsp"; - } elsif ($origtype eq "ppcblade") { - $d = "lpar"; + if ($origtype eq "ppcblade") { + $d = "blade"; } else { $d = $type; } @@ -1726,12 +1684,9 @@ sub rscan_stanza { $result .= "\tslotid=$d\n"; $d = "1"; } - } elsif (/^parent$/) { - if ($origtype eq "fsp") { - $d = $mpa; - $result .= "\thcp=$data[1]\n"; - } elsif ($origtype eq "ppcblade") { - $result .= "\thcp=$d\n"; + } elsif (/^hcp/) { + if ($origtype eq "ppcblade") { + $result .= "\tparent=$mpa\n"; } else { $ignore = 1; } @@ -1739,8 +1694,6 @@ sub rscan_stanza { if (!$ignore) { $result .= "\t$_=$d\n"; - } elsif (/^mpa$/ && $type eq "fsp") { - $result .= "\tip=$d\n"; } } } @@ -3542,8 +3495,11 @@ sub preprocess_request { #parse the arguments for commands if ($command eq "getmacs") { - my (@mpnodes, @fspnodes); + my (@mpnodes, @fspnodes, @nohandle); filter_nodes($request, \@mpnodes, \@fspnodes); + if (@nohandle) { + $callback->({data=>"Cannot figure out plugin for nodes:@nohandle"}); + } if (@mpnodes) { $noderange = \@mpnodes; foreach my $arg (@exargs) { @@ -3570,8 +3526,11 @@ sub preprocess_request { } elsif ($command eq "rspconfig") { # All the nodes with mgt=blade or mgt=fsp will get here # filter out the nodes for blade.pm - my (@mpnodes, @fspnodes); - filter_nodes($request, \@mpnodes, \@fspnodes); + my (@mpnodes, @fspnodes, @nohandle); + filter_nodes($request, \@mpnodes, \@fspnodes, \@nohandle); + if (@nohandle) { + $callback->({data=>"Cannot figure out plugin for nodes:@nohandle"}); + } if (@mpnodes) { $noderange = \@mpnodes; } else { @@ -3602,34 +3561,13 @@ sub preprocess_request { return []; } - # try to get the mpa from the ppc table for the fsp of NGP blade - my $ppctab = xCAT::Table->new("ppc"); - my $ppctabhash; - if ($ppctab) { - $ppctabhash = $ppctab->getNodesAttribs($noderange,['parent','id']); - } foreach my $node (@$noderange) { my $ent=$mptabhash->{$node}->[0]; #$mptab->getNodeAttribs($node,['mpa', 'id']); if (defined($ent->{mpa})) { push @{$mpa_hash{$ent->{mpa}}{nodes}}, $node;} else { - # for the NGP ppc blade, the ppc.parent is the mpa - my $ppcent = $ppctabhash->{$node}->[0]; - if (defined($ppcent->{'parent'}) && defined($ppcent->{'id'})) { - $ent= $mptab->getNodeAttribs($ppcent->{'parent'}, ['mpa','id','nodetype']); - if (defined($ent->{'nodetype'}) - && $ent->{'nodetype'} eq "cmm") { - push @{$mpa_hash{$ent->{'mpa'}}{nodes}}, $node; - $ent->{'id'} = $ppcent->{'id'}; - } else { - $callback->({data=>["no mpa defined for node $node"]}); - $request = {}; - return; - } - } else { $callback->({data=>["no mpa defined for node $node"]}); $request = {}; return; - } } if (defined($ent->{id})) { push @{$mpa_hash{$ent->{mpa}}{ids}}, $ent->{id};} else { push @{$mpa_hash{$ent->{mpa}}{ids}}, "";} @@ -3666,10 +3604,12 @@ sub preprocess_request { } ########################################################################## -# Fliter the nodes that are GGP ppc blade node or common fsp node +# Fliter the nodes that are NGP ppc blade node or common fsp node +# For rspconfig network, the NGP ppc blade will be included in the group of mp, othewise in the fsp group +# For getmacs -D, the NGP ppc blade will be included in the group of common fsp, otherwise in the mp group ########################################################################## sub filter_nodes{ - my ($req, $mpnodes, $fspnodes) = @_; + my ($req, $mpnodes, $fspnodes, $nohandle) = @_; my (@nodes,@args,$cmd); if (defined($req->{'node'})) { @@ -3695,55 +3635,38 @@ sub filter_nodes{ my $ppctabhash; my $ppctab = xCAT::Table->new("ppc"); if ($ppctab) { - $ppctabhash = $ppctab->getNodesAttribs(\@nodes,['parent','nodetype']); + $ppctabhash = $ppctab->getNodesAttribs(\@nodes,['nodetype']); } - my (@mp, @ngpfsp, @commonfsp); + my (@mp, @ngpfsp, @commonfsp, @unknow); my %fspparent; # Get the parent for each node foreach (@nodes) { if (defined ($mptabhash->{$_}->[0]->{'mpa'})) { - push @mp, $_; - next; - } - - if (defined ($ppctabhash->{$_}->[0]->{'parent'})) { - push @{$fspparent{$ppctabhash->{$_}->[0]->{'parent'}}}, $_; - } else { + if (defined ($ppctabhash->{$_}->[0]->{'nodetype'}) && ($ppctabhash->{$_}->[0]->{'nodetype'} eq "blade")) { + push @ngpfsp, $_; + next; + } + else { + # Non NGP power blade + push @mp, $_; + next; + } + } elsif (defined ($ppctabhash->{$_}->[0]->{'nodetype'})) { + # otherwise, this is a general power node push @commonfsp, $_; - } - } - - # To check the type of parent of node, if equaling cmm, should be ngp fsp - my @parents = (keys %fspparent); - $mptabhash = $mptab->getNodesAttribs(\@parents,['nodetype']); - foreach (keys %fspparent) { - if (defined($mptabhash->{$_}->[0]->{'nodetype'}) - && $mptabhash->{$_}->[0]->{'nodetype'} eq "cmm") { - push @ngpfsp, @{$fspparent{$_}}; } else { - push @commonfsp, @{$fspparent{$_}}; + push @unknow, $_; } } push @{$mpnodes}, @mp; push @{$fspnodes}, @commonfsp; - ## TRACE_LINE print "Nodes filter: mpnodes [@{$mpnodes}], fspnodes [@{$fspnodes}]\n"; if (@args && ($cmd eq "rspconfig") && (grep /^(network|network=.*)$/, @args)) { push @{$mpnodes}, @ngpfsp; } elsif($cmd eq "getmacs") { if (@args && (grep /^-D$/,@args)) { - @mp = (); - foreach (@{$mpnodes}) { - if (defined($ppctabhash->{$_}->[0]->{'parent'})) { - push @{$fspnodes}, $_; - } else { - push @mp, $_; - } - } push @{$fspnodes}, @ngpfsp; - @{$mpnodes} = ();; - push @{$mpnodes}, @mp; } else { push @{$mpnodes}, @ngpfsp; } @@ -3751,11 +3674,13 @@ sub filter_nodes{ push @{$fspnodes}, @ngpfsp; } + push @{$nohandle}, @unknow; + + ## TRACE_LINE print "Nodes filter: nodetype [commp:@mp,ngpp:@ngpfsp,comfsp:@commonfsp]. mpnodes [@{$mpnodes}], fspnodes [@{$fspnodes}]\n"; return 0; } - - + sub build_more_info{ my $noderange=shift; my $callback=shift; @@ -3768,32 +3693,12 @@ sub build_more_info{ my %mpa_hash=(); my $mptabhash = $mptab->getNodesAttribs($noderange,['mpa','id','nodetype']); - # try to get the mpa from the ppc table for the fsp of NGP blade - my $ppctab = xCAT::Table->new("ppc"); - my $ppctabhash; - if ($ppctab) { - $ppctabhash = $ppctab->getNodesAttribs($noderange,['parent','id']); - } foreach my $node (@$noderange) { my $ent=$mptabhash->{$node}->[0]; #$mptab->getNodeAttribs($node,['mpa', 'id']); if (defined($ent->{mpa})) { push @{$mpa_hash{$ent->{mpa}}{nodes}}, $node;} else { - # for the NGP ppc blade, the ppc.parent is the mpa - my $ppcent = $ppctabhash->{$node}->[0]; - if (defined($ppcent->{'parent'}) && defined($ppcent->{'id'})) { - $ent= $mptab->getNodeAttribs($ppcent->{'parent'}, ['mpa','id','nodetype']); - if (defined($ent->{'nodetype'}) - && $ent->{'nodetype'} eq "cmm") { - push @{$mpa_hash{$ent->{'mpa'}}{nodes}}, $node; - $ent->{'id'} = $ppcent->{'id'}; - } else { - $callback->({data=>["no mpa defined for node $node"]}); - return @moreinfo;; - } - } else { $callback->({data=>["no mpa defined for node $node"]}); return @moreinfo;; - } } if (defined($ent->{id})) { push @{$mpa_hash{$ent->{mpa}}{ids}}, $ent->{id};} else { push @{$mpa_hash{$ent->{mpa}}{ids}}, "";} @@ -3943,19 +3848,19 @@ sub process_request { } } my $node; - if ($found) { + if ($found) { $node = $macmap{$mac}; } else { my $uuid; foreach $uuid (@{$request->{uuid}}) { $uuid = uc($uuid); - if ($uuid and $uuidmap{$uuid}) { - $node = $uuidmap{$uuid}; - last; - } - } + if ($uuid and $uuidmap{$uuid}) { + $node = $uuidmap{$uuid}; + last; + } + } } - unless ($node) { + unless ($node) { return 1; #failure } if ($mac) { @@ -3964,6 +3869,7 @@ sub process_request { $mactab->close(); undef $mactab; } + #my %request = ( # command => ['makedhcp'], # node => [$macmap{$mac}] @@ -3991,7 +3897,7 @@ sub process_request { my $pass=$bladepass; my $ent; if (defined($mpatab)) { - ($ent)=$mpatab->getNodeAttribs($mpa, ['username','password']); + ($ent)=$mpatab->getNodeSpecAttribs($mpa, {username=>"USERID"},['username','password']);#zet modify here if (defined($ent->{password})) { $pass = $ent->{password}; } if (defined($ent->{username})) { $user = $ent->{username}; } } @@ -4335,29 +4241,48 @@ sub network { if ( $value !~ /^\*$/) { return([1,"Invalid format: 'network=*'"]); } - my %nethash = xCAT::DBobjUtils->getNetwkInfo([$node]); - my $gate = $nethash{$node}{gateway}; - my $result; + if ($mpa eq $node) { #for network configure to management module + my %nethash = xCAT::DBobjUtils->getNetwkInfo([$node]); + my $gate = $nethash{$node}{gateway}; + my $result; - if ($gate) { - $result = xCAT::Utils::toIP($gate); - if (@$result[0] == 0) { - $gateway = @$result[1]; + if ($gate) { + $result = xCAT::Utils::toIP($gate); + if (@$result[0] == 0) { + $gateway = @$result[1]; + } } - } - $mask = $nethash{$node}{mask}; - #the host is only needed for the map network configuration - if ($node eq $mpa) { + $mask = $nethash{$node}{mask}; + #the host is only needed for the mpa network configuration $host = $node; - } - my $hosttab = xCAT::Table->new( 'hosts' ); - if ($hosttab) { - my ($ent) = $hosttab->getNodeAttribs($node,['ip']); - if (defined($ent)) { - $ip = $ent->{ip}; + my $hosttab = xCAT::Table->new( 'hosts' ); + if ($hosttab) { + my ($ent) = $hosttab->getNodeAttribs($node,['ip']); + if (defined($ent)) { + $ip = $ent->{ip}; + } + $hosttab->close(); } - $hosttab->close(); + } else { + my $ppctab = xCAT::Table->new( 'ppc' ); + if ($ppctab) { + my $ppcent = $ppctab->getNodeAttribs($node,['hcp']); + if (defined($ppcent)) { + $ip = $ppcent->{hcp}; + } + } + my %nethash = xCAT::DBobjUtils->getNetwkInfo([$ip]); + my $gate = $nethash{$ip}{gateway}; + my $result; + + if ($gate) { + $result = xCAT::Utils::toIP($gate); + if (@$result[0] == 0) { + $gateway = @$result[1]; + } + } + $mask = $nethash{$ip}{mask}; } } } else { @@ -4865,11 +4790,14 @@ sub dompa { $text =~ s/\s+$//; $output{node}->[0]->{errorcode} = $rc; $output{node}->[0]->{name}->[0]=$node; - if ($rc) { - $output{node}->[0]->{error}->[0]=$text; - } else { - $output{node}->[0]->{data}->[0]->{contents}->[0]=$text; - } + # Don't use the {error} keyword to avoid the auto added 'Error' + # in the output especially for part of the nodes failed. + $output{node}->[0]->{data}->[0]->{contents}->[0]=$text; + #if ($rc) { + # $output{node}->[0]->{error}->[0]=$text; + #} else { + # $output{node}->[0]->{data}->[0]->{contents}->[0]=$text; + #} print $out freeze([\%output]); print $out "\nENDOFFREEZE6sK4ci\n";