-Add a mass mac address generation function to VMCommon to leverage setNodesAttribs performance advantages when making many vms

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@4680 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
jbjohnso 2009-11-27 15:14:20 +00:00
parent 5de5e5e500
commit eca74c9ade

View File

@ -73,6 +73,81 @@ sub macsAreUnique { #internal function, do not call, argument format may change
return 1;
}
sub requestMacAddresses {
#This function combs through the list of nodes to assure every vm.nic declared nic has a mac address
my $tablecfg = shift;
my $neededmacs = shift;
my $mactab = xCAT::Table->new("mac",-create=>1);
my $node;
my @allmacs;
my $complete = 0;
my $updatesneeded;
srand(); #Re-seed the rng. This will make the mac address generation less deterministic
while (not $complete) {
foreach $node (@$neededmacs) {
my $count=0;
my $nicdata = $tablecfg->{vm}->{$node}->[0]->{nic};
unless ($nicdata) { $nicdata = "" }
my @nicsneeded = split /,/,$nicdata;
my $count = scalar(@nicsneeded);
my $macdata = $tablecfg->{mac}->{$node}->[0]->{mac};
unless ($macdata) { $macdata ="" }
my @macs;
my $macaddr;
foreach $macaddr (split /\|/,$macdata) {
$macaddr =~ s/\!.*//;
push @macs,lc($macaddr);
}
$count-=scalar(@macs);
if ($count > 0) {
$updatesneeded->{$node}=1;
}
while ($count > 0) { #still need more, autogen
$macaddr = "";
while (not $macaddr) {
$macaddr = lc(genMac($node,$tablecfg->{site}->{genmacprefix}));
push @allmacs,$macaddr;
if ($tablecfg->{usedmacs}->{$macaddr}) {
$macaddr = "";
}
}
$count--;
$tablecfg->{usedmacs}->{$macaddr} = 1;
if (not $macdata) {
$macdata = $macaddr;
} else {
$macdata .= "|".$macaddr;
}
push @macs,$macaddr;
}
if (defined $updatesneeded->{$node}) {
$updatesneeded->{$node}->{mac}=$macdata;
$tablecfg->{dhcpneeded}->{$node}=1; #at our leisure, this dhcp binding should be updated
}
#TODO: LOCK if a distributed lock management structure goes in place, that may be a faster solution than this
#this code should be safe though as it is, if a tiny bit slower
#can also be sped up by doing it for a noderange in a sweep instead of once per node
#but the current architecture has this called at a place that is unaware of the larger context
#TODO2.4 would be either the lock management or changing this to make large scale mkvm faster
}
if (defined $updatesneeded) {
my $mactab = xCAT::Table->new('mac',-create=>1);
$mactab->setNodesAttribs($updatesneeded);
if(macsAreUnique($tablecfg,@allmacs)) {
$complete=1;
} else { #Throw away ALL macs and try again
#this currently includes manually specified ones
foreach $node (keys %$updatesneeded) {
$tablecfg->{mac}->{$node}->[0]->{mac}="";
}
$tablecfg->{usedmacs} = {};
}
}
}
# $cfghash->{usedmacs}-{lc{$mac}};
}
sub getMacAddresses {
my $tablecfg = shift;
my $node = shift;