Resolve 2 issues: 1- restrict numric part length in hostname format; 2- resolve db not update timely after calling nodeaddunmgd

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@14358 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
leiaibj 2012-11-19 08:56:16 +00:00
parent ab3a2ea0bb
commit 5ed353a3ae
2 changed files with 60 additions and 18 deletions

View File

@ -70,6 +70,7 @@ sub get_allocable_staticips_innet
Description : Generate numric hostnames using numric template name.
Arguments : $format - The hostname format string..
$rank - The start number.
$amount - The total hostname number to be generated.
Returns : numric hostname list
Example :
calling genhosts_with_numric_tmpl("compute#NNnode") will return a list like:
@ -79,10 +80,10 @@ sub get_allocable_staticips_innet
#-------------------------------------------------------------------------------
sub genhosts_with_numric_tmpl
{
my ($class, $format, $rank) = @_;
my ($class, $format, $rank, $amount) = @_;
my ($prefix, $appendix, $len) = xCAT::ProfiledNodeUtils->split_hostname($format, 'N');
return xCAT::ProfiledNodeUtils->gen_numric_hostnames($prefix, $appendix, $len, $rank);
return xCAT::ProfiledNodeUtils->gen_numric_hostnames($prefix, $appendix, $len, $rank, $amount);
}
#-------------------------------------------------------------------------------
@ -133,6 +134,8 @@ sub split_hostname
Arguments : $prefix - The prefix string of the hostname.
$appendix - The appendix string of the hostname.
$len - the numric number length in hostname.
$rank - the start number for numric part
$amount - the amount of hostnames to be generated.
Returns : numric hostname list
Example :
calling gen_numric_hostnames("compute", "node",2) will return a list like:
@ -142,7 +145,7 @@ sub split_hostname
#-------------------------------------------------------------------------------
sub gen_numric_hostnames
{
my ($class, $prefix, $appendix, $len, $rank) = @_;
my ($class, $prefix, $appendix, $len, $rank, $amount) = @_;
my @hostnames;
my $cnt = 0;
@ -155,6 +158,9 @@ sub gen_numric_hostnames
my $fullnum = $maxnum + $cnt;
my $hostname = $prefix.(substr $fullnum, 1).$appendix;
push (@hostnames, $hostname);
if ($amount && (@hostnames == $amount)){
last;
}
$cnt++;
}
return \@hostnames;
@ -177,13 +183,25 @@ sub gen_numric_hostnames
sub get_hostname_format_type{
my ($class, $format) = @_;
my $type;
my ($prefix, $appendix, $rlen, $nlen);
my $ridx = index $format, "#R";
my $nidx = index $format, "#N";
if ($ridx >= 0){
$type = "rack";
($prefix, $appendix, $rlen) = xCAT::ProfiledNodeUtils->split_hostname($format, 'R');
($prefix, $appendix, $nlen) = xCAT::ProfiledNodeUtils->split_hostname($format, 'N');
if ($rlen >= 10 || $nlen >= 10){
$type = "unknown";
} else{
$type = "rack";
}
} elsif ($nidx >= 0){
$type = "numric";
($prefix, $appendix, $nlen) = xCAT::ProfiledNodeUtils->split_hostname($format, 'N');
if ($nlen >= 10){
$type = "unknown";
} else{
$type = "numric";
}
} else{
$type = "unknown";
}

View File

@ -608,15 +608,20 @@ Usage:
return;
}
# run nodeadd to create node records.
my $retref = xCAT::Utils->runxcmd({command=>["nodeadd"], arg=>[$args_dict{"hostname"}, "groups=__Unmanaged", "hosts.ip=$args_dict{'ip'}"]}, $request_command, 0, 2);
my %updatenodeshash = ();
$updatenodeshash{$args_dict{'hostname'}}{'ip'} = $args_dict{'ip'};
my $hoststab = xCAT::Table->new('hosts',-create=>1);
$hoststab->setNodesAttribs(\%updatenodeshash);
$hoststab->close();
%updatenodeshash = ();
$updatenodeshash{$args_dict{'hostname'}}{'groups'} = "__Unmanaged";
my $nodetab = xCAT::Table->new('nodelist',-create=>1);
$nodetab->setNodesAttribs(\%updatenodeshash);
$nodetab->close();
my $retref = xCAT::Utils->runxcmd({command=>["makehosts"], node=>[$args_dict{"hostname"}]}, $request_command, 0, 2);
my $retstrref = parse_runxcmd_ret($retref);
if ($::RUNCMD_RC != 0){
setrsp_errormsg("Failed to call nodeadd to create node.");
return;
}
$retref = xCAT::Utils->runxcmd({command=>["makehosts"], node=>[$args_dict{"hostname"}]}, $request_command, 0, 2);
$retstrref = parse_runxcmd_ret($retref);
if ($::RUNCMD_RC != 0){
setrsp_progress("Warning: failed to call makehosts.");
}
@ -1330,6 +1335,11 @@ sub parse_hosts_string{
}
}
# Verify each node entry.
my $rank = 0;
if (exists($args_dict{'rank'})){
$rank = $args_dict{'rank'};
}
foreach (keys %::FILEATTRS){
my $errmsg = validate_node_entry($_, $::FILEATTRS{$_});
if ($errmsg) {
@ -1359,16 +1369,30 @@ sub parse_hosts_string{
}
# Generate hostnames based on numric hostname format.
my $hostnamelistref;
if (! exists $freehostnames{$numricformat}){
my $rank = 0;
if (exists($args_dict{'rank'})){
$rank = $args_dict{'rank'};
$hostnamelistref = xCAT::ProfiledNodeUtils->genhosts_with_numric_tmpl($numricformat, $rank, 10000);
$rank = $rank + 10000;
if (! @$hostnamelistref){
push @invalid_records, ["__hostname__", "Can not generate sufficient hostnames from hostname format."];
last;
}else{
$freehostnames{$numricformat} = $hostnamelistref;
}
$freehostnames{$numricformat} = xCAT::ProfiledNodeUtils->genhosts_with_numric_tmpl($numricformat, $rank);
}
my $hostnamelistref = $freehostnames{$numricformat};
$hostnamelistref = $freehostnames{$numricformat};
my $nexthostname = shift @$hostnamelistref;
while (exists $allhostnames{$nexthostname}){
if (! @$hostnamelistref){
$hostnamelistref = xCAT::ProfiledNodeUtils->genhosts_with_numric_tmpl($numricformat, $rank, 10000);
$rank = $rank + 10000;
if(! @$hostnamelistref){
push @invalid_records, ["__hostname__", "Can not generate sufficient hostnames from hostname format."];
last;
}
}
$nexthostname = shift @$hostnamelistref;
}
$hostinfo_dict{$nexthostname} = $::FILEATTRS{$_};