diff --git a/xCAT-server/lib/xcat/plugins/slpdiscover.pm b/xCAT-server/lib/xcat/plugins/slpdiscover.pm index 4a1ec0a22..cb10b8cde 100644 --- a/xCAT-server/lib/xcat/plugins/slpdiscover.pm +++ b/xCAT-server/lib/xcat/plugins/slpdiscover.pm @@ -79,22 +79,10 @@ sub process_request { $callback = shift; $docmd = shift; %searchmacs=(); + %flexchassismap = (); my $srvtypes = [ qw/service:management-hardware.IBM:chassis-management-module service:management-hardware.IBM:management-module service:management-hardware.IBM:integrated-management-module2/ ]; xCAT::SLP::dodiscover(SrvTypes=>$srvtypes,Callback=>\&handle_new_slp_entity); - $macmap = xCAT::MacMap->new(); - $macmap->refresh_table(); - my @toconfig; - foreach my $mac (keys(%searchmacs)) { - my $node = $macmap->find_mac($mac,1); - unless ($node) { - next; - } - my $data = $searchmacs{$mac}; - $data->{nodename}=$node; - $data->{macaddress}=$mac; - $chassisbyuuid{$data->{attributes}->{"enclosure-uuid"}->[0]}=$node; - push @toconfig,$data; - } + my $mpatab=xCAT::Table->new("mpa",-create=>0); my @mpaentries; $mpahash={}; @@ -117,13 +105,13 @@ sub process_request { } my $mactab = xCAT::Table->new("mac"); my %machash; + my %node2machash; my %macuphash; my @maclist = $mactab->getAllNodeAttribs([qw/node mac/]); foreach (@maclist) { $machash{$_->{node}}=$_->{mac}; + $node2machash{$_->{mac}} = $_->{node}; } - - my $mptab = xCAT::Table->new('mp'); if ($mptab) { @@ -132,7 +120,26 @@ sub process_request { $nodebymp{$_->{mpa}}->{$_->{id}}=$_->{node}; } } - + + $macmap = xCAT::MacMap->new(); + $macmap->refresh_table(); + my @toconfig; + foreach my $mac (keys(%searchmacs)) { + my $node = $macmap->find_mac($mac,1); + unless ($node) { + if (defined $node2machash{$mac}) { + $node = $node2machash{$mac}; + } else { + next; + } + } + my $data = $searchmacs{$mac}; + $data->{nodename}=$node; + $data->{macaddress}=$mac; + $chassisbyuuid{$data->{attributes}->{"enclosure-uuid"}->[0]}=$node; + push @toconfig,$data; + } + foreach my $data (@toconfig) { my $mac = $data->{macaddress}; my $nodename = $data->{nodename}; @@ -141,13 +148,16 @@ sub process_request { $addr .= "%".$data->{scopeid}; } $flexchassisuuid{$nodename}=$data->{attributes}->{"enclosure-uuid"}->[0]; - setup_cmm_pass($nodename); - if ($machash{$nodename} =~ /$mac/i) { #ignore prospects already known to mac table - configure_hosted_elements($nodename); - next; - } + if ($data->{SrvType} eq "service:management-hardware.IBM:chassis-management-module") { sendmsg(":Found ".$data->{SrvType}." at address $addr",$callback,$nodename); + + setup_cmm_pass($nodename); + if ($machash{$nodename} =~ /$mac/i) { #ignore prospects already known to mac table + configure_hosted_elements($nodename); + next; + } + unless (do_blade_setup($data,curraddr=>$addr)) { next; } @@ -172,14 +182,21 @@ sub setupIMM { my $newaddr; if ($ient) { my $bmcid=$ient->{bmcid}; - if ($bmcid and $slpdata->{macaddress} =~ /$bmcid/) { return; } #skip configuration, we already know this one + if ($bmcid and $slpdata->{macaddress} =~ /$bmcid/) { + sendmsg("The IMM ".$node." has been configured (ipmi.bmcid). Skipped.",$callback); + return; + } #skip configuration, we already know this one $newaddr = $ient->{bmc}; } my @ips; if ($newaddr) { @ips = xCAT::NetworkUtils::getipaddr($newaddr,GetAllAddresses=>1); } - sendmsg(":Configuration of ".$node." commencing, configuration may take a few minutes to take effect",$callback); + if (!@ips) { + sendmsg(":Cannot find the IP attribute for bmc",$callback,$node); + return; + } + sendmsg(":Configuration of ".$node."[".join(',',@ips)."] commencing, configuration may take a few minutes to take effect",$callback); #ok, with all ip addresses in hand, time to enable IPMI and set all the ip addresses (still static only, TODO: dhcp my $ssh = new xCAT::SSHInteract(-username=>$args{username}, -password=>$args{password}, @@ -210,8 +227,8 @@ sub configure_hosted_elements { my $node; my $immdata; my $slot; - my $user = $passwordmap{$cmm}->{username}; - my $pass = $passwordmap{$cmm}->{password}; + my $user = $passwordmap{$cmm}->{username}; + my $pass = $passwordmap{$cmm}->{password}; foreach $immdata (@{$flexchassismap{$uuid}}) { $slot=$immdata->{attributes}->{slot}->[0]; if ($node = $nodebymp{$cmm}->{$slot}) { @@ -232,10 +249,10 @@ sub setup_cmm_pass { my $localpass=$defaultbladepass; if ($mpahash->{$nodename}) { if ($mpahash->{$nodename}->{username}) { - $localuser = $mpahash->{$nodename}->[0]->{username}; + $localuser = $mpahash->{$nodename}->{username}; } if ($mpahash->{$nodename}->{password}) { - $localuser = $mpahash->{$nodename}->[0]->{password}; + $localpass = $mpahash->{$nodename}->{password}; } } $passwordmap{$nodename}->{username}=$localuser;