merge code from branch 2.8
This commit is contained in:
		| @@ -500,6 +500,7 @@ sub setCFMPkglistFile { | ||||
|     Arguments: | ||||
|       $imagename - the specified linuximage name | ||||
|       @curospkgs - the currently selected OS packages list | ||||
|       $mode      - using Fuzzy Matching or Exact Matching to check packages | ||||
|     Returns: | ||||
|       0 - update successfully | ||||
|       1 - update failed | ||||
| @@ -509,13 +510,22 @@ sub setCFMPkglistFile { | ||||
|       none | ||||
|     Example: | ||||
|       my $ret = CAT::CFMUtils->updateCFMPkglistFile($imagename, @cur_selected_pkgs); | ||||
|       my $ret = CAT::CFMUtils->updateCFMPkglistFile($imagename, @cur_selected_pkgs, 1); | ||||
|  | ||||
| =cut | ||||
|  | ||||
| #----------------------------------------------------------------------------- | ||||
| sub updateCFMPkglistFile { | ||||
|     my ($class, $img, $ospkgs) = @_; | ||||
|       | ||||
|     my ($class, $img, $ospkgs, $mode) = @_; | ||||
|      | ||||
|     if(defined($mode)){ | ||||
|         # Exact Matching | ||||
|         $mode = 1; | ||||
|     }else { | ||||
|         # Fuzzy Matching | ||||
|         $mode = 0; | ||||
|     } | ||||
|      | ||||
|     my @cur_selected = @$ospkgs; | ||||
|     my $cfmpkglist = "/install/osimages/$img/pkglist.cfm"; | ||||
|  | ||||
| @@ -549,6 +559,14 @@ sub updateCFMPkglistFile { | ||||
|         my @selected = @$selected_ref; | ||||
|         @basepkgs = xCAT::CFMUtils->arrayops("U", \@basepkgs, \@selected); | ||||
|     } | ||||
|      | ||||
|     # Fuzzy Matching | ||||
|     if (not $mode){ | ||||
|         my ($ref1, $ref2, $ref3) = xCAT::CFMUtils->updateSelectedPkgs(\@pre_selected, \@pre_removed, \@cur_selected); | ||||
|         @pre_selected = @$ref1; | ||||
|         @pre_removed = @$ref2; | ||||
|         @cur_selected = @$ref3; | ||||
|     } | ||||
|  | ||||
|     # get diff between previous and current selected OS packages lists     | ||||
|     my @diff = xCAT::CFMUtils->getPkgsDiff(\@pre_selected, \@cur_selected); | ||||
| @@ -661,6 +679,48 @@ sub getPreOSpkgsList { | ||||
|     return (\@selected, \@removed); | ||||
| } | ||||
|  | ||||
| #----------------------------------------------------------------------------- | ||||
|  | ||||
| =head3 getPreBaseOSpkgsList | ||||
|     Get previously selected and removed base OS packages lists from pkglist file. Packages named with "example.xxx" should be the base name "example" | ||||
|  | ||||
|     Arguments: | ||||
|       $ospkglist - the path for ospkglist file | ||||
|     Returns: | ||||
|       refs for selected and removed OS packages arrays | ||||
|     Globals: | ||||
|       none | ||||
|     Error: | ||||
|       none | ||||
|     Example: | ||||
|       my $pre_selected_ref = xCAT::CFMUtils->getPreOSpkgsList($ospkglist); | ||||
|  | ||||
| =cut | ||||
|  | ||||
| #----------------------------------------------------------------------------- | ||||
| sub getPreBaseOSpkgsList { | ||||
|     my ($class, $pkglist) = @_; | ||||
|      | ||||
|     my ($pre_selected_ref, $pre_removed_ref) = xCAT::CFMUtils->getPreOSpkgsList($pkglist);  | ||||
|      | ||||
|     my %pre_selected_hash = (); | ||||
|     foreach (@$pre_selected_ref) { | ||||
|         my @names = split(/\./, $_); | ||||
|         my $basename = $names[0]; | ||||
|          | ||||
|         if ($_ =~ /^$basename\.([^\.]+)$/) { | ||||
|             $pre_selected_hash{$basename} = 1; | ||||
|         }else { | ||||
|             $pre_selected_hash{$_} = 1; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     @pre_selected = keys %pre_selected_hash; | ||||
|  | ||||
|     return \@pre_selected; | ||||
| } | ||||
|  | ||||
|  | ||||
| #----------------------------------------------------------------------------- | ||||
|  | ||||
| =head3 getPkgsDiff | ||||
| @@ -819,3 +879,66 @@ sub arrayops { | ||||
|  | ||||
|     #return (\@union, \@intersection, \@difference); | ||||
| } | ||||
|  | ||||
|  | ||||
| #----------------------------------------------------------------------------- | ||||
|  | ||||
| =head3 updateSelectedPkgs | ||||
|     Update previous selected, previous removed and current selected packages based on fuzzy matching rules. Packages named with "example.i686" should be same with package "example" | ||||
|  | ||||
|     Arguments: | ||||
|       \@pre_selected - reference to previous selected packages | ||||
|       \@pre_removed - reference to previous removed packages | ||||
|       \@cur_selected - reference to current selected packages | ||||
|     Returns: | ||||
|       new previous selected, previous removed, current selected packages | ||||
|     Globals: | ||||
|       none | ||||
|     Error: | ||||
|       none | ||||
|     Example: | ||||
|       my ($ref1, $ref2, $ref3) = xCAT::CFMUtils->arrayops(\@pre_selected, \@pre_removed, \@cur_selected); | ||||
|  | ||||
| =cut | ||||
|  | ||||
| #----------------------------------------------------------------------------- | ||||
| sub updateSelectedPkgs() { | ||||
|     my ($class, $pre_selected_ref, $pre_removed_ref, $cur_selected_ref) = @_;  | ||||
|      | ||||
|     my %pre_selected_hash = map{$_ => 1} @$pre_selected_ref; | ||||
|     my %pre_removed_hash = map{$_ => 1} @$pre_removed_ref; | ||||
|     my %cur_selected_hash = map{$_ => 1} @$cur_selected_ref; | ||||
|      | ||||
|     my %new_pre_selected_hash = %pre_selected_hash; | ||||
|     my %new_pre_removed_hash = %pre_removed_hash; | ||||
|     my %new_cur_selected_hash = %cur_selected_hash; | ||||
|      | ||||
|     foreach (keys %cur_selected_hash) { | ||||
|         my $father = $_; | ||||
|         my $flag = 0; | ||||
|         foreach (keys %pre_selected_hash) { | ||||
|             my $child = $_; | ||||
|             if ($child =~ /^$father\.([^\.]+)$/) { | ||||
|                 $new_cur_selected_hash{$child} = 1; | ||||
|                 $flag = 1; | ||||
|             } | ||||
|         } | ||||
|         if ($flag and not exists $pre_selected_hash{$father}){ | ||||
|             delete $new_cur_selected_hash{$father} if exists $new_cur_selected_hash{$father}; | ||||
|         } | ||||
|          | ||||
|         foreach (keys %pre_removed_hash) { | ||||
|             my $child = $_; | ||||
|             if ($child =~ /^$father\.([^\.]+)$/) { | ||||
|                 delete $new_pre_removed_hash{$child} if exists $new_pre_removed_hash{$child}; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     my @new_cur_selected = keys %new_cur_selected_hash; | ||||
|     my @new_pre_selected = keys %new_pre_selected_hash; | ||||
|     my @new_pre_removed = keys %new_pre_removed_hash; | ||||
|      | ||||
|      | ||||
|     return (\@new_pre_selected, \@new_pre_removed, \@new_cur_selected);   | ||||
| } | ||||
|   | ||||
| @@ -771,10 +771,30 @@ Usage: | ||||
|     } | ||||
|  | ||||
|     # If network profile specified. Need re-generate IPs for all nodess again. | ||||
|      # As new design, ignore BMC/FSP NIC while reinstall nodes | ||||
|     if(exists $args_dict{'networkprofile'}){ | ||||
|         my $newNetProfileName = $args_dict{'networkprofile'}; | ||||
|         my $oldNetProfileName = $nodeoldprofiles{'networkprofile'}; | ||||
|          | ||||
|         my $newNicsRef = xCAT::ProfiledNodeUtils->get_nodes_nic_attrs([$newNetProfileName])->{$newNetProfileName}; | ||||
|         my $oldNicsRef = xCAT::ProfiledNodeUtils->get_nodes_nic_attrs([$oldNetProfileName])->{$oldNetProfileName}; | ||||
|          | ||||
|         my %updateNicsHash = (); | ||||
|         foreach my $newNic (keys %$newNicsRef) { | ||||
|             if ($newNicsRef->{$newNic}->{'type'} ne 'BMC' and $newNicsRef->{$newNic}->{'type'} ne 'FSP'){ | ||||
|                 $updateNicsHash{$newNic} = 1; | ||||
|             } | ||||
|         } | ||||
|         foreach my $oldNic (keys %$oldNicsRef) { | ||||
|             if ($oldNicsRef->{$oldNic}->{'type'} ne 'BMC' and $oldNicsRef->{$oldNic}->{'type'} ne 'FSP'){ | ||||
|                 $updateNicsHash{$oldNic} = 1; | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         my $updateNics = join(",", keys %updateNicsHash); | ||||
|         setrsp_progress("Regenerate IP addresses for nodes..."); | ||||
|         $retref = ""; | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["noderegenips"], node=>$nodes, sequential=>[1]}, $request_command, 0, 2); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["noderegenips"], node=>$nodes, arg=>["nics=$updateNics"], sequential=>[1]}, $request_command, 0, 2); | ||||
|         $retstrref = parse_runxcmd_ret($retref); | ||||
|         if ($::RUNCMD_RC != 0){ | ||||
|             setrsp_progress("Warning: failed to generate IPs for nodes."); | ||||
| @@ -843,6 +863,7 @@ Usage: | ||||
|     $netProfileNicsRef = xCAT::ProfiledNodeUtils->get_nodes_nic_attrs([$netProfileName]); | ||||
|     my $nicsref = $netProfileNicsRef->{$netProfileName}; | ||||
|     my @nicslist = keys %$nicsref; | ||||
|      | ||||
|     #3. validate specified nics  | ||||
|     if(exists $args_dict{'nics'}){ | ||||
|         @updateNics = split(",", $args_dict{'nics'}); | ||||
| @@ -910,7 +931,9 @@ Usage: | ||||
|             unless (grep {$_ eq $nicname} @updateNics){ | ||||
|                 # if the nic not specified, just keep the old IP&NIC record in nics table. | ||||
|                 my $oldip = $nodesNicsRef->{$node}->{$nicname}->{"ip"}; | ||||
|                 $nicipsAttr{$node}{nicips} .= $nicname."!".$oldip.","; | ||||
|                 if ($oldip) { | ||||
|                     $nicipsAttr{$node}{nicips} .= $nicname."!".$oldip.","; | ||||
|                 } | ||||
|             }else{ | ||||
|                 my $ipsref = $freeIPsHash{$nicname}; | ||||
|                 my $nextip = shift @$ipsref; | ||||
| @@ -932,7 +955,7 @@ Usage: | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|      | ||||
|     #8. Update database. | ||||
|     setrsp_progress("Updating database records..."); | ||||
|     my $nicstab = xCAT::Table->new('nics',-create=>1); | ||||
| @@ -2120,6 +2143,7 @@ sub validate_node_entry{ | ||||
|                 $errmsg .= "MAC address $node_entry{$_} is invalid. You must use a valid MAC address.\n"; | ||||
|             }else{ | ||||
|                 $allmacs{$node_entry{$_}} = 0; | ||||
|                 $allmacsupper{uc($node_entry{$_})} = 0; | ||||
|             } | ||||
|         }elsif ($_ eq "ip"){ | ||||
|             if (exists $allips{$node_entry{$_}}){ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user