Change the code logic that get bmc name from ipmi.bmc instead of using default <node>-bmc. If user uses hostiprange or bmciprange and did not define ipmi.bmc, the default bmc name will be <node>-bmc.
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@16588 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
parent
9ba0cd197e
commit
518d0c0b02
@ -131,6 +131,7 @@ sub findme {
|
||||
if ($node) {
|
||||
my $skiphostip;
|
||||
my $skipbmcip;
|
||||
my $bmcname;
|
||||
# check the host ip and bmc
|
||||
my $hosttab = xCAT::Table->new('hosts');
|
||||
unless ($hosttab) {
|
||||
@ -143,18 +144,27 @@ sub findme {
|
||||
}
|
||||
}
|
||||
|
||||
my $bmcip = getpredefips([$node], "bmc");
|
||||
foreach (keys %$bmcip) {
|
||||
if ($bmcip->{$_} eq "$node-bmc") {
|
||||
$skipbmcip = 1;
|
||||
}
|
||||
}
|
||||
|
||||
my $ipmitab = xCAT::Table->new('ipmi');
|
||||
unless ($ipmitab) {
|
||||
xCAT::MsgUtils->message("S", "Discovery Error: Could not open table: ipmi.");
|
||||
}
|
||||
|
||||
# check the bmc definition in the ipmi table
|
||||
my $ipmient = $ipmitab->getNodeAttribs($node, ['bmc']);
|
||||
if (defined($ipmient->{'bmc'})) {
|
||||
$bmcname = $ipmient->{'bmc'};
|
||||
if ($bmcname =~ /\d+\.\d+\.\d+\.\d+/) {
|
||||
$skipbmcip = 1;
|
||||
} else {
|
||||
my $bmcip = getpredefips([$node], "bmc");
|
||||
foreach (keys %$bmcip) {
|
||||
if ($bmcip->{$_} eq $bmcname) {
|
||||
$skipbmcip = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# set the host ip if the node does not have
|
||||
unless ($skiphostip) {
|
||||
my $hostip = getfreeips($param{'hostiprange'}, \@allnodes, "host");
|
||||
@ -167,8 +177,11 @@ sub findme {
|
||||
}
|
||||
|
||||
# set the bmc ip if the node does not have
|
||||
my $bmcname = $node."-bmc";
|
||||
unless ($skipbmcip) {
|
||||
unless ($bmcname) {
|
||||
# set the default bmc name
|
||||
$bmcname= $node."-bmc";
|
||||
}
|
||||
my $bmcip = getfreeips($param{'bmciprange'}, \@allnodes, "bmc");
|
||||
unless ($bmcip) {
|
||||
nodediscoverstop($callback, undef, "bmc ips");
|
||||
@ -182,7 +195,7 @@ sub findme {
|
||||
}
|
||||
|
||||
# update the host ip pair to /etc/hosts, it's necessary for discovered and makedhcp commands
|
||||
my @newhosts = ($node, $node."-bmc");
|
||||
my @newhosts = ($node, $bmcname);
|
||||
if (@newhosts) {
|
||||
my $req;
|
||||
$req->{command}=['makehosts'];
|
||||
@ -475,6 +488,13 @@ Usage:
|
||||
foreach (keys %$prebmcs) {
|
||||
$prebmcips{$prebmcs->{$_}} = $_; #pre{bmcname} = ip
|
||||
}
|
||||
|
||||
# get the bmc of nodes
|
||||
my $ipmitab = xCAT::Table->new('ipmi');
|
||||
my $ipmient;
|
||||
if ($ipmitab) {
|
||||
$ipmient = $ipmitab->getNodesAttribs(\@freenodes, ['bmc']);
|
||||
}
|
||||
|
||||
my $vrsp;
|
||||
push @{$vrsp->{data}}, "\n====================Free Nodes===================";
|
||||
@ -497,9 +517,16 @@ Usage:
|
||||
}
|
||||
|
||||
# if predefined, use it; otherwise pop out one from the free ip list
|
||||
if (defined ($prebmcips{$_."-bmc"})) {
|
||||
$bmcip = $prebmcips{$_."-bmc"};
|
||||
} else {
|
||||
my $bmcname;
|
||||
if (defined ($ipmient->{$_}->[0]->{'bmc'})) {
|
||||
$bmcname = $ipmient->{$_}->[0]->{'bmc'};
|
||||
if ($bmcname =~ /\d+\.\d+\.\d+\.\d+/) {
|
||||
$bmcip = $bmcname;
|
||||
} elsif (defined ($prebmcips{$bmcname})) {
|
||||
$bmcip = $prebmcips{$bmcname};
|
||||
}
|
||||
}
|
||||
unless ($bmcip) {
|
||||
while (($bmcip = shift @freebmcips)) {
|
||||
if (!defined($prebmcs->{$bmcip})) { last;}
|
||||
}
|
||||
@ -1118,7 +1145,7 @@ sub getfreenodes () {
|
||||
}
|
||||
|
||||
=head3 getpredefips
|
||||
Get the nodes which have ip predefined
|
||||
Get the ips which have been predefined to host or bmc
|
||||
arg1 - a refenrece to the array of nodes
|
||||
arg2 - type: host, bmc
|
||||
|
||||
@ -1135,43 +1162,49 @@ sub getpredefips {
|
||||
|
||||
my %predefips; # to have the ip which prefined to the nodes
|
||||
if ($type eq "bmc") {
|
||||
# Find the bmc ip which defined in the ipmi.bmc as an ip address instead of name as 'node-bmc'
|
||||
# Find the bmc name from the ipmi table.
|
||||
# if ipmi.bmc is an IP address, that means this is the IP of bmc
|
||||
my @freebmc;
|
||||
my %node2bmc; # $node2bmc{$node} = $bmc;
|
||||
my $ipmitab = xCAT::Table->new('ipmi');
|
||||
if ($ipmitab) {
|
||||
my $ipmient = $ipmitab->getNodesAttribs($freenode, ['bmc']);
|
||||
foreach (@$freenode) {
|
||||
if (defined($ipmient->{$_}->[0]->{'bmc'}) && ($ipmient->{$_}->[0]->{'bmc'} =~ /\d+\.\d+\.\d+\.\d+/)) {
|
||||
$predefips{$ipmient->{$_}->[0]->{'bmc'}} = $_."-bmc";
|
||||
if (defined($ipmient->{$_}->[0]->{'bmc'})) {
|
||||
if ($ipmient->{$_}->[0]->{'bmc'} =~ /\d+\.\d+\.\d+\.\d+/) {
|
||||
$predefips{$ipmient->{$_}->[0]->{'bmc'}} = $_."-bmc";
|
||||
} else {
|
||||
push @freebmc, $ipmient->{$_}->[0]->{'bmc'};
|
||||
$node2bmc{$_} = $ipmient->{$_}->[0]->{'bmc'};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# get the node list of the bmc as 'node-bmc' format
|
||||
my @freebmc;
|
||||
foreach (@$freenode) {
|
||||
push @freebmc, $_.'-bmc';
|
||||
}
|
||||
|
||||
# get the predefined bmcs which ip has been set in the hosts.ip
|
||||
# check the system resolution first, then host.ip, then host.otherinterfaces
|
||||
my $freenodeent = $hoststb->getNodesAttribs(\@freebmc, ['ip']);
|
||||
foreach (@freebmc) {
|
||||
my $nodeip = xCAT::NetworkUtils->getipaddr($_);
|
||||
if ($nodeip) {
|
||||
# handle the bmc which could be resolved to an IP by system
|
||||
$predefips{$nodeip} = $_;
|
||||
} else {
|
||||
# handle the bmc which IP was defined in the hosts.ip
|
||||
if (defined($freenodeent->{$_}->[0]) && $freenodeent->{$_}->[0]->{'ip'}){
|
||||
$predefips{$freenodeent->{$_}->[0]->{'ip'}} = $_;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# get the predefined bmcs which bmc has been set in the hosts.otherinterfaces
|
||||
# handle the bmcs which bmc has been set in the hosts.otherinterfaces
|
||||
$freenodeent = $hoststb->getNodesAttribs($freenode, ['otherinterfaces']);
|
||||
foreach (@$freenode) {
|
||||
# for bmc node, search the hosts.otherinterface to see whether there's perdefined ip for bmc
|
||||
my $bmcip = getbmcip_otherinterfaces($_, $freenodeent->{$_}->[0]->{'otherinterfaces'});
|
||||
if ($bmcip) {
|
||||
$predefips{$bmcip} = $_."-bmc";
|
||||
if (defined ($node2bmc{$_})) {
|
||||
# for bmc node, search the hosts.otherinterface to see whether there's perdefined ip for bmc
|
||||
my $bmcip = getbmcip_otherinterfaces($_, $node2bmc{$_}, $freenodeent->{$_}->[0]->{'otherinterfaces'});
|
||||
if ($bmcip) {
|
||||
$predefips{$bmcip} = $node2bmc{$_};
|
||||
}
|
||||
}
|
||||
}
|
||||
} elsif ($type eq "host") {
|
||||
@ -1224,9 +1257,29 @@ sub getfreeips {
|
||||
|
||||
# get all the used ips, the predefined ip should be ignored
|
||||
my @hostsent = $hoststb->getAllNodeAttribs(['node', 'ip', 'otherinterfaces']);
|
||||
|
||||
# Find the bmc name from the ipmi table.
|
||||
# if ipmi.bmc is an IP address, that means this is the IP of bmc
|
||||
my %node2bmc; # $node2bmc{$node} = $bmc;
|
||||
my $ipmitab = xCAT::Table->new('ipmi');
|
||||
if ($ipmitab) {
|
||||
my @ipmients = $ipmitab->getAllNodeAttribs(['node', 'bmc']);
|
||||
foreach my $ipmient (@ipmients) {
|
||||
if (defined($ipmient->{'bmc'})) {
|
||||
if ($ipmient->{'bmc'} =~ /\d+\.\d+\.\d+\.\d+/) {
|
||||
unless ($predefips{$ipmient->{'bmc'}}) {
|
||||
$usedips{$ipmient->{'bmc'}} = 1;
|
||||
}
|
||||
} else {
|
||||
$node2bmc{$ipmient->{'node'}} = $ipmient->{'bmc'};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach my $host (@hostsent) {
|
||||
# handle the case that node-bmc has an entry in the hosts table
|
||||
my $nodeip = xCAT::NetworkUtils->getipaddr($_);
|
||||
# handle the case that bmc has an entry in the hosts table
|
||||
my $nodeip = xCAT::NetworkUtils->getipaddr($host->{'node'});
|
||||
if ($nodeip) {
|
||||
unless ($predefips{$nodeip}) {
|
||||
$usedips{$nodeip} = 1;
|
||||
@ -1237,10 +1290,19 @@ sub getfreeips {
|
||||
}
|
||||
}
|
||||
# handle the case that the bmc<->ip mapping is specified in hosts.otherinterfaces
|
||||
if (defined($host->{'otherinterfaces'})) {
|
||||
my $bmcip = getbmcip_otherinterfaces($host, $host->{'otherinterfaces'});
|
||||
unless ($predefips{$bmcip}) {
|
||||
$usedips{$bmcip} = 1;
|
||||
if (defined ($node2bmc{$host->{'node'}})) {
|
||||
my $bmcip = xCAT::NetworkUtils->getipaddr($node2bmc{$host->{'node'}});
|
||||
if ($bmcip) {
|
||||
unless ($predefips{$bmcip}) {
|
||||
$usedips{$bmcip} = 1;
|
||||
}
|
||||
} else {
|
||||
if (defined($host->{'otherinterfaces'})) {
|
||||
my $bmcip = getbmcip_otherinterfaces($host->{'node'}, $node2bmc{$host->{'node'}}, $host->{'otherinterfaces'});
|
||||
unless ($predefips{$bmcip}) {
|
||||
$usedips{$bmcip} = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1251,7 +1313,7 @@ sub getfreeips {
|
||||
# get all the used ips, the predefined ip should be ignored
|
||||
my @hostsent = $hoststb->getAllNodeAttribs(['node', 'ip']);
|
||||
foreach my $host (@hostsent) {
|
||||
my $nodeip = xCAT::NetworkUtils->getipaddr($_);
|
||||
my $nodeip = xCAT::NetworkUtils->getipaddr($host->{'node'});
|
||||
if ($nodeip) {
|
||||
unless ($predefips{$nodeip}) {
|
||||
$usedips{$nodeip} = 1;
|
||||
@ -1306,13 +1368,15 @@ sub getfreeips {
|
||||
=head3 getbmcip_otherinterfaces
|
||||
Parse the value in the hosts.otherinterfaces
|
||||
arg1 - node
|
||||
arg2 - value in the hosts.otherinterfaces
|
||||
arg2 - bmc name
|
||||
arg3 - value in the hosts.otherinterfaces
|
||||
|
||||
return: the ip of the node <node>-bmc
|
||||
=cut
|
||||
sub getbmcip_otherinterfaces
|
||||
{
|
||||
my $node = shift;
|
||||
my $node = shift;
|
||||
my $bmc = shift;
|
||||
my $otherinterfaces = shift;
|
||||
|
||||
my @itf_pairs = split(/,/, $otherinterfaces);
|
||||
@ -1330,7 +1394,7 @@ sub getbmcip_otherinterfaces
|
||||
$itf = $node . $itf;
|
||||
}
|
||||
|
||||
if ($itf eq "$node-bmc") {
|
||||
if ($itf eq $bmc) {
|
||||
return xCAT::NetworkUtils->getipaddr($ip);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user