Call lshwres to achieve mac address if no ping test performed

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@3519 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
wanghuaz 2009-06-05 07:29:12 +00:00
parent f559f74fd3
commit 2afae2141c
2 changed files with 341 additions and 112 deletions

View File

@ -522,11 +522,17 @@ sub mkvterm {
if ( $type ne "lpar" ) {
return( [RC_ERROR,"Command not supported on '$type'"] );
}
##########################################
# Cleanup old sessions
# Close the old sessions
##########################################
rmvterm( $exp, $lparid, $mtms );
sleep 1;
if ( $hwtype eq "ivm" ) {
rmvterm( $exp, $lparid, $mtms );
sleep 1;
} else {
rmvterm_noforce( $exp, $lparid, $mtms );
sleep 1;
}
##########################################
# Send command
@ -599,17 +605,57 @@ sub rmvterm {
$ssh->send( "$cmd\r" );
}
##########################################################################
# Force close a virtual terminal session
##########################################################################
sub rmvterm_noforce {
my $exp = shift;
my $lparid = shift;
my $mtms = shift;
my $ssh = @$exp[0];
my $hwtype = @$exp[2];
#####################################
# Format command based on HW Type
#####################################
my %rmvt = (
hmc =>"rmvterm --id %s -m %s",
ivm =>"rmvt -id %s"
);
#####################################
# Set command based on HW type
# rmvt(erm) -id lparid -m cecmtms
#####################################
my $cmd = sprintf( $rmvt{$hwtype}, $lparid, $mtms );
#####################################
# Send command
#####################################
send_cmd( $exp, $cmd );
}
##########################################################################
# Lists the hardware resources of a managed system
##########################################################################
sub lshwres {
my $exp = shift;
my $d = shift;
my $mtms = shift;
my $cmd = "lshwres -r @$d[1] -m $mtms -F @$d[2]";
my $level = @$d[0];
my $exp = shift;
my $d = shift;
my $mtms = shift;
my $cmd = "lshwres -r @$d[1] -m $mtms";
my $level = @$d[0];
my $Filter = @$d[2];
my $rsubtype = @$d[3];
#####################################
# Specify Filters
#####################################
if ( $Filter ) {
$cmd .=" -F $Filter";
}
#####################################
# level may be "sys" or "lpar"
@ -617,6 +663,14 @@ sub lshwres {
if ( defined( $level )) {
$cmd .=" --level $level";
}
#####################################
# Specify subtype
#####################################
if ( $rsubtype ) {
$cmd .=" --rsubtype $rsubtype"
}
#####################################
# Send command
#####################################
@ -692,6 +746,7 @@ sub lpar_netboot {
if ( grep(/^$node$/, @nodelist) ) {
if ( !grep(/^$osname$/, @oslist) ) {
$cmd.= " -i";
print "fortest:2\n";
}
$intable = 1;
last;
@ -743,6 +798,7 @@ sub lpar_netboot {
#####################################
# Send command
#####################################
my $result = send_cmd( $exp, $cmd, $timeout );
return( $result );
}

View File

@ -43,7 +43,7 @@ sub parse_args {
$Getopt::Long::ignorecase = 0;
Getopt::Long::Configure( "bundling" );
if ( !GetOptions( \%opt,qw(h|help V|Verbose v|version C=s G=s S=s D d f))) {
if ( !GetOptions( \%opt,qw(h|help V|Verbose v|version C=s G=s S=s D d f F=s))) {
return( usage() );
}
####################################
@ -326,127 +326,287 @@ sub do_getmacs {
sub getmacs {
my $request = shift;
my $d = shift;
my $par = shift;
my $exp = shift;
my $opt = $request->{opt};
my $hwtype = @$exp[2];
my $result;
my $name;
#########################################
# Get node data
#########################################
my $lparid = @$d[0];
my $mtms = @$d[2];
my $type = @$d[4];
my $node = @$d[6];
#########################################
# Invalid target hardware
#########################################
if ( $type ne "lpar" ) {
return( [[$node,"Node must be LPAR",RC_ERROR]] );
}
#########################################
# Get name known by HCP
#########################################
my $filter = "name,lpar_id";
my $values = xCAT::PPCcli::lssyscfg( $exp, $type, $mtms, $filter );
my $Rc = shift(@$values);
#########################################
# Return error
#########################################
if ( $Rc != SUCCESS ) {
return( [[$node,@$values[0],$Rc]] );
}
#########################################
# Find LPARs by lpar_id
#########################################
foreach ( @$values ) {
if ( /^(.*),$lparid$/ ) {
$name = $1;
last;
if ( $par =~ /^HASH/ ) {
#########################################
# Parse the filters specified by user
#########################################
my $filter;
if ( $opt->{F} ) {
my @filters = split /,/,$opt->{F};
foreach ( @filters ) {
my @value = split /=/,$_;
$filter->{@value[0]} = @value[1];
}
}
}
#########################################
# Node not found by lpar_id
#########################################
if ( !defined( $name )) {
return( [[$node,"Node not found, lparid=$lparid",RC_ERROR]] );
}
my $sitetab = xCAT::Table->new('site');
my $vcon = $sitetab->getAttribs({key => "conserveronhmc"}, 'value');
if ($vcon and $vcon->{"value"} and $vcon->{"value"} eq "yes" ) {
$result = xCAT::PPCcli::lpar_netboot(
#########################################
# A hash to save lpar attributes
#########################################
my %nodeatt = ();
my $result = ();
#########################################
# No ping test performed, call lshwres
# to achieve the MAC address
#########################################
foreach my $hcp ( keys %$par ) {
my $hash = $par->{$hcp};
my $cmd;
#########################################
# Achieve virtual ethernet MAC address
#########################################
@$cmd[0] = ["lpar","virtualio","","eth"];
@$cmd[1] = ["port","hea","","logical"];
@$cmd[2] = ["port","hea","","phys"];
#########################################
# Parse the output of lshwres command
#########################################
for ( my $stat = 0; $stat < 3; $stat++ ) {
my $output = xCAT::PPCcli::lshwres( $exp, @$cmd[$stat], $hcp);
my $macs;
foreach my $line ( @$output ) {
if ( $line =~ /^.*lpar\_id=(\d+),.*$/ ) {
#########################################
# For the first two commands
#########################################
my $lparid = $1;
$nodeatt{$hcp}{$lparid}{'num'}++;
$macs = $nodeatt{$hcp}{$lparid}{'num'};
my @attrs = split /,/, $line;
foreach ( @attrs ) {
my @attr = split /=/, $_;
$nodeatt{$hcp}{$lparid}{$macs}{@attr[0]} = @attr[1];
}
} elsif ( ($line =~ /^(.*)port\_group=(\d+),(.*),"log\_port\_ids=(.*)"/) || ($line =~ /^(.*)port\_group=(\d+),(.*),log\_port\_ids=(.*)/) ) {
#########################################
# For the third command
#########################################
my $port_group = $2;
if ( $4 !~ /^none$/ ) {
my @ids = split /,/, $4;
my @attrs = split /,/, $1;
foreach (@attrs) {
my @attr = split /=/,$_;
foreach (@ids) {
$nodeatt{$hcp}{$port_group}{$_}{@attr[0]} = @attr[1];
}
}
my @attrs = split /,/, $3;
foreach (@attrs) {
my @attr = split /=/,$_;
foreach (@ids) {
$nodeatt{$hcp}{$port_group}{$_}{@attr[0]} = @attr[1];
}
}
}
}
}
}
#########################################
# Put all the attributes required
# together
#########################################
push @$result,"# Type MAC_Address Phys_Port_Loc Adapter Port_Group Phys_Port Logical_Port VLan VSwitch Curr_Conn_Speed\n";
foreach ( keys %$hash ) {
my $node = $_;
my $d = $hash->{$_};
my $mtms = @$d[2];
my $id = @$d[0];
my $mac_count = $nodeatt{$mtms}{$id}{'num'};
my $type;
push @$result,"\n$node:\n";
for ( my $num = 1; $num <= $mac_count; $num++ ) {
my $mac_addr = $nodeatt{$mtms}{$id}{$num}{'mac_addr'};
my $adapter_id = $nodeatt{$mtms}{$id}{$num}{'adapter_id'};
my $port_group = $nodeatt{$mtms}{$id}{$num}{'port_group'};
my $phys_port_id = $nodeatt{$mtms}{$id}{$num}{'phys_port_id'};
my $logical_port_id = $nodeatt{$mtms}{$id}{$num}{'logical_port_id'};
my $vlan_id = $nodeatt{$mtms}{$id}{$num}{'port_vlan_id'};
my $vswitch = $nodeatt{$mtms}{$id}{$num}{'vswitch'};
my $phys_port_loc = $nodeatt{$mtms}{$port_group}{$logical_port_id}{'phys_port_loc'};
my $curr_conn_speed = $nodeatt{$mtms}{$port_group}{$logical_port_id}{'curr_conn_speed'};
if ( $phys_port_loc ) {
$type = "virtualio";
} else {
$type = "hea";
}
my %att = ();
$att{'MAC_Address'} = ($mac_addr) ? $mac_addr : "N/A";
$att{'Adapter'} = ($adapter_id) ? $adapter_id : "N/A";
$att{'Port_Group'} = ($port_group) ? $port_group : "N/A";
$att{'Phys_Port'} = ($phys_port_id) ? $phys_port_id : "N/A";
$att{'Logical_Port'} = ($logical_port_id) ? $logical_port_id : "N/A";
$att{'VLan'} = ($vlan_id) ? $vlan_id : "N/A";
$att{'VSwitch'} = ($vswitch) ? $vswitch : "N/A";
$att{'Phys_Port_Loc'} = ($phys_port_loc) ? $phys_port_loc : "N/A";
$att{'Curr_Conn_Speed'} = ($curr_conn_speed) ? $curr_conn_speed : "N/A";
$att{'Type'} = $type;
#########################################
# Parse the adapter with the filters
# specified
#########################################
if ( defined($filter) ) {
my $matched = 1;
foreach ( keys %$filter ) {
if ( $att{$_} ne $filter->{$_} ) {
$matched = 0;
last;
}
}
if ( $matched == 1 ) {
push @$result,"$att{'Type'} $att{'MAC_Address'} $att{'Phys_Port_Loc'} $att{'Adapter'} $att{'Port_Group'} $att{'Phys_Port'} $att{'Logical_Port'} $att{'VLan'} $att{'VSwitch'} $att{'Curr_Conn_Speed'}\n";
}
} else {
push @$result,"$att{'Type'} $att{'MAC_Address'} $att{'Phys_Port_Loc'} $att{'Adapter'} $att{'Port_Group'} $att{'Phys_Port'} $att{'Logical_Port'} $att{'VLan'} $att{'VSwitch'} $att{'Curr_Conn_Speed'}\n";
}
}
#########################################
# Write MAC address to database
#########################################
writemac( $node, $result );
}
return([[join /''/,@$result]]);
}
} else {
#########################################
# Connect to fsp to achieve MAC address
#########################################
my $d = $par;
#########################################
# Get node data
#########################################
my $lparid = @$d[0];
my $mtms = @$d[2];
my $type = @$d[4];
my $node = @$d[6];
#########################################
# Invalid target hardware
#########################################
if ( $type ne "lpar" ) {
return( [[$node,"Node must be LPAR",RC_ERROR]] );
}
#########################################
# Get name known by HCP
#########################################
my $filter = "name,lpar_id";
my $values = xCAT::PPCcli::lssyscfg( $exp, $type, $mtms, $filter );
my $Rc = shift(@$values);
#########################################
# Return error
#########################################
if ( $Rc != SUCCESS ) {
return( [[$node,@$values[0],$Rc]] );
}
#########################################
# Find LPARs by lpar_id
#########################################
foreach ( @$values ) {
if ( /^(.*),$lparid$/ ) {
$name = $1;
last;
}
}
#########################################
# Node not found by lpar_id
#########################################
if ( !defined( $name )) {
return( [[$node,"Node not found, lparid=$lparid",RC_ERROR]] );
}
my $sitetab = xCAT::Table->new('site');
my $vcon = $sitetab->getAttribs({key => "conserveronhmc"}, 'value');
if ($vcon and $vcon->{"value"} and $vcon->{"value"} eq "yes" ) {
$result = xCAT::PPCcli::lpar_netboot(
$exp,
$request->{verbose},
$name,
$d,
$opt );
} else {
#########################################
# Manually collect MAC addresses.
#########################################
$result = do_getmacs( $request, $d, $exp, $name, $node );
}
$sitetab->close;
$Rc = shift(@$result);
} else {
#########################################
# Manually collect MAC addresses.
#########################################
$result = do_getmacs( $request, $d, $exp, $name, $node );
}
$sitetab->close;
$Rc = shift(@$result);
##################################
# Form string from array results
##################################
if ( exists($request->{verbose}) ) {
if ( $Rc == SUCCESS ) {
if ( !exists( $opt->{d} )) {
writemac( $node, $result );
##################################
# Form string from array results
##################################
if ( exists($request->{verbose}) ) {
if ( $Rc == SUCCESS ) {
if ( !exists( $opt->{d} )) {
writemac( $node, $result );
}
}
return( [[$node,join( '', @$result ),$Rc]] );
}
##################################
# Return error
##################################
if ( $Rc != SUCCESS ) {
if ( @$result[0] =~ /lpar_netboot: (.*)/ ) {
return( [[$node,$1,$Rc]] );
}
return( [[$node,join( '', @$result ),$Rc]] );
}
#####################################
# lpar_netboot returns:
#
# # Connecting to lpar4\n
# # Connected\n
# # Checking for power off.\n
# # Power off complete.\n
# # Power on lpar4 to Open Firmware.\n
# # Power on complete.\n
# # Getting adapter location codes.\n
# # Type\t Location Code\t MAC Address\t Full Path Name\tPing Result\n
# ent U9117.MMA.10F6F3D-V5-C3-T1 1e0e122a930d /vdevice/l-lan@30000003
#
#####################################
my $data;
foreach ( @$result ) {
if ( /^#\s?Type/ ) {
$data.= "\n$_\n";
} elsif ( /^ent\s+/ ) {
$data.= format_mac( $_ );
}
}
return( [[$node,join( '', @$result ),$Rc]] );
}
##################################
# Return error
##################################
if ( $Rc != SUCCESS ) {
if ( @$result[0] =~ /lpar_netboot: (.*)/ ) {
return( [[$node,$1,$Rc]] );
#####################################
# Write first valid adapter MAC to database
#####################################
if ( !exists( $opt->{d} )) {
writemac( $node, $result );
}
return( [[$node,join( '', @$result ),$Rc]] );
return( [[$node,$data,$Rc]] );
}
#####################################
# lpar_netboot returns:
#
# # Connecting to lpar4\n
# # Connected\n
# # Checking for power off.\n
# # Power off complete.\n
# # Power on lpar4 to Open Firmware.\n
# # Power on complete.\n
# # Getting adapter location codes.\n
# # Type\t Location Code\t MAC Address\t Full Path Name\tPing Result\n
# ent U9117.MMA.10F6F3D-V5-C3-T1 1e0e122a930d /vdevice/l-lan@30000003
#
#####################################
my $data;
foreach ( @$result ) {
if ( /^#\s?Type/ ) {
$data.= "\n$_\n";
} elsif ( /^ent\s+/ ) {
$data.= format_mac( $_ );
}
}
#####################################
# Write first valid adapter MAC to database
#####################################
if ( !exists( $opt->{d} )) {
writemac( $node, $result );
}
return( [[$node,$data,$Rc]] );
}
##########################################################################
# Insert colons in MAC addresses for Linux only
##########################################################################
@ -482,6 +642,8 @@ sub writemac {
my $data = shift;
my $value;
my $pingret;
my $ping_test;
my $mac;
my @fields;
#####################################
@ -499,6 +661,7 @@ sub writemac {
@fields = split /\s+/, $value;
$pingret = $fields[4];
if ( $pingret eq "successful" ) {
$ping_test = 0;
last;
}
}
@ -510,7 +673,12 @@ sub writemac {
if ( $pingret ne "successful" ) {
foreach ( @$data ) {
if ( /^ent\s+/ ) {
$value = $_;
$value = $_;
$ping_test = 0;
last;
} elsif ( /^hea\s+/ || /^virtualio\s+/ ) {
$value = $_;
$ping_test = 1;
last;
}
}
@ -527,7 +695,12 @@ sub writemac {
#####################################
$value = format_mac( $value );
@fields = split /\s+/, $value;
my $mac = $fields[2];
if ( $ping_test ) {
$mac = $fields[1];
} else {
$mac = $fields[2];
}
#####################################
# Write adapter mac to database