mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-31 03:12:30 +00:00 
			
		
		
		
	System p Discovery Enhancements: add the definition of redundant fsp/bpas.
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@9610 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		| @@ -35,6 +35,9 @@ my $SUB_REQ; | ||||
| my $DELETENODES; | ||||
| my %NUMCECSINFRAME; | ||||
| #my $DHCPINTERFACES; | ||||
| my $PANUMBER = 0; | ||||
| my $CECNUMBER = 0; | ||||
| my @CECS; | ||||
|  | ||||
| sub handled_commands { | ||||
|     return( { xcatsetup => "setup" } ); | ||||
| @@ -192,12 +195,36 @@ sub writedb { | ||||
| 		unless (writeframe($framerange, $cwd)) { closetables(); return; } | ||||
| 	} | ||||
| 	 | ||||
|     # Write bpa info (hash key=xcat-bpas) | ||||
|     my $bpaa0 = $STANZAS{'xcat-frames'}->{'bpa-a-0-starting-ip'}; | ||||
|     my $bpab0 = $STANZAS{'xcat-frames'}->{'bpa-b-0-starting-ip'}; | ||||
|     my $bpaa1 = $STANZAS{'xcat-frames'}->{'bpa-a-1-starting-ip'}; | ||||
|     my $bpab1 = $STANZAS{'xcat-frames'}->{'bpa-b-1-starting-ip'}; | ||||
|     if ( $bpaa0 and $bpaa1 and $bpab0 and $bpab1 and (!scalar(keys(%$sections))||$$sections{'xcat-frames'})) { | ||||
|         unless (writechildren($bpaa0, $bpaa1, $bpab0, $bpab1, "bpa")) { closetables(); return; } | ||||
|     } | ||||
|     if ( !($bpaa0 and $bpaa1 and $bpab0 and $bpab1) and | ||||
|         ($bpaa0 or $bpaa1 or $bpab0 or $bpab1))  { | ||||
|         # need to do something here? | ||||
|     } | ||||
| 	# Write CEC info (hash key=xcat-cecs) | ||||
| 	my $cecrange = $STANZAS{'xcat-cecs'}->{'hostname-range'}; | ||||
| 	if ($cecrange && (!scalar(keys(%$sections))||$$sections{'xcat-cecs'})) {  | ||||
| 		unless (writecec($cecrange, $cwd)) { closetables(); return; } | ||||
| 	} | ||||
| 	 | ||||
|     # Write fsp info (hash key=xcat-fsps) | ||||
|     my $fspa0 = $STANZAS{'xcat-cecs'}->{'fsp-a-0-starting-ip'}; | ||||
|     my $fspb0 = $STANZAS{'xcat-cecs'}->{'fsp-b-0-starting-ip'}; | ||||
|     my $fspa1 = $STANZAS{'xcat-cecs'}->{'fsp-a-1-starting-ip'}; | ||||
|     my $fspb1 = $STANZAS{'xcat-cecs'}->{'fsp-b-1-starting-ip'}; | ||||
|     if ( $fspa0 and $fspa1 and $fspb0 and $fspb1 and (!scalar(keys(%$sections))||$$sections{'xcat-cecs'})) { | ||||
|         unless (writechildren($fspa0, $fspa1, $fspb0, $fspb1, "fsp")) { closetables(); return; } | ||||
|     } | ||||
|     if ( !($fspa0 and $fspa1 and $fspb0 and $fspb1) and | ||||
|         ($fspa0 or $fspa1 or $fspb0 or $fspb1))  { | ||||
|         # need to do something here? | ||||
|     } | ||||
| 	# Save the CEC positions for all the node definitions later | ||||
| 	if ($cecrange) { | ||||
| 		$CECPOSITIONS = $tables{'nodepos'}->getNodesAttribs([noderange($cecrange)], ['rack','u']); | ||||
| @@ -356,6 +383,7 @@ sub writeframe { | ||||
| 	my ($framerange, $cwd) = @_; | ||||
| 	my $nodes = [noderange($framerange, 0)]; | ||||
| 	if (!scalar(@$nodes)) { return 1; } | ||||
|     $PANUMBER = scalar(@$nodes); | ||||
| 	if ($DELETENODES) { | ||||
| 		deletenodes('frames', $framerange); | ||||
| 		deletegroup('frame'); | ||||
| @@ -367,14 +395,14 @@ sub writeframe { | ||||
| 	 | ||||
| 	# Using the frame group, write starting-ip in hosts table | ||||
|     my $framehash = parsenoderange($framerange); | ||||
| 	my $framestartip = $STANZAS{'xcat-frames'}->{'starting-ip'}; | ||||
| 	if ($framestartip && isIP($framestartip)) { | ||||
|         my $framestartnum = int $$framehash{'primary-start'}; | ||||
| 		my ($ipbase, $ipstart) = $framestartip =~/^(\d+\.\d+\.\d+)\.(\d+)$/; | ||||
| 		# take the number from the nodename, and as it increases, increase the ip addr | ||||
|         my $regex = '|\S+?(\d+)\D*$|' . "$ipbase.($ipstart+" . '$1' . "-$framestartnum)|"; | ||||
| 		$tables{'hosts'}->setNodeAttribs('frame', {ip => $regex}); | ||||
| 	} | ||||
|         #my $framestartip = $STANZAS{'xcat-frames'}->{'starting-ip'}; | ||||
|         #if ($framestartip && isIP($framestartip)) { | ||||
|         #my $framestartnum = int $$framehash{'primary-start'}; | ||||
|         #my ($ipbase, $ipstart) = $framestartip =~/^(\d+\.\d+\.\d+)\.(\d+)$/; | ||||
|         ## take the number from the nodename, and as it increases, increase the ip addr | ||||
|         #my $regex = '|\S+?(\d+)\D*$|' . "$ipbase.($ipstart+" . '$1' . "-$framestartnum)|"; | ||||
|         #       $tables{'hosts'}->setNodeAttribs('frame', {ip => $regex}); | ||||
|         #} | ||||
| 	 | ||||
| 	# Using the frame group, write: nodetype.nodetype, nodehm.mgt | ||||
| 	$tables{'ppc'}->setNodeAttribs('frame', {nodetype => 'frame'}); | ||||
| @@ -420,6 +448,108 @@ sub writeframe { | ||||
| 	return 1; | ||||
| } | ||||
|  | ||||
| sub writechildren { | ||||
|  | ||||
|     my $a0startingip = shift; | ||||
|     my $a1startingip = shift; | ||||
|     my $b0startingip = shift; | ||||
|     my $b1startingip = shift; | ||||
|     my $ntype        = shift; | ||||
|  | ||||
|     my @startingips; | ||||
|     push @startingips, $a0startingip; | ||||
|     push @startingips, $a1startingip; | ||||
|     push @startingips, $b0startingip; | ||||
|     push @startingips, $b1startingip; | ||||
|  | ||||
|     my @all; | ||||
|     for my $cip (@startingips) { | ||||
|         my ($ipbase, $ipstart) = $cip =~/^(\d+\.\d+\.\d+)\.(\d+)$/; | ||||
|         my $endip = $ipstart + $PANUMBER; | ||||
|         my $endnode = $ipbase . '.' . $endip; | ||||
|         my $range = $cip . '-' . $endnode; | ||||
|         my $nodes = [noderange($range, 0)]; | ||||
|         foreach (@$nodes) { push @all, $_; } | ||||
|     } | ||||
|     if ($DELETENODES) { | ||||
|             deletenodes($ntype, \@all); | ||||
|             deletegroup($ntype); | ||||
|             return 1; | ||||
|     } | ||||
|  | ||||
|     # write bpa/fsp nodes to database with nodelist.node, nodelist.groups | ||||
|  | ||||
|     infomsg("Defining $ntype"."s..."); | ||||
|     $tables{'nodelist'}->setNodesAttribs(\@all, { groups => "$ntype,all" }); | ||||
|     staticGroup($ntype); | ||||
|  | ||||
|  | ||||
|     # Using the bpa group, write: ppc.nodetype, nodetype.nodetype, | ||||
|     $tables{'ppc'}->setNodeAttribs($ntype, {nodetype => $ntype}); | ||||
|     $tables{'nodetype'}->setNodeAttribs($ntype, {nodetype => $ntype}); | ||||
|  | ||||
|     # Using the bpa group, write regex for: nodehm.mgt, ppc.node, ppc.hcp | ||||
|     my %hash ; | ||||
|     if ($STANZAS{'xcat-site'}->{'use-direct-fsp-control'}) { | ||||
|             $tables{'nodehm'}->setNodeAttribs($ntype, {mgt => $ntype}); | ||||
|             my $hcpregex = '|(.+)|($1)|';           # its managed by itself | ||||
|             $hash{hcp} = $hcpregex; | ||||
|     } | ||||
|     else { | ||||
|             $tables{'nodehm'}->setNodeAttribs($ntype, {mgt => 'hmc'}); | ||||
|     } | ||||
|     $tables{'ppc'}->setNodeAttribs($ntype, \%hash); | ||||
|  | ||||
|     # Using the bpa group, write regex for:ppc.parent | ||||
|     # Can we assume the user define four fsp/bpas with the same starting ip(the last byte)? need to discuss! | ||||
|     #for my $pip (@startingips) { | ||||
|     my ($ipbase, $ipstart) = $a0startingip =~ /^(\d+\.\d+\.\d+)\.(\d+)$/; | ||||
|     my $phash; | ||||
|     if ($ntype eq "bpa") {  | ||||
|         $phash = parsenoderange($STANZAS{'xcat-frames'}->{'hostname-range'}); | ||||
|     } else { | ||||
|         $phash = parsenoderange($STANZAS{'xcat-cecs'}->{'hostname-range'}); | ||||
|     }             | ||||
| 	my $fs = $$phash{'primary-start'}; | ||||
|     my $nb = $$phash{'primary-base'}; | ||||
|     my $nameend = $$phash{'attach'}; | ||||
|     my $namesecond = $$phash{'secondary-base'}; | ||||
|     my $pregex; | ||||
|     my $tlength = length($fs); | ||||
|     if ($ntype eq "bpa") { | ||||
|         $pregex = '|^(\d+\.\d+\.\d+)\.(\d+)$|'.$nb.'(\'0\'*('.$tlength.'-length($2)))('.int($fs).'+$2-'.$ipstart.')'.$nameend.'|'; | ||||
|         $tables{'ppc'}->setNodeAttribs($ntype, {parent => $pregex});   | ||||
|     } elsif (!($STANZAS{'xcat-cecs'}->{'supernode-list'}))  { | ||||
|         my $ss = $$phash{'secondary-start'}; | ||||
|         my $se = $$phash{'secondary-end'}; | ||||
|         my $cm; | ||||
|         my $clength; | ||||
|         if($ss and $se) { | ||||
|             $cm = int($se) - int($ss); | ||||
|             $clength = length($ss); | ||||
|         } | ||||
|         my $fn = '('.int($fs).'-1+($2-'.$ipstart.'+1)/'.$cm.')'; | ||||
|         my $cn = '('.int($ss).'-1+($2-'.$ipstart.'+1)%'.$cm.')'; | ||||
|         $pregex = '|^(\d+\.\d+\.\d+)\.(\d+)$|'.$nb.'(\'0\'*('.$tlength.'-length'.$fn.'))'.$fn.$namesecond.'(\'0\'*('.$clength.'-length'.$cn.'))'.$cn.$nameend.'|'; | ||||
|         $tables{'ppc'}->setNodeAttribs($ntype, {parent => $pregex});   | ||||
|     }  | ||||
|           | ||||
|     if ($ntype eq "fsp" and $STANZAS{'xcat-cecs'}->{'supernode-list'} and @CECS) { | ||||
|         my @cecparent = sort(@CECS); | ||||
|         my %parenthash;           | ||||
|         for my $cip (@startingips) { | ||||
|             my ($ipbase, $ipstart) = $cip =~/^(\d+\.\d+\.\d+\.)(\d+)$/;           | ||||
|             my $i = 0;                  | ||||
|             foreach my $ch (@cecparent) {$parenthash{$ipbase.($i+$ipstart)}->{parent} = $ch; $i++;} | ||||
|         }  | ||||
|         $tables{'ppc'}->setNodesAttribs(\%parenthash);                | ||||
|     }   | ||||
|  | ||||
|     #} | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
|  | ||||
| sub readwritevpd { | ||||
| 	my $filename = shift; | ||||
| 	if (!defined($filename)) { return; } | ||||
| @@ -446,6 +576,7 @@ sub writecec { | ||||
| 		return 0; | ||||
| 	} | ||||
| 	if (!scalar(@$nodes)) { return 1; } | ||||
|     $PANUMBER = scalar(@$nodes); | ||||
| 	if ($DELETENODES) { | ||||
| 		deletenodes('CECs', $cecrange); | ||||
| 		deletegroup('cec'); | ||||
| @@ -479,7 +610,7 @@ sub writecec { | ||||
| 			# Math for 3rd field:  (ip4th-1+cecnum-cecstartnum)/254 + ip3rd | ||||
|             $regex = '|\S+?(\d+)$\D*|' . "$ipbase.((${ip4th}-1+" . '$1' . "-$cecstartnum)/254+$ip3rd).((${ip4th}-1+" . '$1' . "-$cecstartnum)%254+1)|"; | ||||
| 		} | ||||
| 		$tables{'hosts'}->setNodeAttribs('cec', {ip => $regex}); | ||||
|         #$tables{'hosts'}->setNodeAttribs('cec', {ip => $regex}); | ||||
| 	} | ||||
| 	 | ||||
| 	# Using the cec group, write: nodetype.nodetype | ||||
| @@ -593,6 +724,7 @@ sub writecec { | ||||
| 		$tables{'nodelist'}->setNodesAttribs(\%nodehash); | ||||
| 		$tables{'nodepos'}->setNodesAttribs(\%nodeposhash); | ||||
| 	} | ||||
|     foreach (keys %nodehash) { push @CECS,$_; } | ||||
| 	return 1; | ||||
| } | ||||
|  | ||||
| @@ -950,8 +1082,8 @@ sub writeMnRouteNames { | ||||
| 			my $routename = "mnto$sn$nic"; | ||||
| 			$routehash{mask} = $nicmasks{$nic}; | ||||
| 			# and together $nicip with $nicmasks{$nic} to get the $routehash{net} | ||||
| 			my $mask = xCAT::NetworkUtils::getipaddr($nicmasks{$nic}, GetNumber=>1); | ||||
| 			my $ip = xCAT::NetworkUtils::getipaddr($nicip, GetNumber=>1); | ||||
|             my $mask = xCAT::NetworkUtils::getipaddr($nicmasks{$nic});#, GetNumber=>1); | ||||
|             my $ip = xCAT::NetworkUtils::getipaddr($nicip);#, GetNumber=>1); | ||||
| 			my $subnet = $ip & $mask; | ||||
| 			$subnet = inet_ntoa(pack('N',$subnet)); | ||||
| 			$routehash{net} = $subnet; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user