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:
@ -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 );
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user