SLP automatic naming for FSP/BPA (via set DHCP configuration)

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@2342 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
zhanx
2008-10-14 07:07:38 +00:00
parent 9d97443410
commit e3a3ca1216

View File

@ -1931,13 +1931,10 @@ sub switch_cmd {
my $req = shift;
my $slp = shift;
my %mm;
my %hmc;
my %slp_mm;
my %slp_hmc;
my %slp_all;
my %hosts;
my @entries;
my $targets = {};
my $hosttab = xCAT::Table->new( 'hosts' );
my $swtab = xCAT::Table->new( 'switch' );
@ -1950,16 +1947,21 @@ sub switch_cmd {
###########################################
# Any MMs/HMCs in SLP response
###########################################
foreach ( @$slp ) {
if ( /\(type=management-module\)/ and /\(ip-address=([^\),]+)/) {
$slp_mm{$1} = undef;
next;
}
if ( /\(type=hardware-management-console\)/ and /\(ip-address=([^\),]+)/) {
$slp_hmc{$1} = undef;
foreach my $slp_entry ( @$slp ) {
foreach my $service_type (SERVICE_FSP, SERVICE_BPA, SERVICE_MM, SERVICE_HMC)
{
if ( $slp_entry =~ /\(type=$service_type\)/ and $slp_entry =~ /\(ip-address=([^\),]+)/)
{
$slp_all{$1}{'mac'} = undef;
$slp_all{$1}{'type'} = 'MM' if $service_type eq SERVICE_MM;
$slp_all{$1}{'type'} = 'FSP' if $service_type eq SERVICE_FSP;
$slp_all{$1}{'type'} = 'BPA' if $service_type eq SERVICE_BPA;
$slp_all{$1}{'type'} = 'HMC' if $service_type eq SERVICE_HMC;
last;
}
}
}
%slp_all = (%slp_mm,%slp_hmc);
###########################################
# No MMs/HMCs in response
###########################################
@ -1999,30 +2001,60 @@ sub switch_cmd {
# Ping each MM/HMCs to update arp table
###########################################
foreach my $ip ( keys %slp_all ) {
my $cmd = `ping -c 1 -w 0 $ip`;
if ( $^O eq 'aix')
{
`ping -c 1 -w 1 $ip`;
}
else
{
`ping -c 1 -w 0 $ip`;
}
}
###########################################
# Match discovered IP to MAC in arp table
###########################################
my $arp = `/sbin/arp -n`;
my $arp;
if ( $^O eq 'aix')
{
$arp = `/usr/sbin/arp -a`;
}
else
{
$arp = `/sbin/arp -n`;
}
my @arpents = split /\n/, $arp;
if ( $verbose ) {
trace( $req, "ARP TABLE:" );
}
foreach ( @arpents ) {
/^(\S+)+\s+\S+\s+(\S+)\s/;
if ( exists( $slp_all{$1} )) {
my $isMacFound = 0;
foreach my $arpent ( @arpents ) {
my ($ip, $mac);
if ( $^O eq 'aix' && $arpent =~ /\((\S+)\)\s+at\s+(\S+)/)
{
($ip, $mac) = ($1,$2);
}
elsif ( $arpent =~ /^(\S+)+\s+\S+\s+(\S+)\s/)
{
($ip, $mac) = ($1,$2);
}
else
{
($ip, $mac) = (undef,undef);
}
if ( exists( $slp_all{$ip} )) {
if ( $verbose ) {
trace( $req, "\t\t($1)->($2)" );
trace( $req, "\t\t($ip)->($mac)" );
}
$slp_all{$1} = $2;
$slp_all{$ip}{'mac'} = $mac;
$isMacFound = 1;
}
}
###########################################
# No discovered IP - MAC matches
###########################################
if ( !grep( defined($_), values %slp_all )) {
if ( ! $isMacFound) {
return;
}
if ( $verbose ) {
@ -2032,69 +2064,103 @@ sub switch_cmd {
#######################################
# Not in SLP response
#######################################
if ( !defined( $slp_all{$ip} ) or !defined( $macmap )) {
if ( !defined( $slp_all{$ip}{'mac'} ) or !defined( $macmap )) {
next;
}
#######################################
# Get node from switch
#######################################
my $name = $macmap->find_mac( $slp_all{$ip} );
my $name = $macmap->find_mac( $slp_all{$ip}{'mac'} );
if ( !defined( $name )) {
if ( $verbose ) {
trace( $req, "\t\t($slp_all{$ip})-> NOT FOUND" );
trace( $req, "\t\t($slp_all{$ip}{'mac'})-> NOT FOUND" );
}
next;
}
if ( $verbose ) {
trace( $req, "\t\t($slp_all{$ip})-> $name" );
trace( $req, "\t\t($slp_all{$ip}{'mac'})-> $name" );
}
#######################################
# In hosts table
#######################################
if ( defined( $hosts{$name} )) {
if ( exists $slp_mm{$ip})
{
if ( $ip eq $hosts{$name} ) {
if ( $verbose ) {
trace( $req, "MM already set '$ip' - skipping" );
}
next;
if ( $ip eq $hosts{$name} ) {
if ( $verbose ) {
trace( $req, "$slp_all{$ip}{'type'} already set '$ip' - skipping" );
}
$mm{$ip}->{args} = "$hosts{$name},$name";
$mm{$ip}->{type} = "MM";
}
elsif ( exists $slp_hmc{$ip})
else
{
if ( $ip eq $hosts{$name} ) {
if ( $verbose ) {
trace( $req, "HMC already set '$ip' - skipping" );
}
next;
}
$hmc{$ip}->{args} = "$hosts{$name},$name";
$hmc{$ip}->{type} = "HMC";
$targets->{$slp_all{$ip}{'type'}}->{$ip}->{'args'} = "$hosts{$name},$name";
$targets->{$slp_all{$ip}{'type'}}->{$ip}->{'mac'} = $slp_all{$ip}{'mac'};
$targets->{$slp_all{$ip}{'type'}}->{$ip}->{'name'} = $name;
$targets->{$slp_all{$ip}{'type'}}->{$ip}->{'ip'} = $hosts{$name};
}
}
}
###########################################
# No MMs
###########################################
if ( !%mm && !%hmc) {
if ( !%$targets) {
if ( $verbose ) {
trace( $req, "No ARP-Switch-SLP matches found" );
}
return;
}
###########################################
# Update MM hardware w/discovery info
# Update MM/HMC hardware w/discovery info
###########################################
my $result = rspconfig( $req, \%mm, \%hmc );
my $result;
if (exists $targets->{'MM'} || exists $targets->{'HMC'})
{
$result = rspconfig( $req, $targets );
}
else
{
$result = dhcpconfig ($req, $targets );
}
return( $result );
}
sub dhcpconfig
{
my $request = shift;
my $targets = shift;
my $callback = $request->{callback};
my $fsp = $targets->{'FSP'};
my $bpa = $targets->{'BPA'};
$fsp = {} if (!$fsp);
$bpa = {} if (!$bpa);
my $dhcp_targets = {%$fsp, %$bpa};
my $mactab = xCAT::Table->new( "mac", -create=>1, -autocommit=>1 );
if ( !$mactab ) {
return 1;
}
for my $node ( keys %$dhcp_targets)
{
my $name = $dhcp_targets->{$node}->{'name'};
my $mac = $dhcp_targets->{$node}->{'mac'};
$mactab->setNodeAttribs( $name,{mac=>$mac} );
}
$mactab->close();
my @nodelist = ();
for my $ip (keys %$dhcp_targets)
{
push @nodelist, $dhcp_targets->{$ip}->{'name'};
}
my $cmdref;
$cmdref->{arg} = [];
$cmdref->{command}->[0] = "makedhcp";
$cmdref->{cwd}->[0] = "/opt/xcat/sbin";
$cmdref->{noderange}->[0] = join ',', @nodelist;
$cmdref->{node} = \@nodelist;
xCAT_plugin::dhcp::process_request($cmdref, \&xCAT::Client::handle_response);
return 1;
}
##########################################################################
# Run rspconfig against MMs
@ -2102,12 +2168,16 @@ sub switch_cmd {
sub rspconfig {
my $request = shift;
my $mm = shift;
my $hmc = shift;
my $targets = shift;
my $callback = $request->{callback};
my $start;
if (%$mm)
my $mm = $targets->{'MM'};
my $hmc = $targets->{'HMC'};
#my $fsp = $targets->{'FSP'};
#my $bpa = $targets->{'BPA'};
if ($mm && %$mm)
{
my $bladeuser = 'USERID';
my $bladepass = 'PASSW0RD';
@ -2143,7 +2213,7 @@ sub rspconfig {
$mm->{$_}->{password} = $pass;
}
}
if (%$hmc)
if ($hmc && %$hmc)
{
my $hmcuser = 'hscroot';
my $hmcpass = 'abc123';
@ -2171,7 +2241,7 @@ sub rspconfig {
}
}
my %target_dev = (%$mm,%$hmc);
my %rsp_dev = (%$mm,%$hmc);
#############################################
# Fork one process per MM/HMC
#############################################
@ -2179,8 +2249,8 @@ sub rspconfig {
$SIG{CHLD} = sub { while (waitpid(-1, WNOHANG) > 0) { $children--; } };
my $fds = new IO::Select;
foreach my $ip ( keys %target_dev) {
my $pipe = fork_cmd( $request, $ip, \%target_dev);
foreach my $ip ( keys %rsp_dev) {
my $pipe = fork_cmd( $request, $ip, \%rsp_dev);
if ( $pipe ) {
$fds->add( $pipe );
$children++;
@ -2215,7 +2285,7 @@ sub rspconfig {
if ( $verbose ) {
trace( $request, "$ip: @$result[0]" );
}
delete $target_dev{$ip};
delete $rsp_dev{$ip};
next;
}
}
@ -2232,7 +2302,7 @@ sub rspconfig {
if ( $cmd =~ /^network_reset/ ) {
if ( $Rc != SUCCESS ) {
delete $target_dev{$ip};
delete $rsp_dev{$ip};
next;
}
if ( $verbose ) {
@ -2252,7 +2322,7 @@ sub rspconfig {
if ( $verbose ) {
trace( $request, "Error opening '$fname'" );
}
return( \%target_dev );
return( \%rsp_dev );
}
my @rawdata = <HOSTS>;
close( HOSTS );
@ -2260,8 +2330,8 @@ sub rspconfig {
######################################
# Remove old entry
######################################
foreach ( keys %target_dev) {
my ($ip,$host) = split /,/,$target_dev{$_}->{args};
foreach ( keys %rsp_dev) {
my ($ip,$host) = split /,/,$rsp_dev{$_}->{args};
foreach ( @rawdata ) {
if ( /^#/ or /^\s*\n$/ ) {
next;
@ -2278,11 +2348,11 @@ sub rspconfig {
if ( $verbose ) {
trace( $request, "Error opening '$fname'" );
}
return( \%target_dev );
return( \%rsp_dev );
}
print HOSTS @rawdata;
close( HOSTS );
return( \%target_dev );
return( \%rsp_dev );
}